Уразлівасці ў падсістэме eBPF, якія дазваляюць абыйсці абарону ад нападаў класа Spectre

У ядры Linux выяўленая ўразлівасць (CVE-2021-33624), якая дазваляе выкарыстоўваць падсістэму еBPF для абыходу абароны ад уразлівасцяў класа Spectre, якія даюць магчымасць вызначыць змесціва памяці ў выніку стварэння ўмоў для спекулятыўнага выканання вызначаных аперацый. Для нападу Spectre патрабуецца наяўнасць у прывілеяваным кодзе вызначанай паслядоўнасці каманд, якія прыводзяць да спекулятыўнага выканання інструкцый. Праз маніпуляцыю з перадаюцца для выканання BPF-праграмамі можна дамагчыся генерацыі падобных інструкцый у еBPF і дамагчыся ўцечкі па іншых каналах змесціва памяці ядра і адвольных абласцей фізічнай памяці.

Уразлівасць выклікана недапрацоўкамі ў верыфікатары, які прымяняецца для выяўлення памылак і недапушчальнай актыўнасці ў BPF-праграмах. Верыфікатар перабірае магчымыя шляхі выканання кода, але прапускае варыянты галінавання, недапушчальныя з пункта гледжання семантыкі архітэктуры набору каманд. Пры выкананні ж BPF праграмы падобныя варыянты галінавання, не ўлічаныя верыфікатарам, могуць быць няслушна прадказаны працэсарам і выкананы ў спекулятыўным рэжыме. Напрыклад, пры аналізе аперацыі "load" верыфікатар разлічвае, што ў інструкцыі выкарыстоўваецца рэгістр з адрасам, значэнне якога заўсёды знаходзіцца ў зададзеных межах, але атакавалы можа стварыць умовы, пры якіх працэсар паспрабуе спекулятыўна выканаць аперацыю з адрасам, не адпаведным умовам праверкі.

Праблема выяўляецца пачынальна з выпуску ядра 4.15 і ўхіленая ў форме патчаў (1, 2, 3, 4). У дыстрыбутывах уразлівасць пакуль застаецца невыпраўленай (Debian, RHEL, Ubuntu, Fedora, SUSE, Arch).

Дадаткова можна адзначыць нататку аб уплыве на прадукцыйнасць сродкаў для абароны ад уразлівасцяў класа Spectre. У нататцы абагульнены вынікі аптымізацыі адладчыка rr (Record and Replay), у свой час створанага ў Mozilla для адладкі складана паўтаральных памылак у Firefox. Кэшаванне сістэмных выклікаў, якія выкарыстоўваюцца для праверкі існавання каталогаў, дазволіла скараціць выкананне аперацыі "rr sources" для тэставага праекта з 3 хвілін 19 секунд да 36 секунд.

Аўтар аптымізацыі вырашыў праверыць, наколькі зменіцца прадукцыйнасць пасля адключэння абароны ад Spectre. Пасля загрузкі сістэмы з параметрам "mitigations = off" час выканання "rr sources" без аптымізацыі склала 2 хвіліны 5 секунд (у 1.6 разы хутчэй), а з аптымізацыяй - 33 секунды (на 9% хутчэй). Цікава, што адключэнне абароны ад Spectre не толькі ў 1.4 разы скараціла час выканання кода на ўзроўні ядра (c 2m9s да 1m32s), але і ў два разы паменшыла час выканання ў прасторы карыстача (c 1m9s да 0m33s), меркавана з-за паніжэнні эфектыўнасці працы кэша CPU і скідаў TLB пры ўключанай абароне ад Spectre.

Крыніца: opennet.ru

Дадаць каментар