버클리 패킷필터

Berkeley Packet Filter
버클리 패킷필터
개발자스티븐 맥캔
반 제이콥슨
초기 릴리즈1992년 12월 19일, 29년 전(1992년 12월 19일)
운영 체제Unix 계열(FreeBSD, OpenBSD, NetBSD, DragonFly BSD, macOS, Oracle Solaris 11 이상, AIX, Tru64, Linux, Orbis), Windows

Berkeley Packet Filter(BPF; 버클리 패킷 필터)는 특정 컴퓨터 운영 체제에서 네트워크 트래픽을 분석해야 하는 프로그램용으로 사용되는 기술입니다.데이터 링크 레이어에 원시 인터페이스를 제공하여 원시 링크 레이어 패킷을 송수신할 [1]수 있습니다.게다가 네트워크 인터페이스의 드라이버가 혼합 모드를 서포트하고 있는 경우는, 인터페이스를 그 모드로 할 수 있기 때문에, 네트워크상의 모든 패킷을 수신할 수 있습니다.다른 호스트 앞으로 패킷도 마찬가지입니다.

BPF 는 패킷의 필터링을 서포트하고 있기 때문에, 유저 스페이스의 프로세스에서는, 수신하는 패킷을 지정하는 필터 프로그램을 제공할 수 있습니다.예를 들어 tcpdump 프로세스는 TCP 연결을 시작하는 패킷만 수신할 수 있습니다.BPF는 프로세스가 공급하는 필터를 통과한 패킷만 반환합니다.이것에 의해, operating system의 커널로부터 프로세스에 불필요한 패킷이 카피되는 것을 방지해, 퍼포먼스가 큰폭으로 향상됩니다.필터 프로그램은 커널에서 JIT(Just-In-Time) 메커니즘을 통해 해석되거나 시스템 코드로 컴파일되어 실행되는 가상 시스템에 대한 명령 형식입니다.

BPF 는, 인터페이스 전체가 아니고, 필터링 메카니즘만을 참조하기 위해서 사용되는 경우가 있습니다.Linux 나 Tru64 UNIX 의 일부 시스템에서는 BPF 미가공 인터페이스 이외의 데이터 링크레이어에 미가공 인터페이스를 제공하지만 그 미가공 인터페이스에 BPF 필터링 메커니즘을 사용합니다.BPF 필터링 메커니즘은 대부분의 Unix 계열 운영 체제에서 사용할 수 있습니다.

Linux 커널은 eBPF라고 불리는 확장 버전의 BPF 필터링 메커니즘을 제공합니다. eBPF는 JIT 메커니즘을 사용하며 패킷 필터링 및 커널의 다른 용도로 사용됩니다.eBPF는 Microsoft [2]Windows에서도 사용할 수 있습니다.

원시 데이터 링크 인터페이스

BPF는 네트워크인터페이스에 바인드할 수 있는 의사 디바이스를 제공합니다.디바이스에서 읽으면 네트워크인터페이스로 수신한 패킷이 가득 찬 버퍼가 읽혀지고 디바이스에 쓰이면 네트워크인터페이스에 패킷이 주입됩니다.

2007년에 Robert Watson과 Christian Peron은 FreeB의 BPF 구현에 제로 복사 버퍼 확장을 추가했습니다.SD 운영체제:[3] BPF 디바이스를 통해 수신된 모든 패킷 데이터에 대해 2개의 복사가 필요하지 않도록 디바이스 드라이버 인터럽트 핸들러 내의 커널 패킷캡처를 사용자 프로세스 메모리에 직접 쓸 수 있습니다.사용자 프로세스의 수신 경로에는 1개의 복사본이 남아 있지만 이렇게 하면 서로 다른 BPF 디바이스 사용자의 독립성이 유지되며 완전한 패킷데이터를 [4]복사하지 않고 헤더를 BPF 버퍼로 패킹할 수 있습니다.

필터링

BPF의 필터링 기능은 BPF 가상 시스템, 고정 길이 명령이 있는 32비트 시스템, 어큐뮬레이터인덱스 레지스터의 인터프리터로 구현됩니다.이 언어의 프로그램은 패킷에서 데이터를 가져오고, 패킷에서 데이터에 대한 산술 연산을 수행하며, 결과를 패킷 내의 상수 또는 데이터와 비교하거나 테스트 비트와 비교할 수 있으며, 이러한 테스트 결과에 따라 패킷을 받아들이거나 거부할 수 있습니다.

대부분의 경우 BPF는 로드(ld) 명령과 스토어(str) 명령을 "오버로드"함으로써' 확장됩니다.

기존 Unix와 유사한 BPF 구현은 커널 공간용으로 작성되어 있지만 사용자 공간에서 사용할 수 있습니다.이는 프리프로세서 조건을 사용하여 이루어집니다.

확장 및 최적화

일부 프로젝트에서는 원본과 다른 BPF 명령 집합 또는 실행 기술을 사용합니다.

FreeBSD, NetBSD, WinPcap 등의 일부 플랫폼에서는 성능을 향상시키기 위해 JIT(Just-in-Time) 컴파일러를 사용하여 BPF 명령을 네이티브코드로 변환합니다.리눅스에는 기본적으로 실행 중지된 BPF JIT 컴파일러가 포함되어 있습니다.

동일한 가상 시스템 언어에 대한 커널 모드 인터프리터는 Tru64 Unix와 같은 다른 운영 체제의 원시 데이터 링크 계층 메커니즘과 Linux 커널의 소켓 필터 및 WinPcap 및 Npcap 패킷 캡처 메커니즘에 사용됩니다.

버전 3.18 이후 Linux 커널에는 확장 BPF(eBPF)라는 이름의 64비트 레지스터가 10개 포함된 확장 BPF 가상 시스템이 포함되어 있습니다.다양한 트레이스 [5][6][7]포인트에 eBPF 프로그램을 부가하는 등 네트워킹 이외의 목적으로 사용할 수 있습니다.커널 버전 3.19 이후로는 eBPF 필터를 [8][9]소켓에 접속할 수 있으며, 커널 버전 4.1 이후로는 입력 및 출력 네트워킹 데이터 [10][11]경로 트래픽 제어 분류자에 접속할 수 있습니다.원래 버전과 사용되지 않는 버전은 classic BPF(cBPF)로 소급하여 이름이 변경되었습니다.현재 Linux 커널은 eBPF만 실행하고 로드된 cBPF 바이트 코드는 프로그램 [12]실행 전에 커널에서 eBPF 표현으로 투과적으로 변환됩니다.서비스 거부 공격을 방지하기 위해 실행 전에 모든 바이트 코드를 확인합니다.Linux 5.3까지 검증자는 루프의 사용을 금지했습니다.

BPF의 사용자 모드인터프리터는 pcap API의 libpcap/WinPcap/Npcap 구현과 함께 제공됩니다.따라서 필터링 메커니즘에 대한 커널 모드가 지원되지 않는 시스템에서 패킷을 캡처할 때 사용자 모드로 패킷을 필터링할 수 있습니다.pcap API를 사용하는 코드는 필터링이 되어 있는 시스템에서 모두 동작합니다.사용자 모드에서 필터링되는 패킷을 포함한 모든 패킷이 커널에서 사용자 공간으로 복사됩니다.이 인터프리터는 pcap을 사용하여 캡처된 패킷이 포함된 파일을 읽을 때도 사용할 수 있습니다.

다른 사용자 모드인터프리터는 JIT 및 eBPF(cBPF 없음)를 지원하는uBPF입니다.이 코드는 Linux 이외의 시스템에서 [13]eBPF 지원을 제공하기 위해 재사용되었습니다.마이크로소프트의 "eBPF on Windows"는 uBPF와 PREM 공식 검증자를 [14]기반으로 합니다.rBPF는 uBPF의 Rust rewrite로 Solana(블록체인 플랫폼)실행 [15]엔진으로 사용합니다.

프로그래밍

Classic BPF는 일반적으로 일치하는 패턴을 설명하는 매우 높은 수준의 텍스트 규칙에서 프로그램에 의해 출력됩니다.이러한 표현 중 하나는 [16]libpcap에 있습니다.클래식 BPF 및 eBPF는 머신코드로 직접 작성하거나 텍스트 표현에 어셈블리 언어를 사용할 수도 있습니다.주목할 만한 어셈블러는 Linux 커널입니다.bpf_asm공구(cBPF),bpfc(cBPF) 및ubpf어셈블리(eBPF)bpftool명령어는 양쪽 BPF 플레이버의 디스어셈블러로서도 기능합니다.어셈블리 언어가 반드시 서로 호환 가능한 것은 아닙니다.

eBPF 바이트코드는 최근 고급 언어의 표적이 되고 있습니다.LLVM은 2014년에 eBPF 지원을 추가했고, GCC는 2019년에 그 뒤를 이었다.어느 툴킷에서도 C 및 기타 지원되는 언어를 eBPF로 컴파일할 수 있습니다.P4의 서브셋은 LLVM 기반의 컴파일러 [17]키트인 BCC를 사용하여 eBPF로 컴파일할 수도 있습니다.

역사

원본 논문은 1992년 스티븐 맥캔과 반 제이콥슨이 로렌스 버클리 [1][18]연구소에 있을 때 썼다.

2003년 8월 SCO 그룹은 Linux 커널이 자신들이 소유하고 [19]있는 Unix 코드를 침해하고 있다고 공개적으로 주장했습니다.프로그래머들은 그들이 제시한 한 가지 예가 Berkeley Packet Filter라는 것을 금방 알아냈습니다.이것은 사실 SCO가 소유한 [20]적이 없는 것입니다.SCO는 실수를 설명하거나 인정하지 않았지만 현재 진행 중인 법적 조치는 결국 답변을 [21][needs update?]강요할 수 있습니다.

보안에 관한 우려

Spectre 공격은 Linux 커널의 eBPF 인터프리터 또는 JIT 컴파일러를 이용하여 다른 커널 [22]프로세스에서 데이터를 추출할 수 있습니다.커널의 JIT 강화 기능은 이 취약성을 [23]완화합니다.

중국의 컴퓨터 보안 기관인 Pangu Lab은 BPF가 NSA에 의해 리눅스 시스템의 [24]첨단 백도어에 사용되었다고 주장했습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b McCanne, Steven; Jacobson, Van (1992-12-19). "The BSD Packet Filter: A New Architecture for User-level Packet Capture" (PDF).
  2. ^ "Microsoft embraces Linux kernel's eBPF super-tool, extends it for Windows". The Register. 2021-05-11. Archived from the original on 2021-05-11.
  3. ^ "bpf(4) Berkeley Packet Filter". FreeBSD. 2010-06-15.
  4. ^ Watson, Robert N. M.; Peron, Christian S. J. (2007-03-09). "Zero-Copy BPF" (PDF).
  5. ^ "Linux kernel 3.18, Section 1.3. bpf() syscall for eBFP virtual machine programs". kernelnewbies.org. December 7, 2014. Retrieved September 6, 2019.
  6. ^ Jonathan Corbet (September 24, 2014). "The BPF system call API, version 14". LWN.net. Retrieved January 19, 2015.
  7. ^ Jonathan Corbet (July 2, 2014). "Extending extended BPF". LWN.net. Retrieved January 19, 2015.
  8. ^ "Linux kernel 3.19, Section 11. Networking". kernelnewbies.org. February 8, 2015. Retrieved February 13, 2015.
  9. ^ Jonathan Corbet (December 10, 2014). "Attaching eBPF programs to sockets". LWN.net. Retrieved February 13, 2015.
  10. ^ "Linux kernel 4.1, Section 11. Networking". kernelnewbies.org. June 21, 2015. Retrieved October 17, 2015.
  11. ^ "BPF and XDP Reference Guide". cilium.readthedocs.io. April 24, 2017. Retrieved April 23, 2018.
  12. ^ "BPF and XDP Reference Guide — Cilium 1.6.5 documentation". docs.cilium.io. Retrieved 2019-12-18.
  13. ^ "generic-ebpf/generic-ebpf". GitHub. 28 April 2022.
  14. ^ "microsoft/ebpf-for-windows: eBPF implementation that runs on top of Windows". GitHub. Microsoft. 11 May 2021.
  15. ^ "Overview Solana Docs".
  16. ^ "BPF syntax". biot.com.
  17. ^ "Dive into BPF: a list of reading material". qmonnet.github.io.
  18. ^ McCanne, Steven; Jacobson, Van (January 1993). "The BSD Packet Filter: A New Architecture for User-level Packet Capture". USENIX.
  19. ^ "SCOsource update". 15 Obfuscated Copying. Archived from the original on August 25, 2003. Retrieved September 5, 2019.
  20. ^ Bruce Perens. "Analysis of SCO's Las Vegas Slide Show". Archived from the original on February 17, 2009.
  21. ^ Moglen, Eben (November 24, 2003). "SCO: Without Fear and Without Research". GNU Operating System. The Free Software Foundation. Retrieved September 5, 2019.
  22. ^ "Reading privileged memory with a side-channel". Project Zero team at Google. January 3, 2018. Retrieved January 20, 2018.
  23. ^ "bpf: introduce BPF_JIT_ALWAYS_ON config". git.kernel.org. Archived from the original on 2020-10-19. Retrieved 2021-09-20.
  24. ^ "Anatomy of suspected top-tier decade-hidden NSA backdoor". The Register. February 23, 2022. Retrieved February 24, 2022.

추가 정보

외부 링크