Съдържание

/ubuntu-linux-tcp-kernel-bug-unpatched/ubuntu-linux-tcp-kernel-bug-unpatched.png

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

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

Linux сървърите с Ubuntu 22.04, 24.04 и 26.04 изостават с 18 дни след Debian по отношение на грешка в ядрото с оценка 9.8. 53 минути, без парола, и сървърът изпълнява команди като root. Изкуствен интелект написа този експлойт за пропуск, който се намира в Linux TCP от 2016 г. насам.

На 3 ноември собствената страница за сигурност на Ubuntu за CVE-2026-98432 все още посочва Ubuntu 22.04, 24.04 и 26.04 като уязвими (Vulnerable), с кратка бележка, че работата продължава. Разработчиците на ядрото на Linux пуснаха корекцията на 15 октомври, а Debian я достави на своите потребители на следващия ден. SUSE започна да пуска обновявания на 29 октомври. Red Hat, която оценява грешката като критична (Critical) – най-високото ниво по нейната скала – последва примера на 1 ноември за своите Enterprise Linux 8, 9 и 10. Трите версии на Ubuntu, които все още чакат, са нейните издания с дългосрочна поддръжка (LTS) – изданията, създадени да работят на сървър с години, с пет години обновявания за сигурност по подразбиране.

Оценката от 9.8 от 10 идва от собствения CVE екип на ядрото на Linux. Тя означава, че до грешката може да се достигне през мрежата, без акаунт или парола и без човек от страната на сървъра да кликва или да отваря каквото и да било.

Уязвимостта излезе наяве чрез Anthropic, компанията зад моделите с изкуствен интелект Claude. В изследователска публикация, публикувана на 27 октомври, нейният екип Frontier Red Team написа, че е открил грешката с AI модел, който не е пуснат публично. След първа инструкция (промпт) от екипа, изкуственият интелект е написал работещ експлойт за нея.

Този експлойт изпраща пакети към Linux сървър, който има отворен Multipath TCP слушател (listener). Той завършва с изпълнение на шел команда по избор на атакуващия с права на root, без влизане в системата и без необходимост от действие от страна на сървъра. При техния тест са били необходими 48 минути за извличане на указател на ядрото (kernel pointer) от целта и още около пет минути за стартиране на командата. От страна на ядрото, корекцията посочва Xinyang Ge, с адрес в anthropic.com, като човека, който е докладвал за проблема.

За да разберете защо това работи, започнете с начина, по който се отваря TCP връзка. Компютър, който иска да комуникира със сървър, изпраща малък пакет, наречен SYN. Сървърът отговаря със SYN-ACK, компютърът връща обратно ACK и връзката е отворена. Това е тристъпковото ръкостискане (three-way handshake) и то се случва, преди сървърът да върне дори една уеб страница или екран за вход. Една IPv4 дейтаграма (пакет) може също да пренася няколко допълнителни полета в своя хедър, наречени IP опции, с размер до 40 байта. Когато пристигне SYN с прикачени опции, Linux запазва копие на тези опции и ги връща обратно към подателя вътре в своя SYN-ACK.

Проблемът започва, когато един и същ SYN пристигне два пъти, което е нормално в интернет, тъй като клиент, който не получи отговор навреме, просто изпраща своя SYN отново. Второ процесорно ядро може тогава да започне да изгражда нов SYN-ACK от тези съхранени опции, докато първото ядро приключва с установяването на връзката и предава опциите на новата връзка, без да ги копира. Когато тази нова връзка бъде освободена, опциите се освобождават заедно с нея, а второто ядро може все още да чете от памет, която вече не принадлежи на връзката. До този момент ядрото на операционната система може вече да е предало тази памет на нещо друго.

Когато резултатът зависи от това кое от двете ядра ще стигне първо, това се нарича състояние на надпревара (race condition), а тук то завършва с използване след освобождаване (use-after-free), точно в кода, който отговаря на входящите връзки, на всеки порт, където сървърът слуша.

В първия етап на експлойта състоянието на надпревара кара ядрото да прочете поле за дължина, което атакуващият контролира. След това ядрото копира допълнителни байтове в своя отговор и ги изпраща, а сред тях има указател на ядрото (kernel pointer) – адрес, който показва къде се намира ядрото в паметта. Linux разбърква това разположение при всяко стартиране – защита, наречена KASLR, така че отдалечен атакуващ да не може да го предвиди, а един изтекъл указател е достатъчен, за да обезсмисли тази защита.

Във втория етап същото използване след освобождаване (use-after-free) се прилага за презаписване на указател за обратно извикване (callback pointer) – адрес, към който ядрото по-късно ще прескочи, така че да сочи към зловреден код, който атакуващият е подготвил по-рано. Този зловреден код свързва верижно функции, които вече съществуват вътре в ядрото, а последната от тях изпълнява шел командата на атакуващия като root.

Подобно състояние на надпревара не успява от първия опит и оттам идват тези 48 минути. Неуспешният опит прекъсва само това конкретно ръкостискане, без да срива сървъра, така че атакуващият може да продължи да изпраща опити, докато някой от тях успее. Надпреварата също така прави атаката по-трудна за осъществяване, отколкото предполага самата оценка. SUSE ѝ дава оценка 8.1 вместо 9.8, тъй като оценява сложността на атаката като висока, а Red Hat пише, че надеждното изпълнение на код изисква прецизен контрол върху динамичната памет на ядрото (kernel heap) – паметта, която ядрото разпределя по време на работа.

Промяната в кода, стояща зад тази грешка, е на повече от десет години. На 2 октомври 2015 г. Eric Dumazet променя начина, по който Linux съхранява входящите заявки за връзка, така че те да стоят в главната таблица за търсене, докато ръкостискането все още тече. Тази промяна е включена в Linux 4.4, пуснат на 10 януари 2016 г., и ядрата, пуснати оттогава, носят този пропуск. Втори път към същата грешка се появява през юни 2021 г. чрез функция, която премества чакащите заявки за връзка от един слушащ сокет към друг. Тази функция е изключена по подразбиране.

Единадесет години след първоначалната промяна, на 1 октомври 2026 г., същият човек написа корекцията. Инженерът, който е добавил втория път през 2021 г., я е прегледал. Самата корекция за сигурност е малка: там, където ядрото преди е освобождавало съхранените опции веднага, сега то изчаква, докато никое друго процесорно ядро не може все още да ги чете, използвайки метод, наречен RCU, което означава read-copy-update (четене-копиране-обновяване). Опциите остават в паметта за този кратък прозорец и едва след това ядрото ги освобождава.

Multipath TCP, или MPTCP, е версия на TCP, която позволява една връзка да преминава през няколко мрежови пътя едновременно, например през кабелна връзка и мобилна връзка заедно. Експлойтът от червения екип (red team) се нуждае от сървър с MPTCP слушател. Ubuntu вгражда MPTCP в своето ядро за 24.04 за всички поддържани архитектури, а ядрото на Linux го включва по подразбиране.

В допълнение към това, от версия Go 1.24, пусната през февруари 2025 г., програмите, написани на Go, отварят своите слушащи сокети под Linux с активиран MPTCP по подразбиране. Следователно сървърна програма, компилирана със скорошна версия на Go, като например уеб сървъра Caddy, може да слуша с MPTCP на стандартно ядро на Ubuntu 24.04, без нейният администратор изобщо да е избирал това. Екипът по сигурността на Go изпрати предупреждение точно за това на 29 октомври.

Изключването на MPTCP затваря пътя, който използва този конкретен експлойт, но самата уязвимост остава в обикновения IPv4 TCP. Бюлетин за сигурност на Red Hat посочва, че MPTCP не е необходим за възникването на грешката и че възлите на OpenShift, където MPTCP е деактивиран, все пак са засегнати. Canonical, компанията зад Ubuntu, пише, че корекцията не е специфична за MPTCP.

Причината Ubuntu да изостава се свежда до това кое ядро използва всяка дистрибуция. Debian работи с линията на ядрото 6.12, която получи корекцията във версия 6.12.113 на 15 октомври, така че Debian трябваше само да я пакетира. Ubuntu 22.04 работи със собствена компилация на линията 5.15, а 5.15.223 с корекцията излезе на същия този 15 октомври. Ubuntu 24.04 работи с 6.8, а Ubuntu 26.04 със 7.0. Корекцията от разработчиците на ядрото не беше пусната за тези две линии, така че екипът за ядрото на Ubuntu трябва сам да я пренесе.

Тази работа е свършена: коригираните ядра за 22.04 и 24.04 влязоха в секция от архива на Ubuntu, наречена -proposed, на 26 октомври, а ядрото за 26.04 последва на 28 октомври. Разделът (pocket) -proposed е тестовата зона на Ubuntu. Пакетите там не се изтеглят при нормално обновяване, така че даден сървър ги получава само когато неговият администратор включи този раздел ръчно. В блог публикация от 2 ноември Ubuntu написа, че ядрата са в процес на квалификационно тестване върху повече от 2 000 сертифицирани сървъра и устройства. Те преминават към редовните обновявания веднага щом тези тестове приключат, като в публикацията не се посочва дата.

Същата блог публикация описва оценката по CVSS от 9.8 като висока степен на сериозност (High), едно ниво под критична (Critical). Страницата на Ubuntu Server обещава навременни корекции за сигурност за критични уязвимости на клиентите на Ubuntu Pro, платения абонамент. По-старите издания — Ubuntu 20.04, 18.04 и 16.04 — получават корекции за сигурност само чрез този абонамент, като и трите все още са отбелязани като очакващи корекция.

Сървър с Ubuntu може да бъде проверен за минута. Първата команда показва кое ядро се изпълнява в момента, а втората извежда списък с инсталираните пакети на ядрото:

Още две команди показват дали даден сървър отговаря на конфигурацията от публикувания експлойт. Първата извежда 1, когато MPTCP е включен, а втората изброява слушащите сокети, които го използват, заедно с програмата зад всеки от тях:

За администраторите, които искат коригираното ядро от тестовия раздел веднага, вместо да чакат, Ubuntu предоставя тези команди и посочва, че този подход е предназначен за екипи, които сами тестват ядрата, преди да ги внедрят. Те включват раздела -proposed и инсталират ядрото от него, след което сървърът се нуждае от рестартиране. Редът за инсталиране предполага ядро, което е било инсталирано чрез мета-пакет:

За сървъри, които все още не могат да предприемат тази стъпка, същият бюлетин публикува правило за защитната стена, което отхвърля входящи IPv4 TCP пакети с IP опции, така че грешката никога да не получи своите входни данни. Запазете го като cve-2026-98432.nft:

След това тествайте файла и го заредете, а последната команда потвърждава, че таблицата е активна:

Правилото има ограничения и собствената CVE страница на Ubuntu ги описва подробно:

  • → То обхваща самия хост, а за контейнерите със собствена мрежова конфигурация правилото трябва да се приложи отделно
  • → То изчезва след рестартиране, освен ако не бъде добавено в /etc/nftables.conf
  • → То прекъсва връзки, които зависят от IPv4 опции, като например етикетите за сигурност CIPSO
  • → IPv6 трафикът не се нуждае от него, тъй като IPv6 не е засегнат от основната грешка

Бюлетинът нарича правилото начин за намаляване на излагането на риск, а не заместител на обновяването на ядрото. Екипът по сигурността на Ubuntu отива по-далеч и казва, че самото обновяване е единствената правилна корекция. След като коригираното ядро заработи, правилото се премахва отново със sudo nft delete table inet cve_2026_98432.

Досега няма данни тази грешка да е била използвана в успешна атака, но сканирането е започнало. Изследователят по сигурността Marcus Hutchins написа на 3 ноември, че сканиране на 30 октомври е открило около 2,1 милиона сървъра, достъпни през MPTCP на порт 443, без да се вижда кои от тях са с инсталирани корекции за сигурност. От 2 ноември неговият екип наблюдава как домашни проксита (residential proxies) и базирани в Русия VPN сървъри проверяват порт 443 с MPTCP — нещо, което обикновените скенери не използват — и той подозира, че атакуващи търсят тази грешка. Концептуални доказателства (PoC) за отказ от услуга (DoS) вече се разпространяват, а експлойтът от червения екип (red team) не е публикуван.

Това CVE не фигурира в списъка с известни експлоатирани уязвимости, поддържан от CISA, американската агенция за киберсигурност. Debian вече разполага с коригирано ядро, както и стандартните ядра на Red Hat Enterprise Linux 8, 9 и 10, докато SUSE е пуснала корекции за няколко от своите версии, а за други работата все още продължава. При тези системи корекцията влиза в сила едва след обновяването и рестартиране, когато uname -r покаже новата версия.

При Ubuntu 22.04, 24.04 и 26.04 обикновено изпълнение на sudo apt upgrade няма да достави корекцията, докато тя не излезе от -proposed. Сървър с тези версии, който отчита, че няма нищо останало за обновяване, може все още да работи с уязвимото ядро и днес.

Пакетите SYN, SYN-ACK и ACK в центъра на тази грешка са пакети, които можете да прихванете и прочетете сами в собствената си мрежа с помощта на Wireshark.

Ubuntu CVE-2026-98432 | Debian DSA-6568-1 | Anthropic Frontier Red Team | Корекция в ядрото на Linux