Berkeley Packet Filter

Berkeley Packet Filter (BPF) on vuonna 1992 esitelty menetelmä käsitellä verkkopaketteja käyttäjätasolla Unixeissa ja Unixin kaltaisissa käyttöjärjestelmissä. BPF:n kehittivät Steven McCanne ja Van Jacobson Lawrence Berkeley Laboratoryssa.

BPF käyttää käyttöjärjestelmän ytimeen lisättyä virtuaalikonetta, joka ajaa tavukoodia. BPF:n abstrakti kone on erittäin yksinkertainen ja sisältää akku-rekisterin, indeksirekisterin, sisäänrakennetun ohjelmalaskurin ja muistialueen. Käskyt ovat vakiopituisia paketteja, joissa on opcode, mahdollinen hyppykäskyn osoite ja geneerinen data. BPF-koodi voi hylätä tai hyväksyä paketteja vertailun perusteella tai muuttaa paketin dataa. BPF-koodia ei kuitenkaan ajeta hiekkalaatikossa, kuten JavaScript tai WebAssembly. BPF:n käskykanta ja rajapinnat ovat rajoitettuja ja koodi staattisesti varmistettua. BPF-ohjelman tarkoitus on selvillä jo ennen sen suoritusta.

Kehittäjien paperin mukaan BPF on 10–150 kertaa nopeampi kuin SunOS:n NIT ja 1,5–20 kertaa nopeampi kuin CMU/Stanfordin pakettisuodatin CSPF. Keskeisenä syynä nopeuserolle mainitaan rekisteripohjainen ”suodatinkone”, joka on tehokkaampi kuin muistipohjainen CSPF moderneilla suorittimilla.

Linuxissa

Ratkaisu on lisätty Linux-ytimeen alun perin ytimen versiossa 2.5 ja on laajennettu myöhemmin. Laajennettu eBPF tukee rajattuja ohjelmia assemblyn tai C-kielen kaltaisella kielellä LLVM-kääntäjän avulla. Tukea on myös laajennettu muihinkin kuin verkkorajapinnan paketteihin. eBPF:n merkittäviä eroja aiempaan ovat 64-bittisten rekisterien hyödyntäminen ja rekisterien määrän kasvaminen kahdesta kymmeneen. Käskykanta on IETF-standardissa RFC 9669.

Klassisia esimerkkejä käyttökohteesta ovat komentorivillä ajettava tcpdump-ohjelma arpwatch ja rarpd. Klassisen BPF:n käyttötarkoituksesta tcpdump ja seccomp käyttäjän käytettävissä. eBPF:n ohjelmatyypeistä kaksi 32:sta on käyttäjän käytettävissä ja muut vaativat ylikäyttäjän oikeudet.

Linuxin eBPF:n käyttötarkoitusta on huomattavasti laajennettu. Ensimmäinen laajennus eBPF:een oli koukkujen lisääminen kernelin kprobe ja uprobe-seurantaan (BPF tracing), seuraavaksi lisättiin tracepointit, sitten funktion kutsu (fentry) ja siitä poistuminen (fexit). Kerneliä valvova eBPF voi lukea kernelin muistia, muttei muuttaa sitä.

Android käyttää BPF-ohjelmia seuraamaan verkon käyttöä sivuston perusteella. Näin voidaan seurata esimerkiksi kuinka paljon YouTube tai Facebook vie kaistaa. Facebook käytti Linux-kernelin express data path (XDP) -ominaisuutta DDoS-hyökkäyksen torjumiseen. Facebookin ollessa 500 Gbps hyökkäyksen alla tämä torjuttiin asentamalla BPF-ohjelma verkkoajureihin, mikä oli kymmenen kertaa tehokkaampaa kuin muut DDoS-torjuntakeinot.

Uusi käyttökohteita ovat koukut Linux security module (LSM) -toiminnallisuuteen (BPF-LSM).

BPF-toimintoa voidaan käyttää myös esimerkiksi tietokantakyselyiden suorituskyvyn analyysiin. eBPF:lle on kehitetty uusia käyttökohteita alkuperäisen pakettisuodatuksen lisäksi ja esimerkiksi Googlen ghOSt käyttää eBPF:ää prosessien vuoronnuksen säätämiseen. Myös käyttämistä käyttöliittymälaitteiden (näppämistöt, hiiret) toiminnan muuttamiseen on ehdotettu (BPF for HID drivers). eBPF:n kehittäjä Alexei Starovoitov haluaisi itse asiassa korvata kaikki kernel-moduulit BPF-ohjelmilla.

Linuxin BPF-toteutuksen on osoitettu olevan haavoittuva Spectre-tietoturvahaavoittuvuuden eri varianteille. Kyseessä on suorittimissa oleva bugi, joka ei edes vaatinut BPF-koodia, vain tulkin olemassaolon. Linux-kernelin tulkki korvattiin sen vuoksi JIT-kääntäjällä.

Myös Microsoft on lisännyt eBPF:n Windowsiin.

Lähteet

  1. 1 2 3 4 5 6 Steven McCanne & Van Jacobson: The BSD Packet Filter: A New Architecture for User-level Packet Capture (PDF) tcpdump.org. 19.12.1992. Viitattu 27.11.2017.
  2. ↑ The BSD Packet Filter: A New Architecture for User-level Packet Capture (PDF) usenix.org. Viitattu 17.10.2019. (englanniksi) 
  3. ↑ BPF and security [LWN.net] lwn.net. Viitattu 19.10.2023.
  4. ↑ Corbet, Jonathan: BPF: the universal in-kernel virtual machine 21.5.2014. LWN.net. Viitattu 27.11.2017.
  5. ↑ Linux Socket Filtering aka Berkeley Packet Filter (BPF) kernel.org. Viitattu 27.11.2017.
  6. 1 2 Corbet, Jonathan: Attaching eBPF programs to sockets 10.12.2014. LWN.net. Viitattu 27.11.2017.
  7. ↑ Larabel, Michael: Understanding The Linux Kernel's BPF In-Kernel Virtual Machine 3.3.2015. Phoronix. Viitattu 27.11.2017.
  8. ↑ Matt Fleming: A thorough introduction to eBPF 2.12.2017. Lwn.net. Viitattu 18.10.2019. (englanniksi)
  9. ↑ BPF Instruction Set Architecture (ISA) rfc-editor.org. Viitattu 6.11.2024. (englanniksi)
  10. ↑ https://static.sched.com/hosted_files/linuxsecuritysummiteurope20/5a/bpf_and_security.pdf
  11. 1 2 3 https://lwn.net/Articles/946389/
  12. ↑ Laracey, Kyle: What is BPF and why is it taking over Linux Performance Analysis? 16.8.2016. MemSQL. Arkistoitu 1.12.2017. Viitattu 28.11.2017.
  13. ↑ Liam Proven: Linux kernel's eBPF feature put to unexpected new uses theregister.com. 14.9.2022. Viitattu 22.9.2022. (englanniksi)
  14. ↑ ghOSt: Fast & Flexible User-Space Delegation of Linux Scheduling dl.acm.org. 26.10.2021. doi:10.1145/3477132.3483542 Viitattu 22.9.2022. (englanniksi)
  15. ↑ https://lwn.net/Articles/909109/
  16. ↑ https://lwn.net/Articles/946389/
  17. ↑ https://lwn.net/Articles/946389/
  18. ↑ Thomas Claburn: Microsoft embraces Linux kernel's eBPF super-tool, extends it for Windows theregister.com. 11.5.2021. Viitattu 22.9.2022. (englanniksi)

Aiheesta muualla

Tämä ohjelmistoon liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.