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 |