본문 바로가기

Programming

BPF vs eBPF

BPF: seccomp , setsocketopt 등에서 필터프로그램을 전달할때 쓰는 classic 한 ISA.

구조가 매우 단순하고 call 이나 signed, unsigned 비교등이 없고 레지스터 갯수가 작음.


eBPF: BPF 의 ISA 를 확장한 버전. 리눅스 커널 4.13인가부터 들어감. bpf() 라는 시스템콜을 통해서 프로그램을 전달할수있고, eBPF 바이트코드에 대해서는 최신커널이 JIT 도 수행해줌. eBPF 를 인터프리트하던 JIT 으로 네이티브로 돌리던 바이트코드의 안전성 검사를하는 verify 단계가 있는데, 이부분에 취약점이있어서 bypass 한뒤 악성 eBPF 프로그램을 통해 커널 임의 메모리읽기쓰기를 수행해서 루트를 따는 CVE-2017-16995 가 있었음. (https://blog.aquasec.com/ebpf-vulnerability-cve-2017-16995-when-the-doorman-becomes-the-backdoor)


아래의 커널문서에 BPF 와 eBPF 에 관해서 상세히 설명이 잘되어있음.

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/filter.txt




'Programming' 카테고리의 다른 글

system, execl, exeve PATH 차이  (0) 2016.09.09
OSX routing table setup  (0) 2016.08.06
ARM DACR basics  (0) 2016.07.13
Intel SGX basics  (1) 2016.07.12
Mount QEMU qcow image  (0) 2015.12.17