Paketový filtr Berkeley - Berkeley Packet Filter

Paketový filtr Berkeley
Vývojáři Steven McCanne,
Van Jacobson
První vydání 19. prosince 1992 ; Před 28 lety ( 1992-12-19 )
Operační systém Unixové , Windows

Berkeley Packet Filter ( BPF ) je technologie používaná v některých operačních systémů pro programy, které potřeba, mimo jiné analyzovat síťový provoz (a eBPF je rozšířená BPF JIT virtual machine v linuxovém jádře ). Poskytuje nezpracované rozhraní pro vrstvy datových odkazů , což umožňuje odesílání a přijímání nezpracovaných paketů vrstev odkazových linek. BPF je k dispozici ve většině operačních systémů podobných Unixu a eBPF pro Linux a Microsoft Windows . Kromě toho, pokud ovladač pro síťové rozhraní podporuje promiskuitní režim , umožňuje rozhraní uvést do tohoto režimu, aby bylo možné přijímat všechny pakety v síti , dokonce i ty určené jiným hostitelům.

BPF podporuje filtrování paketů, což umožňuje procesu uživatelského prostoru dodávat program filtrování, který určuje, které pakety chce přijímat. Například tcpdump proces může chtít přijímat pouze pakety, které iniciují TCP spojení. BPF vrací pouze pakety, které procházejí filtrem, který proces dodává. Tím se zabrání kopírování nežádoucích paketů z jádra operačního systému do procesu, což výrazně zvýší výkon.

BPF se někdy používá k označení pouze mechanismu filtrování, nikoli celého rozhraní. Některé systémy, jako Linux a Tru64 UNIX , poskytují nezpracované rozhraní vrstvě datového spojení jiné než rozhraní BPF raw, ale pro toto nezpracované rozhraní používají mechanismy filtrování BPF.

Surové rozhraní

BPF poskytuje pseudozařízení, která lze vázat na síťové rozhraní; čtení ze zařízení bude číst vyrovnávací paměti plné paketů přijatých na síťovém rozhraní a zápisy do zařízení budou vkládat pakety do síťového rozhraní.

V roce 2007 Robert Watson a Christian Peron přidali k implementaci BPF v operačním systému FreeBSD rozšíření vyrovnávací paměti s nulovým kopírováním , což umožnilo zachycení paketů jádra v obsluze přerušení ovladače zařízení zapisovat přímo do paměti uživatelského procesu, aby se předešlo požadavku na dvě kopie pro všechna paketová data přijatá prostřednictvím zařízení BPF. Zatímco jedna kopie zůstává v cestě příjmu pro uživatelské procesy, zachovává se tím nezávislost různých spotřebitelů zařízení BPF a umožňuje se sbalení záhlaví do vyrovnávací paměti BPF místo kopírování celých dat paketů.

Filtrování

Možnosti filtrování BPF jsou implementovány jako interpret pro strojový jazyk pro virtuální stroj BPF , 32bitový stroj s instrukcemi s pevnou délkou, jeden akumulátor a jeden indexový registr . Programy v tomto jazyce mohou načítat data z paketu, provádět aritmetické operace s daty z paketu a porovnávat výsledky s konstantami nebo s daty v paketu nebo testovacími bity ve výsledcích, přijímat nebo odmítat paket na základě výsledků těchto testy.

BPF je často rozšířen „přetížením“ instrukcí load (ld) a store (str).

Tradiční implementace BPF podobné Unixu lze použít v uživatelském prostoru, přestože jsou napsány pro jádro. Toho je dosaženo za použití podmínek preprocesoru .

Rozšíření a optimalizace

Některé projekty používají instrukční sady BPF nebo prováděcí techniky odlišné od originálů.

Některé platformy, včetně FreeBSD , NetBSD a WinPcap , používají kompilátor JIT (just-in-time) k převodu pokynů BPF na nativní kód za účelem zlepšení výkonu. Linux obsahuje kompilátor BPF JIT, který je ve výchozím nastavení zakázán.

Tlumočníci v režimu jádra pro stejný jazyk virtuálního stroje se používají v mechanismech vrstvy surových datových odkazů v jiných operačních systémech, jako je Tru64 Unix , a pro soketové filtry v jádře Linuxu a v mechanismu zachycování paketů WinPcap a Npcap .

Od verze 3.18 obsahuje linuxové jádro rozšířený virtuální stroj BPF s deseti 64bitovými registry, označovaný jako rozšířený BPF ( eBPF ). Lze jej použít pro nesíťové účely, například pro připojení programů eBPF k různým sledovacím bodům . Od verze jádra 3.19 mohou být filtry eBPF připojeny k zásuvkám a od verze jádra 4.1 k klasifikátorům řízení provozu pro datovou cestu síťových příchozích a odchozích dat. Původní a zastaralá verze byla zpětně přejmenována na klasický BPF ( cBPF ). V současné době linuxové jádro provozuje pouze eBPF a načtený bajtový kód cBPF je transparentně přeložen do reprezentace eBPF v jádře před spuštěním programu. Všechny bajtkódy jsou před spuštěním ověřeny, aby se zabránilo útokům odmítnutí služby. Až do Linuxu 5.3 ověřovatel zakázal používání smyček.

Tlumočník uživatelského režimu pro BPF je dodáván s implementací libpcap/WinPcap/Npcap API pcap , takže při zachycování paketů v systémech bez podpory režimu jádra pro tento mechanismus filtrování lze pakety filtrovat v uživatelském režimu; kód využívající API pcap bude fungovat na obou typech systémů, ačkoli v systémech, kde se filtrování provádí v uživatelském režimu, jsou všechny pakety, včetně těch, které budou odfiltrovány, zkopírovány z jádra do uživatelského prostoru. Tento tlumočník lze také použít při čtení souboru obsahujícího pakety zachycené pomocí pcap.

Dalším interpretem uživatelského režimu je uBPF, který podporuje JIT a eBPF. Jeho kód byl znovu použit k poskytování podpory eBPF v systémech jiných než Linux. Microsoft „eBPF ve Windows“ staví na uBPF a formálním ověřovači PREVAIL.

Programování

Klasický BPF je obecně vydáván programem z nějakého velmi vysokého textového pravidla popisujícího vzor, ​​který má odpovídat. Jedna taková reprezentace se nachází v libpcap. Klasický BPF a eBPF lze také zapsat buď přímo jako strojový kód, nebo pomocí textové reprezentace v jazyce sestavení. Mezi pozoruhodné assemblery patří bpf_asmnástroj linuxového jádra (cBPF), bpfc(cBPF) a ubpfassembler (eBPF). bpftoolPříkaz může také působit jako disassembler pro obě chutí BPF. Jazyky sestavení nejsou navzájem nutně kompatibilní.

eBPF bytecode se v poslední době stává terčem jazyků vyšší úrovně. LLVM přidal podporu eBPF v roce 2014 a GCC následoval v roce 2019. Obě sady nástrojů umožňují kompilaci C a dalších podporovaných jazyků do eBPF. Podskupinu P4 lze také kompilovat do eBPF pomocí BCC, soupravy kompilátorů založených na LLVM.

Dějiny

Původní dokument napsali Steven McCanne a Van Jacobson v roce 1992 v laboratoři Lawrence Berkeley .

V srpnu 2003 skupina SCO veřejně tvrdila, že jádro Linuxu porušuje unixový kód, který vlastní. Programátoři rychle zjistili, že jedním z příkladů byl Berkeley Packet Filter, který ve skutečnosti SCO nikdy nevlastnil. SCO chybu nevysvětlila ani neuznala, ale probíhající právní kroky mohou nakonec vynutit odpověď.

Bezpečnostní obavy

Specter útok by mohl využít Linuxové jádro je eBPF interpret nebo kompilátor JIT k extrakci dat z jiných jaderných procesů. Funkce zabezpečení JIT v jádře tuto zranitelnost zmírňuje.

Viz také

Reference

Další čtení

externí odkazy