Firma Microsoft opublikowała implementację podsystemu eBPF dla systemu Windows, umożliwiającą uruchamianie dowolnych obsług ścisłej współpracy z jądrem systemu operacyjnego. eBPF dostarcza wbudowany w jądro interpreter bajtów, umożliwiający tworzenie ładowalnych z przestrzeni użytkownika obsług sieciowych, kontrolowanie dostępu oraz monitorowanie pracy systemów. eBPF jest częścią jądra Linux od wydania 3.18 i pozwala na przetwarzanie przychodzących/wychodzących pakietów sieciowych, ich przekierowywanie, zarządzanie przepustowością, przechwytywanie wywołań systemowych, kontrolowanie dostępu oraz śledzenie aktywności. Dzięki zastosowaniu kompilacji JIT, bajtowy kod jest na bieżąco tłumaczony na instrukcje maszynowe i wykonywany z wydajnością skompilowanego kodu. Kody źródłowe eBPF dla systemu Windows są udostępniane na licencji MIT.
eBPF dla systemu Windows może być używany z już istniejącymi narzędziami do pracy z eBPF i oferuje typowe API stosowane w aplikacjach eBPF w systemie Linux. Projekt umożliwia kompilowanie napisanych w C kodów do bajtowego kodu eBPF przy użyciu standardowego kompilatora eBPF opartego na Clang oraz uruchamianie już stworzonych dla systemu Linux obsług eBPF na jądrze Windows, zapewniając specjalną warstwę kompatybilności i wspierając standardowe API Libbpf dla aplikacji współpracujących z programami eBPF. Oferowane są również warstwy dostarczające linux-opodobne hooki dla XDP (eXpress Data Path) oraz wiązanie gniazd, abstrahujące dostęp do stosu sieciowego i sterowników sieciowych systemu Windows. W planach przewidziano zapewnienie pełnej kompatybilności na poziomie kodu źródłowego z typowymi obsługami eBPF w systemie Linux.

Kluczową różnicą w implementacji eBPF dla systemu Windows jest zastosowanie alternatywnego weryfikatora bajtów, pierwotnie zaproponowanego przez pracowników firmy VMware oraz badaczy z kanadyjskich i izraelskich uniwersytetów. Weryfikator jest uruchamiany w osobnym, izolowanym procesie w przestrzeni użytkownika i stosowany przed wykonaniem programów BPF w celu wykrywania błędów i blokowania potencjalnej złośliwej aktywności.
Do analizy eBPF dla Windows stosuje się metodę analizy statycznej opartą na interpretacji abstrakcyjnej (Abstract Interpretation), która w porównaniu do weryfikatora eBPF dla systemu Linux wykazuje niższy poziom fałszywych alarmów, wspiera analizę cykli i zapewnia dobrą skalowalność. Metoda ta uwzględnia wiele typowych wzorców wykonania, uzyskanych na podstawie analizy istniejących programów eBPF.
Po weryfikacji kod bajtowy jest przekazywany do interpretera działającego na poziomie jądra lub wysyłany do JIT-kompilatora, a następnie wykonywany przez wynikowy kod maszynowy z uprawnieniami jądra. Aby izolować obsługiwacze eBPF na poziomie jądra, zastosowano mechanizm HVCI (HyperVisor-enforced Code Integrity), który wykorzystuje techniki wirtualizacji do ochrony procesów w jądrze i zapewnia potwierdzenie integralności wykonywanego kodu za pomocą podpisu cyfrowego. Ograniczeniem HVCI jest możliwość weryfikacji tylko interpretowanych programów eBPF i niemożność używania go wraz z JIT (użytkownik ma wybór — albo wydajność, albo dodatkowa ochrona).
Źródło: opennet.ru
