Berkeley Paket Filtresi - Berkeley Packet Filter

Berkeley Paket Filtresi (BPF), diğer şeylerin yanı sıra, ağ trafiğini analiz etmesi gereken programlar için belirli bilgisayar işletim sistemlerinde kullanılan bir teknolojidir. Ham bir arayüz sağlar veri bağlantı katmanları ham bağlantı katmanı paketlerinin gönderilmesine ve alınmasına izin verir.[1] Çoğunda mevcuttur Unix benzeri işletim sistemleri. Ek olarak, ağ arayüzü sürücüsü destekliyorsa karışık mod, arayüzün bu moda sokulmasına izin verir, böylece tüm paketler diğer ev sahiplerine gönderilenler bile alınabilir.

BPF, filtreleme paketlerini destekler. Kullanıcı alanı süreç hangi paketleri almak istediğini belirten bir filtre programı sağlamak. Örneğin, bir tcpdump süreç, yalnızca bir TCP bağlantısı başlatan paketleri almak isteyebilir. BPF, yalnızca işlemin sağladığı filtreyi geçen paketleri döndürür. Bu, istenmeyen paketlerin bilgisayardan kopyalanmasını önler. işletim sistemi çekirdek sürece, performansı büyük ölçüde artırıyor.

BPF bazen tüm arayüz yerine yalnızca filtreleme mekanizmasına atıfta bulunmak için kullanılır. Gibi bazı sistemler Linux ve Tru64 UNIX, BPF ham arabirimi dışında veri bağlantı katmanına ham bir arabirim sağlayın, ancak bu ham arabirim için BPF süzme mekanizmalarını kullanın.

Ham arayüz

BPF sağlar sözde cihazlar bir ağ arayüzüne bağlanabilen; cihazdan okuma, ağ arayüzünde alınan paketlerle dolu tamponları okuyacak ve cihaza yazanlar, ağ arayüzüne paketleri enjekte edecektir.

2007 yılında Robert Watson ve Christian Peron ekledi sıfır kopyalama tamponu BPF uygulamasının uzantıları FreeBSD işletim sistemi,[2] BPF cihazı aracılığıyla alınan tüm paket verileri için iki kopya gereksinimini ortadan kaldırmak için, aygıt sürücüsünde çekirdek paket yakalamasına izin verme, kesme işleyicisinin doğrudan kullanıcı işlem belleğine yazmasını sağlar. Bir kopya, kullanıcı işlemleri için giriş yolunda kalırken, bu, farklı BPF cihazı tüketicilerinin bağımsızlığını korurken, tam paket verilerini kopyalamak yerine başlıkların BPF arabelleğine paketlenmesine izin verir.[3]

Filtreleme

BPF'nin filtreleme yetenekleri, bir makine dili BPF için sanal makine, sabit uzunlukta talimatlara sahip 32 bitlik bir makine, bir akümülatör, ve bir dizin kaydı. Bu dildeki programlar paketten veri alabilir, aritmetik paketteki veriler üzerinde işlemler ve sonuçları sabitlerle veya paketteki veya testteki verilerle karşılaştırın bitler sonuçlarda, bu testlerin sonuçlarına göre paketi kabul etme veya reddetme.

BPF genellikle yükün (id) "aşırı yüklenmesi" ve depolama (str) talimatlarıyla genişletilir.

Geleneksel Unix benzeri BPF uygulamaları, çekirdek alanı için yazılmış olmasına rağmen kullanıcı alanında kullanılabilir. Bu, kullanılarak gerçekleştirilir önişlemci koşullar.

Uzantılar ve optimizasyonlar

Bazı projeler, orijinallerinden farklı BPF komut setlerini veya yürütme tekniklerini kullanır.

Dahil olmak üzere bazı platformlar FreeBSD, NetBSD, ve WinPcap, kullanın tam zamanında (JIT) derleyici BPF talimatlarını yerel kod performansı artırmak için. Linux, varsayılan olarak devre dışı bırakılan bir BPF JIT derleyicisi içerir.

Aynı sanal makine dili için çekirdek modu yorumlayıcıları, diğer işletim sistemlerindeki ham veri bağlantı katmanı mekanizmalarında kullanılır. Tru64 Unix ve içindeki soket filtreleri için Linux çekirdeği ve WinPcap'te ve Npcap paket yakalama mekanizması.

3.18 sürümünden bu yana, Linux çekirdeği, adı verilen on adet 64 bitlik kaydı olan genişletilmiş bir BPF sanal makinesi içerir. genişletilmiş BPF (eBPF). EBPF programlarını çeşitli programlara eklemek gibi ağ dışı amaçlar için kullanılabilir. izleme noktaları.[4][5][6] Çekirdek sürüm 3.19'dan bu yana, eBPF filtreleri şuraya eklenebilir: prizler,[7][8] ve çekirdek sürüm 4.1'den beri trafik kontrolü giriş ve çıkış ağ iletişimi veri yolu için sınıflandırıcılar.[9][10] Orijinal ve eski sürüm geriye dönük olarak şu şekilde yeniden adlandırılmıştır: klasik BPF (cBPF). Günümüzde, Linux çekirdeği yalnızca eBPF'yi çalıştırır ve yüklenen cBPF bayt kodu, program yürütülmeden önce çekirdekteki bir eBPF temsiline şeffaf bir şekilde çevrilir.[11] Hizmet reddi saldırılarını önlemek için tüm bayt kodları çalıştırılmadan önce doğrulanır. Linux 5.3'e kadar, doğrulayıcı döngülerin kullanımını yasakladı.

BPF için bir kullanıcı modu yorumlayıcısı, libpcap / WinPcap / Npcap uygulamasıyla sağlanır. pcap API, böylece, bu filtreleme mekanizması için çekirdek modu desteği olmayan sistemlerde paketleri yakalarken, paketler kullanıcı modunda filtrelenebilir; pcap API kullanan kod her iki sistem türünde de çalışacaktır, ancak filtrelemenin kullanıcı modunda yapıldığı sistemlerde, filtrelenecek olanlar dahil tüm paketler çekirdekten kullanıcı alanına kopyalanır. Bu yorumlayıcı, pcap kullanılarak yakalanan paketleri içeren bir dosyayı okurken de kullanılabilir.

Diğer bir kullanıcı modu yorumlayıcı, JIT ve eBPF'yi destekleyen uBPF'dir. Kodu, Linux olmayan sistemlerde eBPF desteği sağlamak için yeniden kullanıldı.[12]

Programlama

Klasik BPF genellikle bir program tarafından eşleşecek modeli tanımlayan çok yüksek seviyeli bazı metinsel kurallardan yayınlanır. Böyle bir temsil libpcap'ta bulunur.[13] Klasik BPF ve eBPF ayrıca doğrudan makine kodu olarak veya metinsel bir temsil için bir montaj dili kullanılarak yazılabilir. Önemli derleyiciler arasında Linux çekirdeği bulunur bpf_asm araç (cBPF), bpfc (cBPF) ve ubpf assembler (eBPF). bpftool command aynı zamanda BPF'nin her iki çeşidi için de bir sökücü görevi görebilir. Montaj dillerinin birbiriyle uyumlu olması gerekmez.

eBPF bayt kodu, son zamanlarda üst düzey dillerin hedefi haline geldi. LLVM 2014'te eBPF desteği ekledi ve GCC her iki araç seti de derlemeye izin verir. C ve eBPF'ye desteklenen diğer diller. Altkümesi P4 LLVM tabanlı bir derleyici kiti olan BCC kullanılarak eBPF'de de derlenebilir.[14]

Tarih

Orijinal kağıt tarafından yazılmıştır Steven McCanne ve Van Jacobson 1992'de iken Lawrence Berkeley Laboratuvarı[1][15]

Ağustos 2003'te, SCO Grubu Linux çekirdeğinin sahip oldukları Unix kodunu ihlal ettiğini açıkça iddia etti.[16] Programcılar, verdikleri bir örneğin, aslında SCO'nun asla sahip olmadığı Berkeley Paket Filtresi olduğunu çabucak keşfettiler.[17] SCO, hatayı açıklamadı veya kabul etmedi, ancak devam eden yasal işlem sonunda bir cevabı zorlayabilir.[18]

Güvenlik endişeleri

Spectre saldırı, Linux çekirdeği eBPF JIT derleyicisini diğer çekirdek işlemlerinden veri ayıklamak ve kullanıcı alanının onu okumasına izin vermek için kullanabilir.[19]

Ayrıca bakınız

Referanslar

  1. ^ a b McCanne, Steven; Jacobson, Van (1992-12-19). "BSD Paket Filtresi: Kullanıcı Düzeyinde Paket Yakalama için Yeni Bir Mimari" (PDF).
  2. ^ "bpf (4) Berkeley Paket Filtresi". FreeBSD. 2010-06-15.
  3. ^ Watson, Robert N. M .; Peron, Christian S. J. (2007-03-09). "Sıfır Kopyalı BPF" (PDF).
  4. ^ "Linux kernel 3.18, Bölüm 1.3. EBFP sanal makine programları için bpf () sistem çağrısı". kernelnewbies.org. 7 Aralık 2014. Alındı 6 Eylül 2019.
  5. ^ Jonathan Corbet (24 Eylül 2014). "BPF sistem çağrısı API'si, sürüm 14". LWN.net. Alındı 19 Ocak 2015.
  6. ^ Jonathan Corbet (2 Temmuz 2014). "Genişletilmiş BPF'yi genişletme". LWN.net. Alındı 19 Ocak 2015.
  7. ^ "Linux kernel 3.19, Bölüm 11. Ağ İletişimi". kernelnewbies.org. Şubat 8, 2015. Alındı 13 Şubat 2015.
  8. ^ Jonathan Corbet (10 Aralık 2014). "EBPF programlarının soketlere takılması". LWN.net. Alındı 13 Şubat 2015.
  9. ^ "Linux kernel 4.1, Bölüm 11. Ağ İletişimi". kernelnewbies.org. 21 Haziran 2015. Alındı 17 Ekim 2015.
  10. ^ "BPF ve XDP Referans Kılavuzu". cilium.readthedocs.io. 24 Nisan 2017. Alındı 23 Nisan 2018.
  11. ^ "BPF ve XDP Referans Kılavuzu - Cilium 1.6.5 belgeleri". docs.cilium.io. Alındı 2019-12-18.
  12. ^ "genel-ebpf / jenerik-ebpf". GitHub.
  13. ^ "BPF sözdizimi". biot.com.
  14. ^ "BPF'ye dalın: okuma materyallerinin listesi". qmonnet.github.io.
  15. ^ McCanne, Steven; Jacobson, Van (Ocak 1993). "BSD Paket Filtresi: Kullanıcı Düzeyinde Paket Yakalama için Yeni Bir Mimari". USENIX.
  16. ^ "SCOsource güncellemesi". 15 Gizlenmiş Kopyalama. Arşivlenen orijinal 25 Ağustos 2003. Alındı 5 Eylül 2019.
  17. ^ Bruce Perens. "SCO'nun Las Vegas Slayt Gösterisinin Analizi". Arşivlenen orijinal 17 Şubat 2009.
  18. ^ Moglen, Eben (24 Kasım 2003). "SCO: Korkusuz ve Araştırmasız". GNU İşletim Sistemi. Özgür Yazılım Vakfı. Alındı 5 Eylül 2019.
  19. ^ "Ayrıcalıklı hafızayı bir yan kanal ile okumak". Google'da Project Zero ekibi. 3 Ocak 2018. Alındı 20 Ocak 2018.

Dış bağlantılar