Ilk eBPF Programi ve Tracepoint'ler

Process context

Bir eBPF programı çalıştığında, kernel space içinde çalışır, ancak olayı tetikleyen process hakkındaki bilgilere erişimi vardır.

Örneğin, bash bir olay tetiklerse, eBPF programınız o bash process context’i hakkında bilgi sorgulayabilir: adı, process ID’si ve dahası.

Kernel, tetikleyen process hakkında bilgi almak için geniş bir helper function seti tanımlar.

Görev

Sistemde çalıştırılan her programın adını elde etmek istiyoruz.

Bunu yapmak için, kodumuzu bir program her çalıştırıldığında tetiklenen bir event’e bağlamamız gerekiyor. Bu event’in adı sched_process_exec.

Önceden yüklü kod parçasında, fonksiyonumuzun hemen üstünde özel bir “section” tanımı göreceksiniz:

SEC("tp/sched/sched_process_exec")

Bu macro, eBPF loader’a fonksiyonu o belirli tracepoint’e bağlamasını söyler. Artık scheduler yeni bir process çalıştırdığında, bizim kodumuz da çalışır!

Önceden yüklü kod parçasını şimdi çalıştırmayı deneyin. Her event için bir kayıt görünmelidir.

Program adını alma

Örnek kod çalışıyor, ancak sabit bir string yazdırıyor. Biz her çalıştırma için gerçek program adını istiyoruz.

Kodumuz yeni process hakkında bilgiye erişimi olduğu için, kernel’dan tetikleyen process’in adını isteyebiliriz.

Sağlayacağınız bir buffer’a mevcut process adını yazan bpf_get_current_comm(&buf, size) fonksiyonunu kullanacağız.

C’de bir character buffer’ı şöyle tanımlayabiliriz:

char buffer[16];

Buffer’ı mevcut process adıyla doldurmak için helper function’ı çağırın:

bpf_get_current_comm(&buffer, sizeof(buffer));

Ardından sonuçları görmek için DEBUG_STR çağırın:

DEBUG_STR("Command", buffer);

Şimdi deneyin. ls gibi bazı normal programlar ve dikkat çeken bir tane göreceksiniz.

String karşılaştırma

İstenmeyen kayıtları filtrelemek için string’leri karşılaştırmanız gerekecek.

Değişken bir string’i sabit bir string ile karşılaştıran bpf_strncmp(s1, s1_sz, s2) fonksiyonunu kullanacağız.

Örneğin, buffer’ın "ls" içerip içermediğini kontrol etmek için:

if (bpf_strncmp(buffer, sizeof(buffer), "ls") == 0) {
    // buffer contains "ls"
}

String’ler eşleştiğinde 0 döndürür.

Göreviniz

Dikkat çeken programın adını SUBMIT_STR(buffer) kullanarak gönderin.

Run your code to see execution events here