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:
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ą.