앞 글에서 eBPF로 malloc을 추적하는 방법을 봤다.
코드를 바꾸지 않고도:
- 어떤 함수에서 malloc이 호출되는지 보고
- 얼마나 할당되는지 보고
- 흐름까지 따라갈 수 있다
여기까지 보면 한 번쯤 이런 생각이 든다.
“이거 커널에서 코드 실행하는 거잖아… 위험한 거 아닌가?”
맞는 질문이다.
그리고 이걸 제대로 이해해야 eBPF를 안심하고 쓸 수 있다.
eBPF가 위험해 보이는 이유
eBPF를 처음 보면 불안한 이유는 단순하다.
- 커널에서 실행됨
- 동적으로 로드됨
- 외부에서 코드 주입 가능
이걸 그대로 받아들이면 거의 이런 느낌이다.
“커널에 코드 꽂아 넣는 거 아냐?”
그런데 실제로는 그렇게 동작하지 않는다.
eBPF는 커널을 “수정”하지 않는다
이건 중요한 포인트다.
eBPF는 커널 코드를 바꾸지 않는다
대신 이렇게 한다.
커널 이벤트 발생
↓
hook
↓
eBPF 코드 실행
즉,
정해진 지점에서, 잠깐 끼어들어 실행되는 구조다
이 차이가 크다.
- 커널 수정 ❌
- 커널 확장 ⭕
핵심: verifier가 모든 걸 막는다
eBPF가 안전한 이유는 사실 하나로 정리된다.
verifier
커널은 eBPF 프로그램을 실행하기 전에
무조건 검사를 한다.
이게 그냥 간단한 체크가 아니다.
verifier가 보는 것
- 메모리 접근 안전한지
- 포인터 이상한 데 안 가는지
- 무한 루프 없는지
- 허용된 함수만 쓰는지
👉 통과 못 하면?
그냥 실행 자체가 안 된다
즉,
위험한 코드는 아예 커널에 들어가지 못한다
그래서 가능한 것과 불가능한 것이 나뉜다
가능한 것
- 함수 호출 관찰
- 데이터 수집
- 통계 집계
- 네트워크 처리
불가능한 것
- 임의 메모리 덮어쓰기
- 커널 구조 변경
- 무한 루프
- 시스템 망가뜨리기
👉 핵심은 이거다.
읽고 관찰하는 건 강하지만, 마음대로 바꾸는 건 못 한다
그런데 “완전히 안전하다”는 건 아니다
여기서 중요한 포인트가 하나 더 있다.
안전하게 설계되어 있지만, 완벽하진 않다
실제로 문제가 되는 경우
1. verifier 버그
verifier가 완벽하면 좋겠지만,
결국 소프트웨어라 버그가 있을 수 있다.
이게 뚫리면:
- 잘못된 메모리 접근
- 커널 권한 상승
같은 문제가 가능해진다.
👉 그래서 eBPF 취약점 얘기가 나온다.
2. 성능 문제
이건 꽤 현실적인 문제다.
eBPF 프로그램이 너무 무겁거나
너무 자주 실행되면:
- CPU 사용 증가
- latency 증가
👉 즉,
성능 DoS는 가능하다
3. 정보 수집 (관찰 자체가 위험)
eBPF는 강력한 관찰 도구다.
그래서 반대로 생각하면:
- syscall 추적 가능
- 네트워크 흐름 확인 가능
👉 잘못 쓰면
민감 정보 수집 도구가 될 수도 있다
그래서 권한이 중요하다
이걸 보면 결론이 하나 나온다.
아무나 eBPF를 못 쓰게 해야 한다
그래서 기본적으로:
- root 권한 필요
- CAP_BPF 같은 capability 필요
즉,
이미 강한 권한이 있어야 쓸 수 있다
중요한 관점 하나
여기서 많이 헷갈리는 부분이다.
❌ eBPF가 위험하다
✅ 정확한 표현
권한 + 취약점이 있으면 위험해진다
즉,
- eBPF 자체가 문제라기보다
- “강력한 도구”라는 게 핵심이다
비유로 보면
- eBPF = 관리자 콘솔
- 정상 → 시스템 분석 도구
- 악용 → 공격 도구
👉 도구 자체는 중립이다.
정리하면
- eBPF는 커널을 수정하지 않는다
- hook 기반으로 동작한다
- verifier가 안전성을 강제한다
- 하지만 취약점이 있으면 공격 surface가 된다
여기까지 오면 다음 질문이 나온다
이제 자연스럽게 이런 생각이 든다.
“그럼 eBPF 내부 구조는 어떻게 생긴 거지?”
“어떻게 저걸 실행하는 거지?”
한 줄 정리
eBPF는 커널을 직접 수정하는 것이 아니라 제한된 환경에서 코드를 실행하는 구조이며, verifier를 통해 안전하게 동작하지만 잘못 사용되거나 취약점이 존재하면 공격 경로가 될 수 있다.
'프로그래밍공부(Programming Study) > CS-운영체제(OS)' 카테고리의 다른 글
| eBPF hook 종류 (kprobe, tracepoint, uprobe) (0) | 2026.04.09 |
|---|---|
| eBPF는 내부적으로 어떻게 동작할까 (0) | 2026.04.08 |
| eBPF로 메모리를 추적하는 방법 (0) | 2026.04.06 |
| /proc/smaps로 메모리를 제대로 분석하는 방법 (0) | 2026.04.05 |
| free를 했는데 왜 RSS는 줄어들지 않을까 (0) | 2026.04.04 |
댓글