ИИ от Anthropic нашел баг в OpenBSD, который прятался 27 лет

Система Mythos обнаружила уязвимость в TCP-стеке OpenBSD через целочисленное переполнение в реализации SACK
Система Mythos обнаружила уязвимость в TCP-стеке OpenBSD через целочисленное переполнение в реализации SACK

Anthropic опубликовала отчет о работе своей ИИ-системы Mythos в области кибербезопасности. Среди прочего, модель обнаружила критическую уязвимость в ядре OpenBSD, которая оставалась незамеченной с 1999 года. Да, 27 лет.

Баг связан с реализацией механизма SACK (Selective ACKnowledgement) в TCP-стеке. Чтобы понять суть, нужен небольшой контекст. До появления SACK в 1996 году TCP мог подтверждать получение пакетов только последовательно, до первого потерянного. Если из цепочки пакетов терялся один где-то в середине, отправитель был вынужден заново передавать все пакеты после него, даже те, что уже успешно дошли. SACK решил эту проблему: получатель теперь может сообщать диапазоны успешно принятых пакетов, и отправитель повторно шлет только реально потерянные.

В OpenBSD для отслеживания таких диапазонов используется связный список. Ядро добавляет и удаляет из него записи по мере получения новых пакетов и обнаружения пропусков. И вот тут Mythos нашла две ошибки.

Первая: ядро проверяет конец входящего SACK-диапазона, но не проверяет начало. Само по себе это низкорисковая штука, потому что подтверждение байтов «от -2 до 7» работает так же, как «от 1 до 7». Но в сочетании со второй ошибкой все становится интереснее.

Показываю как профессионально работать с Claude и другими ИИ у себя в телеге! И зеркало Max, если тг не работает(

Вторая ошибка: в коде есть проверка (int)(sack.start - hole.start) < 0, которая корректно работает, только если разница между значениями не превышает 2^31. При нормальной работе сети это всегда так. Но если отправить специально сформированный пакет с аномальным значением sack.start, проверка ломается из-за целочисленного переполнения. В результате одновременно срабатывают и удаление, и вставка узла в связном списке, что приводит к разыменованию нулевого указателя (NULL pointer dereference) и краху операционной системы.

Это не уязвимость для удаленного выполнения кода и не утечка данных. Но для DoS-атаки она подходит отлично: атакующий может уронить целый кластер серверов на OpenBSD, просто отправив нужные пакеты.

Что тут показательно для нашей области: подобные баги в C-коде ядра операционных систем - это ровно тот класс задач, где ИИ сейчас начинает реально работать. Код написан десятилетия назад, прошел тысячи ревью, но человеческий взгляд систематически пропускает граничные случаи в целочисленной арифметике. Для модели, которая может перебирать состояния и строить цепочки рассуждений, это посильная задача.

Кстати, параллельно в X набирает популярность статья Daniel Lemire о том, почему C и его потомки так живучи. Fortran (1957), Pascal (1970), C (1972), потом C++ как «C с классами», Java (1995) с ее сборщиком мусора и виртуальной машиной, далее C#, Go, Rust, Zig. Каждый новый язык пытался решить проблемы предыдущего, но C-код никуда не делся и не денется в ближайшие десятилетия. А значит, багам в нем тоже жить еще долго. И именно здесь ИИ-инструменты для аудита безопасности становятся не просто полезными, а необходимыми.

Полный отчет Anthropic по red-teaming с Mythos: https://red.anthropic.com/2026/mythos-preview/

Разбор бага от Ben Dicken: https://x.com/BenjDicken/status/2042349599239913816

Статья Daniel Lemire про историю C/C++: https://x.com/lemire/article/2042256258783166828

2