Baslangic
eBPF'e Giris
eBPF, özel kodunuzu doğrudan kernel event’lerine hook etmenize olanak tanıyan bir Linux mekanizmasıdır.
Bir event tetiklendiğinde kernel normal yürütmeyi duraklatır, eBPF programınızı çalıştırır ve ardından devam eder. Bu işlem kernel seviyesinde gerçekleşir ve size user space’den tek başına elde edilmesi imkansız olan sistem davranışı görünürlüğü sağlar.
Hook yapabileceğiniz event örnekleri:
- Bir process dosya açar
- Bir program çalıştırılır
- Bir network packet gelir
Bu özellikler, eBPF’i kernel’i değiştirmeden veya kernel module yüklemeden observability, güvenlik izleme ve network filtering için güçlü bir araç haline getirir.
Program türleri
eBPF programları, kernel’de nereye attach olduklarına göre kategorize edilir. En yaygın olanları şunlardır:
Tracepoint’ler
Tracepoint’ler, kernel kodu boyunca tanımlanmış hook noktalarıdır. Process scheduling, dosya işlemleri, network işlemleri ve system call’lar gibi neredeyse tüm kernel event’lerini expose eder.
Kprobe’lar
Kprobe’lar, herhangi bir kernel fonksiyonuna ismiyle attach olur. Tracepoint’lerin aksine, kernel’in stable API’sinin bir parçası değildir - fonksiyon isimleri ve signature’lar versiyonlar arasında değişebilir.
Kprobe’lar, tracepoint’ler aracılığıyla expose edilmeyen kernel internal’larına erişim sağlayarak kernel davranışının daha derin incelenmesine olanak tanır.
XDP
XDP programları network driver seviyesine attach olur ve packet’leri kernel’in network stack’ine ulaşmadan önce işler.
XDP programları o kadar erken çalışır ki, packet’leri minimum overhead ile drop edebilir veya redirect edebilir.
Verifier
Kernel’de keyfi kod çalıştırabilseydiniz, sistemi çökertebilir, hassas verileri sızdırabilir veya makineyi kilitleyen sonsuz döngüler oluşturabilirdiniz.
eBPF verifier, programınızı çalıştırmadan önce analiz ederek ve katı güvenlik kuralları uygulayarak bunu önler.
Alıştırmalar üzerinde çalışırken verifier hatalarıyla karşılaşacaksınız. Bu hatalar şifreli olabilir, ancak her zaman verifier’ın güvenli olduğunu kanıtlayamadığı bir şeye işaret eder. Bu hataları okumayı öğrenmek, eBPF öğrenmenin bir parçasıdır.
Sonlanma garantisi
Programların sonlanacağı garanti edilmelidir. Bunu sağlamak için verifier sınırlamalar uygular:
- Programların maksimum karmaşıklığı vardır (verifier tarafından “instructions processed” olarak sayılır)
- Loop’ların, verifier’ın yükleme zamanında doğrulayabileceği sabit bir üst sınırı olmalıdır
- Sonsuz recursion’ı önlemek için helper fonksiyonlar programınıza geri çağrı yapamaz
Memory safety
Tüm memory erişimleri güvenli olmalıdır:
- Pointer arithmetic yapamaz veya rastgele adresleri dereference edemezsiniz
- Kernel veya user memory’yi okumak özel helper’lar gerektirir (
bpf_probe_read_kernel,bpf_probe_read_user) - Array erişimi kullanılmadan önce bounds-check yapılmalıdır
- Map lookup’larından gelen pointer’lar NULL kontrolünden geçirilmelidir
Verifier, kodunuzdaki tüm branch’leri analiz eder ve herhangi bir branch yolunun güvenli olduğu kanıtlanamayan programları reddeder.