Berkeley Packet Filter

Nykymaailmassa Berkeley Packet Filter on aihe, joka on kiinnittänyt monien ihmisten huomion. Berkeley Packet Filter on ollut useiden tutkimusten ja keskustelujen kohteena joko sen merkityksen vuoksi nyky-yhteiskunnassa, historiassa tai työpaikalla. Berkeley Packet Filter on ollut alkuperästään tämän päivän kehitykseen asti kiehtova aihe, joka on herättänyt kiinnostuksen niin tutkijoissa, asiantuntijoissa kuin harrastajissakin. Tässä artikkelissa tutkimme eri näkökohtia, jotka liittyvät Berkeley Packet Filter:een, syventämällä sen tärkeyttä, mahdollisuuksia ja haasteita, joita se tällä hetkellä tarjoaa.

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

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.[1] 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.[3]

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.[1] Keskeisenä syynä nopeuserolle mainitaan rekisteripohjainen ”suodatinkone”, joka on tehokkaampi kuin muistipohjainen CSPF moderneilla suorittimilla.[1]

Linuxissa

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

Klassisia esimerkkejä käyttökohteesta ovat komentorivillä ajettava tcpdump-ohjelma arpwatch ja rarpd.[1] 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.[10]

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ä.[11]

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.[11]

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

BPF-toimintoa voidaan käyttää myös esimerkiksi tietokantakyselyiden suorituskyvyn analyysiin.[12] 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.[13][14] Myös käyttämistä käyttöliittymälaitteiden (näppämistöt, hiiret) toiminnan muuttamiseen on ehdotettu (BPF for HID drivers).[15] eBPF:n kehittäjä Alexei Starovoitov haluaisi itse asiassa korvata kaikki kernel-moduulit BPF-ohjelmilla.[16]

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ä.[17]

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

Lähteet

  1. a b c d e f 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. 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. a b 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. a b c 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