Berkeley Packet Filter

From Wikipedia, the free encyclopedia

Remove ads

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 10150 kertaa nopeampi kuin SunOS:n NIT ja 1,520 kertaa nopeampi kuin CMU/Stanfordin pakettisuodatin CSPF.[1] Keskeisenä syynä nopeuserolle mainitaan rekisteripohjainen ”suodatinkone”, joka on tehokkaampi kuin muistipohjainen CSPF moderneilla suorittimilla.[1]

Remove ads

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]

Remove ads

Lähteet

Aiheesta muualla

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads