BPF (Berkeley Packet Filter), англ. Фільтр пакетів Берклі — технологія операційної системи, що надає інтерфейс для роботи з чистими мережевими кадрами на канальному рівні. Більшість Unix-подібних операційних операційних систем мають підтримку BPF інтерфейсу.
BPF дозволяє процесам з додавати до будь якого відкритого сокета фільтр та дозволяти або забороняти проходження певних даних через вибраний сокет. Для прикладу, використовуючи BPF фільтр, tcpdump може отримувати тільки TCP SYNC пакети. Для цього генерується відповідний BPF фільтр, що пропускає тільки потрібний користувачу трафік. Застосування такого фільтру покращує загальну продуктивність системи, оскільки ядро операційної системи не копіює небажаний трафік до буфера у .
Іноді під абревіатурою BPF мають на увазі тільки механізм фільтрації, а не весь інтерфейс BPF. Деякі системи, такі як Linux та Tru64 UNIX, надають інший, відмінний від BPF інтерфейс доступу до "сирих" мережевих кадрів на канальному рівні, залишаючи механізм фільтрації BPF для свого "сирого" інтерфейсу.
"Сирий" інтерфейс
Також, BPF надає (BPF-пристрої), які можуть бути прив'язані до мережевих інтерфейсів; читання з пристрою буде зчитувати буфер отриманих мережевим інтерфейсом пакетів, запис даних у пристрій буде випускати пакети з мережевого інтерфейсу.
В 2007, та Крістіан Перон додали розширення з до імплементації BPF у FreeBSD, дозволяючи драйверу мережевої карти записувати дані прямо в пам'ять користувацького процесу, для уникнення зайвих копіювань даних. Таким чином, замість двох копіювань (драйвер -> буфер ядра -> пам'ять процесу), відбувається одне копіювання в спільну пам'ять BPF програм у просторі користувача. Дана імплементація зберігає незалежність різних BPF-пристроїв один від одного при використанні спільної пам'яті.
Фільтрація
Функціонал фільтрації BPF імплементований як інтерпретатор для машинної мови, що виконується віртуальною машиною BPF (розрядність 32-біт, фіксована довжина інструкцій, один акумулятор та один індексний регістр). Програми, написані цією мовою, можуть доступатись до даних пакету, виконувати арифметичні та логічні операції над даними пакета, виконувати порівняння константних значень, результатів обчислень, даних в пакеті, а також приймати рішення щодо пропуску або відкидання пакету.
Функціонал BPF часто розширюється шляхом "перевантаження" інструкцій "load" (ld) та "store" (st).
Традиційні Unix-подібні імплементації BPF можуть використовуватись програмами в просторі користувача. Для цього необхідно використати певні прапорців препроцесора, оскільки в оригіналі BPF був написаний для роботи в просторі ядра.
Розширення та оптимізації
Не всі імплементації BPF однакові з функціональної точки зору. Деякі проекти мають відмінний від оригінальної імплементації набір інструкцій або техніки виконання коду.
Деякі платформи, такі як FreeBSD, NetBSD та , використовують JIT компілятори для перетворення BPF інструкцій у машинний код заради збільшення швидкодії. Імплементація в Linux підтримує режим робити з JIT-компілятором, який виключений за замовчуванням.
Інтерпретатори в ядрі ОС можуть використовуватись для різних цілей. В ядрі Tru64 Unix присутній на канальному рівні, та для фільтрації на рівні сокетів у ядрі Linux, та .
З версії ядра 3.18, в Linux з'являється розширена версія віртуальної машини BPF з 10-ю 64-бітних регістрів, названий extended BPF (eBPF, англ. розширений фільтр пакетів Берклі). Він може бути використаний виконання не мережевих задач, наприклад для обробки інформації у в ядрі ОС. У версії ядра 3.19 Linux eBPF фільтри можуть бути закріплені на сокетах, а з версії 4.1 - до класифікаторів вхідних та вихідних шляхів даних. З поширенням eBPF стало прийнято називати оригінальну версію classic BPF (cBPF, англ. класичний фільтр пакетів Берклі). Поточні версії ядра Linux працюють тільки з eBPF-байт кодом, в той час як cBPF-байт код транслюється у eBPF безпосередньо перед виконанням. Весь байт код, перед завантаженням в ядро проходить перевірку на відповідність певних безпекових параметрів. З версії ядра Linux 5.3, верифікатор дозволяє використання циклів.
Наявна імплементація API (з бібліотек libpcap/WinPcap/Npcap) інтерпретатора BPF для простору користувача, що дозволяє використовувати фільтрувальний функціонал BPF на ОС, що не мають такої підтримки у ядрі ОС. Код, що використовує API, буде працювати на обох системах, проте у випадку відсутності підтримки фільтру на рівні ОС, всі пакети будуть копіюватись з простору ядра до буфера програми у простір користувача. Цей інтерпретатор також може бути використаний для фільтрації пакетів з файлу.
Інтерпретатор uBPF працює у просторі користувача, підтримує JIT-компіляцію та розширення eBPF. uBPF ліг в основу інтерпретатора проєкта generic-eBPF, що використовується у не-Linux системах.
Програмування
Класичний BPF код зазвичай генерується програмою з високорівневого текстового правила, що описує шаблон роботи фільтру. Прикладом такого використання є libpcap. Класичний BPF та eBPF код також може бути згенерований одразу у вигляді машинного коду, або з текстового опису мовою асемблера. Прикладами таких асемблерів в ядрі Linux є bpf_asm
(cBPF), bpfc
(cBPF), а також ubpf
ассемблер (eBPF). Команда bpftool
має вбудований функціонал дизассемблера для cBPF та eBPF. Сумісність різних мов асемблера між собою не гарантується.
eBPF-байткод отримує підтримку все більшої кількості високорівневих мов програмування. LLVM отримав підтримку eBPF у 2014, GCC - у 2019. Обидва інструменти дозволяють компіляцію C - коду та інших підтримуваних мов програмування у eBPF-байткод. Підмножина мови програмування [en] також може бути скомпільована у eBPF-байткод за допомогою BCC, та LLVM.
Історія
Перша стаття, що описує BPF, була написана робітниками Національної лабораторії ім. Лоуренса в Берклі, та Ван Якобсоном, у 1992 році.
В Серпні 2003 року, [en] зробила публічну заяву, що у ядрі Linux присутній код Unix, правами на який вони, SCO Group, володіють. Програмісти швидко дізнались, що у якості прикладу, було наведено BPF, правами на який SCO ніколи не володіла. SCO не давала пояснень та не визнає своєї помилки, проте робота над порушеними юридичними справами може дати відповідь на це питання.
Проблеми безпеки
Атаки типу Spectre можуть використовувати eBPF JIT-компілятор для отримання доступу до даних процесів ядра, що може привести до читання захищених даних процесом з .
Див. також
Посилання
- McCanne, Steven; Jacobson, Van (19 грудня 1992). (PDF). Архів оригіналу (PDF) за 19 квітня 2009. Процитовано 3 жовтня 2020.
- . FreeBSD. 15 червня 2010. Архів оригіналу за 21 жовтня 2020. Процитовано 3 жовтня 2020.
- Watson, Robert N. M.; Peron, Christian S. J. (9 березня 2007). (PDF). Архів оригіналу (PDF) за 16 травня 2008. Процитовано 3 жовтня 2020.
- . kernelnewbies.org. 7 грудня 2014. Архів оригіналу за 25 жовтня 2019. Процитовано 6 вересня 2019.
- Jonathan Corbet (24 вересня 2014). . . Архів оригіналу за 27 грудня 2014. Процитовано 19 січня 2015.
- Jonathan Corbet (2 липня 2014). . . Архів оригіналу за 24 квітня 2019. Процитовано 19 січня 2015.
- . kernelnewbies.org. 8 лютого 2015. Архів оригіналу за 12 лютого 2015. Процитовано 13 лютого 2015.
- Jonathan Corbet (10 грудня 2014). . . Архів оригіналу за 14 лютого 2015. Процитовано 13 лютого 2015.
- . kernelnewbies.org. 21 червня 2015. Архів оригіналу за 16 жовтня 2015. Процитовано 17 жовтня 2015.
- . cilium.readthedocs.io. 24 квітня 2017. Архів оригіналу за 24 квітня 2018. Процитовано 23 квітня 2018.
- . docs.cilium.io. Архів оригіналу за 18 вересня 2020. Процитовано 18 грудня 2019.
- . lwn.net. Архів оригіналу за 20 вересня 2020. Процитовано 3 жовтня 2020.
- , IO Visor Project, 1 жовтня 2020, архів оригіналу за 9 листопада 2020, процитовано 3 жовтня 2020
- . GitHub (англ.). Архів оригіналу за 27 вересня 2020. Процитовано 3 жовтня 2020.
- . biot.com. Архів оригіналу за 14 серпня 2020. Процитовано 3 жовтня 2020.
- . qmonnet.github.io. Архів оригіналу за 2 жовтня 2019. Процитовано 3 жовтня 2020.
- McCanne, Steven; Jacobson, Van (January 1993). . . Архів оригіналу за 3 серпня 2020. Процитовано 3 жовтня 2020.
- . 15 Obfuscated Copying. Архів оригіналу за 25 серпня 2003. Процитовано 5 вересня 2019.
- . . Архів оригіналу за 17 лютого 2009.
- Moglen, Eben (24 листопада 2003). . GNU Operating System. The Free Software Foundation. Архів оригіналу за 5 вересня 2019. Процитовано 5 вересня 2019.
- . Project Zero team at Google. 3 січня 2018. Архів оригіналу за 1 жовтня 2019. Процитовано 20 січня 2018.
Зовнішні посилання
- bpfc, Berkeley Packet Filter компілятор, Linux BPF JIT дизасемблер [ 8 вересня 2016 у Wayback Machine.]
- McCanne, Steven; Jacobson, Van (19 грудня 1992). (PDF). Архів оригіналу (PDF) за 19 квітня 2009. Процитовано 3 жовтня 2020.
- man про спеціальні файли (GNU/Linux) (англ.) - FreeBSD – приклади використання BPF – сторінка довідки
- BPF Documdntation [ 6 жовтня 2020 у Wayback Machine.], документація ядра Linux
- Linux filter documentation [ 5 грудня 2020 у Wayback Machine.], формат байткоду для обох варіантів, cBPF та eBPF
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
BPF Berkeley Packet Filter angl Filtr paketiv Berkli tehnologiya operacijnoyi sistemi sho nadaye interfejs dlya roboti z chistimi merezhevimi kadrami na kanalnomu rivni Bilshist Unix podibnih operacijnih operacijnih sistem mayut pidtrimku BPF interfejsu BPF dozvolyaye procesam z dodavati do bud yakogo vidkritogo soketa filtr ta dozvolyati abo zaboronyati prohodzhennya pevnih danih cherez vibranij soket Dlya prikladu vikoristovuyuchi BPF filtr tcpdump mozhe otrimuvati tilki TCP SYNC paketi Dlya cogo generuyetsya vidpovidnij BPF filtr sho propuskaye tilki potribnij koristuvachu trafik Zastosuvannya takogo filtru pokrashuye zagalnu produktivnist sistemi oskilki yadro operacijnoyi sistemi ne kopiyuye nebazhanij trafik do bufera u Inodi pid abreviaturoyu BPF mayut na uvazi tilki mehanizm filtraciyi a ne ves interfejs BPF Deyaki sistemi taki yak Linux ta Tru64 UNIX nadayut inshij vidminnij vid BPF interfejs dostupu do sirih merezhevih kadriv na kanalnomu rivni zalishayuchi mehanizm filtraciyi BPF dlya svogo sirogo interfejsu Sirij interfejsTakozh BPF nadaye BPF pristroyi yaki mozhut buti priv yazani do merezhevih interfejsiv chitannya z pristroyu bude zchituvati bufer otrimanih merezhevim interfejsom paketiv zapis danih u pristrij bude vipuskati paketi z merezhevogo interfejsu V 2007 ta Kristian Peron dodali rozshirennya z do implementaciyi BPF u FreeBSD dozvolyayuchi drajveru merezhevoyi karti zapisuvati dani pryamo v pam yat koristuvackogo procesu dlya uniknennya zajvih kopiyuvan danih Takim chinom zamist dvoh kopiyuvan drajver gt bufer yadra gt pam yat procesu vidbuvayetsya odne kopiyuvannya v spilnu pam yat BPF program u prostori koristuvacha Dana implementaciya zberigaye nezalezhnist riznih BPF pristroyiv odin vid odnogo pri vikoristanni spilnoyi pam yati FiltraciyaFunkcional filtraciyi BPF implementovanij yak interpretator dlya mashinnoyi movi sho vikonuyetsya virtualnoyu mashinoyu BPF rozryadnist 32 bit fiksovana dovzhina instrukcij odin akumulyator ta odin indeksnij registr Programi napisani ciyeyu movoyu mozhut dostupatis do danih paketu vikonuvati arifmetichni ta logichni operaciyi nad danimi paketa vikonuvati porivnyannya konstantnih znachen rezultativ obchislen danih v paketi a takozh prijmati rishennya shodo propusku abo vidkidannya paketu Funkcional BPF chasto rozshiryuyetsya shlyahom perevantazhennya instrukcij load ld ta store st Tradicijni Unix podibni implementaciyi BPF mozhut vikoristovuvatis programami v prostori koristuvacha Dlya cogo neobhidno vikoristati pevni praporciv preprocesora oskilki v originali BPF buv napisanij dlya roboti v prostori yadra Rozshirennya ta optimizaciyi Ne vsi implementaciyi BPF odnakovi z funkcionalnoyi tochki zoru Deyaki proekti mayut vidminnij vid originalnoyi implementaciyi nabir instrukcij abo tehniki vikonannya kodu Deyaki platformi taki yak FreeBSD NetBSD ta vikoristovuyut JIT kompilyatori dlya peretvorennya BPF instrukcij u mashinnij kod zaradi zbilshennya shvidkodiyi Implementaciya v Linux pidtrimuye rezhim robiti z JIT kompilyatorom yakij viklyuchenij za zamovchuvannyam Interpretatori v yadri OS mozhut vikoristovuvatis dlya riznih cilej V yadri Tru64 Unix prisutnij na kanalnomu rivni ta dlya filtraciyi na rivni soketiv u yadri Linux ta Z versiyi yadra 3 18 v Linux z yavlyayetsya rozshirena versiya virtualnoyi mashini BPF z 10 yu 64 bitnih registriv nazvanij extended BPF eBPF angl rozshirenij filtr paketiv Berkli Vin mozhe buti vikoristanij vikonannya ne merezhevih zadach napriklad dlya obrobki informaciyi u v yadri OS U versiyi yadra 3 19 Linux eBPF filtri mozhut buti zakripleni na soketah a z versiyi 4 1 do klasifikatoriv vhidnih ta vihidnih shlyahiv danih Z poshirennyam eBPF stalo prijnyato nazivati originalnu versiyu classic BPF cBPF angl klasichnij filtr paketiv Berkli Potochni versiyi yadra Linux pracyuyut tilki z eBPF bajt kodom v toj chas yak cBPF bajt kod translyuyetsya u eBPF bezposeredno pered vikonannyam Ves bajt kod pered zavantazhennyam v yadro prohodit perevirku na vidpovidnist pevnih bezpekovih parametriv Z versiyi yadra Linux 5 3 verifikator dozvolyaye vikoristannya cikliv Nayavna implementaciya API z bibliotek libpcap WinPcap Npcap interpretatora BPF dlya prostoru koristuvacha sho dozvolyaye vikoristovuvati filtruvalnij funkcional BPF na OS sho ne mayut takoyi pidtrimki u yadri OS Kod sho vikoristovuye API bude pracyuvati na oboh sistemah prote u vipadku vidsutnosti pidtrimki filtru na rivni OS vsi paketi budut kopiyuvatis z prostoru yadra do bufera programi u prostir koristuvacha Cej interpretator takozh mozhe buti vikoristanij dlya filtraciyi paketiv z fajlu Interpretator uBPF pracyuye u prostori koristuvacha pidtrimuye JIT kompilyaciyu ta rozshirennya eBPF uBPF lig v osnovu interpretatora proyekta generic eBPF sho vikoristovuyetsya u ne Linux sistemah ProgramuvannyaKlasichnij BPF kod zazvichaj generuyetsya programoyu z visokorivnevogo tekstovogo pravila sho opisuye shablon roboti filtru Prikladom takogo vikoristannya ye libpcap Klasichnij BPF ta eBPF kod takozh mozhe buti zgenerovanij odrazu u viglyadi mashinnogo kodu abo z tekstovogo opisu movoyu asemblera Prikladami takih asembleriv v yadri Linux ye bpf asm cBPF bpfc cBPF a takozh ubpf assembler eBPF Komanda bpftool maye vbudovanij funkcional dizassemblera dlya cBPF ta eBPF Sumisnist riznih mov asemblera mizh soboyu ne garantuyetsya eBPF bajtkod otrimuye pidtrimku vse bilshoyi kilkosti visokorivnevih mov programuvannya LLVM otrimav pidtrimku eBPF u 2014 GCC u 2019 Obidva instrumenti dozvolyayut kompilyaciyu C kodu ta inshih pidtrimuvanih mov programuvannya u eBPF bajtkod Pidmnozhina movi programuvannya en takozh mozhe buti skompilovana u eBPF bajtkod za dopomogoyu BCC ta LLVM IstoriyaPersha stattya sho opisuye BPF bula napisana robitnikami Nacionalnoyi laboratoriyi im Lourensa v Berkli ta Van Yakobsonom u 1992 roci V Serpni 2003 roku en zrobila publichnu zayavu sho u yadri Linux prisutnij kod Unix pravami na yakij voni SCO Group volodiyut Programisti shvidko diznalis sho u yakosti prikladu bulo navedeno BPF pravami na yakij SCO nikoli ne volodila SCO ne davala poyasnen ta ne viznaye svoyeyi pomilki prote robota nad porushenimi yuridichnimi spravami mozhe dati vidpovid na ce pitannya Problemi bezpekiAtaki tipu Spectre mozhut vikoristovuvati eBPF JIT kompilyator dlya otrimannya dostupu do danih procesiv yadra sho mozhe privesti do chitannya zahishenih danih procesom z Div takozhKanalnij rivenPosilannyaMcCanne Steven Jacobson Van 19 grudnya 1992 PDF Arhiv originalu PDF za 19 kvitnya 2009 Procitovano 3 zhovtnya 2020 FreeBSD 15 chervnya 2010 Arhiv originalu za 21 zhovtnya 2020 Procitovano 3 zhovtnya 2020 Watson Robert N M Peron Christian S J 9 bereznya 2007 PDF Arhiv originalu PDF za 16 travnya 2008 Procitovano 3 zhovtnya 2020 kernelnewbies org 7 grudnya 2014 Arhiv originalu za 25 zhovtnya 2019 Procitovano 6 veresnya 2019 Jonathan Corbet 24 veresnya 2014 Arhiv originalu za 27 grudnya 2014 Procitovano 19 sichnya 2015 Jonathan Corbet 2 lipnya 2014 Arhiv originalu za 24 kvitnya 2019 Procitovano 19 sichnya 2015 kernelnewbies org 8 lyutogo 2015 Arhiv originalu za 12 lyutogo 2015 Procitovano 13 lyutogo 2015 Jonathan Corbet 10 grudnya 2014 Arhiv originalu za 14 lyutogo 2015 Procitovano 13 lyutogo 2015 kernelnewbies org 21 chervnya 2015 Arhiv originalu za 16 zhovtnya 2015 Procitovano 17 zhovtnya 2015 cilium readthedocs io 24 kvitnya 2017 Arhiv originalu za 24 kvitnya 2018 Procitovano 23 kvitnya 2018 docs cilium io Arhiv originalu za 18 veresnya 2020 Procitovano 18 grudnya 2019 lwn net Arhiv originalu za 20 veresnya 2020 Procitovano 3 zhovtnya 2020 IO Visor Project 1 zhovtnya 2020 arhiv originalu za 9 listopada 2020 procitovano 3 zhovtnya 2020 GitHub angl Arhiv originalu za 27 veresnya 2020 Procitovano 3 zhovtnya 2020 biot com Arhiv originalu za 14 serpnya 2020 Procitovano 3 zhovtnya 2020 qmonnet github io Arhiv originalu za 2 zhovtnya 2019 Procitovano 3 zhovtnya 2020 McCanne Steven Jacobson Van January 1993 Arhiv originalu za 3 serpnya 2020 Procitovano 3 zhovtnya 2020 15 Obfuscated Copying Arhiv originalu za 25 serpnya 2003 Procitovano 5 veresnya 2019 Arhiv originalu za 17 lyutogo 2009 Moglen Eben 24 listopada 2003 GNU Operating System The Free Software Foundation Arhiv originalu za 5 veresnya 2019 Procitovano 5 veresnya 2019 Project Zero team at Google 3 sichnya 2018 Arhiv originalu za 1 zhovtnya 2019 Procitovano 20 sichnya 2018 Zovnishni posilannyabpfc Berkeley Packet Filter kompilyator Linux BPF JIT dizasembler 8 veresnya 2016 u Wayback Machine McCanne Steven Jacobson Van 19 grudnya 1992 PDF Arhiv originalu PDF za 19 kvitnya 2009 Procitovano 3 zhovtnya 2020 a rel nofollow class external text href http linux die net man 4 bpf bpf 4 a storinka dovidki man pro specialni fajli GNU Linux angl FreeBSD prikladi vikoristannya BPF BPF Documdntation 6 zhovtnya 2020 u Wayback Machine dokumentaciya yadra Linux Linux filter documentation 5 grudnya 2020 u Wayback Machine format bajtkodu dlya oboh variantiv cBPF ta eBPF