Luki w podsystemie eBPF, umożliwiające obejście ochrony przed atakami typu Spectre

W jądrze Linux odkryto podatność (CVE-2021-33624), która umożliwia wykorzystanie podsystemu eBPF do obejścia ochrony przed podatnościami klasy Spectre, dając możliwość określenia zawartości pamięci w wyniku stworzenia warunków do spekulatywnego wykonania określonych operacji. Do ataku Spectre potrzebna jest obecność określonej sekwencji instrukcji w kodzie z uprawnieniami, prowadzącej do spekulatywnego wykonania instrukcji. Poprzez manipulację z przesyłanymi do wykonania programami BPF można wygenerować podobne instrukcje w eBPF i doprowadzić do wycieku zawartości pamięci jądra oraz dowolnych obszarów pamięci fizycznej przez kanały boczne.

Podatność jest spowodowana niedociągnięciami w weryfikatorze, który jest stosowany do wykrywania błędów i niedopuszczalnej aktywności w programach BPF. Weryfikator przegląda możliwe ścieżki wykonania kodu, ale pomija warianty rozgałęzień, niedopuszczalne z punktu widzenia semantyki architektury zestawu instrukcji. Podczas wykonywania programu BPF takie warianty rozgałęzień, które nie są uwzględniane przez weryfikator, mogą być błędnie przewidywane przez procesor i realizowane w trybie spekulatywnym. Na przykład, podczas analizy operacji „load” weryfikator zakłada, że w instrukcji używany jest rejestr z adresem, którego wartość zawsze mieści się w zadanych granicach, ale atakujący może stworzyć warunki, w których procesor spróbuje spekulatywnie wykonać operację z adresem, który nie spełnia warunków weryfikacji.

Problem występuje od wydania jądra 4.15 i został usunięty w formie łatek (1, 2, 3, 4). W dystrybucjach podatność wciąż pozostaje niepoprawiona (Debian, RHEL, Ubuntu, Fedora, SUSE, Arch).

Dodatkowo można zauważyć uwagi na temat wpływu środków ochrony przed podatnościami klasy Spectre na wydajność. W uwagach podsumowano wyniki optymalizacji debuggera rr (Record and Replay), który kiedyś stworzono w Moziili do debugowania trudnych do powtórzenia błędów w Firefoxie. Buforowanie wywołań systemowych używanych do sprawdzania istnienia katalogów umożliwiło skrócenie czasu wykonania operacji „rr sources” dla testowego projektu z 3 minut 19 sekund do 36 sekund.

Autor optymalizacji postanowił sprawdzić, jak zmieni się wydajność po wyłączeniu ochrony przed Spectre. Po uruchomieniu systemu z parametrem „mitigations=off” czas wykonania „rr sources” bez optymalizacji wyniósł 2 minuty 5 sekund (1,6 razy szybciej), a z optymalizacją — 33 sekundy (o 9% szybciej). Ciekawe, że wyłączenie ochrony przed Spectre nie tylko skróciło czas wykonania kodu w jądrze (z 2m9s do 1m32s) o 1,4 razy, ale także dwukrotnie zmniejszyło czas wykonania w przestrzeni użytkownika (z 1m9s do 0m33s), prawdopodobnie z powodu obniżenia efektywności pracy cache CPU i resetów TLB przy włączonej ochronie przed Spectre.

Źródło: opennet.ru

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster