REKLAMA

Kprobe od środka. Przeprawa przez jądro Linuxa

Współczesne jądro systemu Linux ma kilka mechanizmów debugowania i profilowania, takich jak DTrace, ftrace, ktap, LTTng, perf, sysdig, SystemTap czy ostatnio popularny eBPF. Większość z nich wykorzystuje m.in. kprobe do wstawiania próbek w jądrze systemu. Jednak żaden z nich nie daje takich możliwości, jak kprobe w przypadku, gdy potrzebujemy wpłynąć na przebieg wykonywania kodu. Ma to jednak swoją cenę, gdyż kprobe jest jednym z najmniej przyjaznych sposobów profilowania kernela. Jak już wspomniano wcześniej, kprobe jest podstawą pod różne mechanizmy debugowania i profilowania jądra systemu, dlatego warto wiedzieć, jak ten mechanizm działa oraz jakie ma możliwości i ograniczenia.

Kprobe umożliwia wstrzyknięcie wywołania własnej funkcji pod niemal dowolnym adresem kodu jądra systemu. Funkcja taka nazywana jest funkcją próbkującą, a funkcją próbkowaną nazywana jest funkcja, do której wstawiany jest kprobe. Funkcja próbkująca ma dostęp do wszystkich rejestrów i całej pamięci jądra w trybie odczytu i zapisu, a także, jak już wspomniano wcześniej, może wpływać na przebieg wykonywania kodu jądra systemu. Takie możliwości niosą za sobą zarówno pozytywne, jak i negatywne aspekty. Do negatywnych przede wszystkim można zaliczyć kwestie związane z bezpieczeństwem, gdzie, jak nietrudno sobie wyobrazić, dzięki kprobe można ominąć niemal każde zabezpieczenie. Do pozytywnych aspektów możemy zaliczyć możliwość wprowadzania dodatkowej kontroli dostępu do pewnych zasobów czy nawet łatać wykryte luki bezpieczeństwa w jądrze bez potrzeby restartowania systemu...

Zagadnienia poruszane w tym artykule:

  • Przykład użycia;
  • Jak działa kprobe;
  • Kretprobe;
  • Jak działa kretprobe;
  • Optymalizacja.

Artykuł pochodzi z magazynu Programista nr 100 (1/2022). Magazyn jest z przełomu stycznia i lutego 2022 r. Szczegółowy spis treści wydania nr 100: https://programistamag.pl/programista-1-2022-100/

Autorem artykułu jest Marek Maślanka - inżynier systemów wbudowanych w firmie Semihalf. Na co dzień zajmuje się rozwijaniem systemu operacyjnego ChromeOS, głównie od strony kernela. Po skończonej pracy przegląda kod źródłowy kernela Linux w celu zrozumienia, jak pewne rzeczy działają pod maską.