V subsystému eBPF, který umožňuje spouštět zpracovatele pro sledování, analýzu fungování subsystémů a řízení provozu, prováděné uvnitř jádra Linux v speciálním virtuálním stroji s JIT, byla odhalena zranitelnost (CVE-2021-29154), která umožňuje lokálnímu uživateli provést svůj kód na úrovni jádra. Problém se projevuje až do vydání 5.11.12 (včetně) a ještě nebyl opraven v distribucích (Debian, Ubuntu, RHEL, Fedora, SUSE, Arch). Oprava je k dispozici ve formě patch.
Podle tvrzení výzkumníků, kteří zranitelnost odhalili, se jim podařilo vyvinout funkční prototyp exploitu pro 32- a 64bitové systémy x86, který může být použit neprivilegovaným uživatelem. Společnost Red Hat zároveň uvádí, že nebezpečnost problému závisí na dostupnosti systémového volání eBPF pro uživatele. Například v RHEL a většině dalších distribucí Linux ve výchozí konfiguraci lze zranitelnost využít při zapnutí BPF JIT a pokud má uživatel oprávnění CAP_SYS_ADMIN. Jako obranou proti útoku se doporučuje vypnout BPF JIT pomocí příkazu: echo 0 > /proc/sys/net/core/bpf_jit_enable
Problém je způsoben chybou ve výpočtu offsetu pro větvení při generování strojového kódu JIT kompilátorem. Konkrétně při generování větvících instrukcí se nebere v úvahu, že offset se může změnit po fázi optimalizace. Tato nedokonalost může být využita k vytvoření abnormálního strojového kódu a jeho provedení na úrovni jádra.
Pozoruhodné je, že toto není jediná zranitelnost v subsystému eBPF v poslední době. Na konci března byly v jádře nalezeny další dvě zranitelnosti (CVE-2020-27170, CVE-2020-27171), které umožňují využít eBPF k obraně proti zranitelnostem třídy Spectre, jež umožňují zjistit obsah jádra paměti následkem vytvoření podmínek pro spekulativní provádění určitých operací. Pro útok Spectre je potřeba, aby v privilegovaném kódu byla určité sekvence příkazů, které vedou k spekulativnímu provádění instrukcí. V eBPF bylo nalezeno několik způsobů, jak generovat podobné instrukce prostřednictvím manipulace s předávanými BPF programy.
Zranitelnost CVE-2020-27170 je způsobena manipulací se ukazateli ve verifikátoru BPF, která vyvolává spekulativní operace přístupu k oblastem mimo hranice bufferu. Zranitelnost CVE-2020-27171 souvisí s chybou celkového počtu (integer underflow) při práci s ukazateli, což vede k spekulativnímu přístupu k datům mimo buffer. Zmíněné problémy byly již odstraněny ve verzích jádra 5.11.8, 5.10.25, 5.4.107, 4.19.182 a 4.14.227 a byly zahrnuty do aktualizací jádra většiny distribucí Linux. Výzkumníci připravili prototyp exploit, který umožňuje nepřihlášenému uživateli extrahovat data z paměti jádra.
Zdroj: opennet.ru
