Пълен курс по етично хакерство: от нула до експерт

Хаквайте като хакери с черни шапки. Тестване за проникване, Kali Linux, хакване на WiFi и уеб сайтове, както и хакерският начин на мислене зад всичко това.

Изкуствен интелект откри уязвимост в ядрото на Linux, останала незабелязана в продължение на 18 години, а след това написа експлойт, който превръща локален потребител в root. Машините не са били с погрешна конфигурация. Проблемът е бил в самото ядро от 2007 г. насам. 🧐

Изследователи от Zhuque Lab на Tencent публикуваха пълния анализ на 6 август. Те проследяват уязвимостта под идентификатора CVE-2026-64564 и я нарекоха SCTPhantom. Тя позволява на обикновен потребител на Linux машина да повиши правата си до root, а от вътрешността на контейнер може да излезе извън него и да компрометира хост машината. Кодът, който прави това възможно, е внедрен през декември 2007 г. Той достига до потребителите с версия на ядрото 2.6.25 през април 2008 г. и оттогава е част от него. Корекцията за сигурност бе пусната в началото на август. Това представлява осемнадесет години съществуване на слабост във файл, който малцина някога отварят. Все пак през 2008 г. тя не би могла да бъде използвана по този начин. Пътят за придобиване на root права, изграден от Tencent, разчита на механизми в ядрото, които тогава все още не са съществували.

Проблемът се намира в SCTP – част от ядрото, която много малко системи изобщо използват.

Връзките, които вашият браузър и приложения правят, работят по протокола TCP – протоколът, който отваря надеждна връзка и гарантира, че пакетите пристигат в правилен ред. SCTP върши подобна работа, но е създаден за други цели. Той пренася сигнализация за телефонни мрежи, обслужва някои клъстери от бази данни и конфигурации, при които една връзка се нуждае от няколко мрежови пътя едновременно, за да оцелее при прекъсване на някой от тях. Почти никой Linux сървър не го зарежда по подразбиране. Кодът обаче е там в готовност и това се оказа достатъчно.

SCTP има функция, която позволява на активна връзка да добавя или премахва мрежови пътища без прекъсване. Ако телефонът ви превключи от WiFi към мобилни данни, връзката може да смени използвания адрес и да продължи. Тази функция се нарича ASCONF и грешката се намира именно в нея. Даден атакуващ изпраща кратък, подреден набор от инструкции в едно ASCONF съобщение и кара ядрото да освободи част от паметта, която все още се използва.

Всичко се свежда до два адреса, които ядрото третира като един. Когато проверява дали изтриването е разрешено, то гледа адреса, от който е дошъл пакетът. Когато извършва самата операция, използва друг адрес, посочен в съобщението. Не е задължително тези два адреса да съвпадат.

И така, даден атакуващ изпраща едно ASCONF съобщение с операции в следния ред:

Първото изтриване преминава проверката и премахва пътя, наречен L. Веднага след това груповото изтриване (wildcard delete) използва повторно запазения указател към същия този път, който току-що е бил освободен. Ядрото записва този невалиден указател в основния и активния път на връзката, след което премахва пътищата, които все още са налични. Резултатът е връзка с нула активни пътя и два указателя към памет, която ядрото вече е върнало на системата. Това представлява уязвимост от типа „use-after-free“ (използване след освобождаване): паметта е освободена, но ядрото продължава да чете и пише в нея, сякаш е активна. Оттам нататък атакуващият получава контрол над зона в системната памет на ядрото, на която системата все още има доверие.

Това не е състояние на съревнование (race condition), което понякога сработва, а друг път – не. Работи по един и същи начин всеки път. При подаване на правилната последователност пътят се освобождава при всяко изпълнение.

Корекцията за сигурност в основния клон (upstream) се състои от една проверка – отхвърляне на изтриването, когато целевият път е точно този, който самото съобщение все още държи. Два добавени реда код и осемнадесетгодишната дупка се затваря.

Следващите стъпки превръщат срива в пълен контрол. Ето последователността, изградена от изследователите, стъпка по стъпка:

  • освободеният SCTP път (първо използване след освобождаване)
  • пълнене на освободения слот с буфер за пакети (packet ring buffer)
  • превръщането му в повтаряемо 4-байтово четене
  • възстановяване на разположението на KASLR от фиксирана CPU таблица
  • второ използване след освобождаване, запълнено с данни, контролирани от атакуващия
  • изграждане на фалшив обектен граф и извикване на commit_creds
  • или, от контейнер, помощна програма на ядрото, която се изпълнява на хост машината

Освободеният слот се запълва с буфер за пакети – стандартна функция в Linux за изпращане на сурови мрежови пакети, което предоставя адрес в ядрото и го превръща в четирибайтово четене на произволно място в паметта. Това четене заобикаля KASLR (защитата, която скрива адреса, на който се зарежда ядрото), като извлича оформлението директно от фиксирана таблица на процесора. Второ използване след освобождаване, запълнено по същия начин, позволява на експлойта да стигне до commit_creds – функцията, която презаписва идентичността на процеса и му предоставя права на администратор (root).

Нищо от това не изпълнява външен код, предоставен от атакуващия. Извикват се функции на ядрото, които вече присъстват там, така че защитните системи, следящи за инжектиран код, не засичат нищо необичайно. Изследователите доказаха пълния root достъп, като прочетоха файла „/etc/shadow“, който само root може да отвори, и записаха нов файл в директорията „/root“.

Това работи на реално използвани машини – придобити са права на администратор (root) под Debian 13, Ubuntu 24.04, OpenCloudOS, както и под Rocky Linux 9 и RHEL 9 с зареден SCTP модул. Бягството от контейнери (container escape) е частта, която изисква най-гонямо внимание. При шест от осем опита е придобит root достъп до хост системата от вътрешността на контейнер, работещ в своята подразбираща се изолирана среда, без наличие на привилегии като CAP_NET_ADMIN или CAP_SYS_ADMIN, които понякога се предоставят на контейнерите.

По-ранни версии на демонстрационния код превключват...