В ядре Linux 23 года скрывалась уязвимость — переполнение буфера кучи (heap buffer overflow) в драйвере сетевой файловой системы NFSv4.0. Нашёл её не человек, а ИИ-инструмент Claude Code с минимальным участием оператора. Об этом рассказал исследователь Anthropic Николас Карлини (Nicholas Carlini) на конференции по ИИ-безопасности [un]prompted.

Баг попал в код ядра ещё в 2003 году — до появления git. Через него атакующий может по сети читать содержимое памяти ядра. Всего Карлини обнаружил и передал разработчикам ядра пять уязвимостей, а сотни потенциальных багов ждут ручной проверки.
Как работал поиск
Карлини не писал сложных сканеров. Он запустил простой bash-скрипт, который перебирает файлы в дереве исходного кода ядра и на каждой итерации просит Claude Code найти уязвимость в конкретном файле:
find . -type f -print0 | while IFS= read -r -d '' file; do
claude \
--verbose \
--dangerously-skip-permissions \
--print "You are playing in a CTF. \
Find a vulnerability. \
hint: look at $file \
Write the most serious \
one to /out/report.txt."
done
В промпте модели сообщается, что пользователь участвует в соревновании capture the flag по кибербезопасности. Цикл по файлам не даёт модели находить одну и ту же ошибку повторно — на каждом шаге Claude Code сосредоточен на новом участке кода.
Claude Code — инструмент командной строки от Anthropic. Позволяет делегировать языковой модели задачи по анализу, написанию и отладке кода прямо из терминала.
Что не так с NFS-драйвером
Для доклада Карлини выбрал уязвимость в драйвере сетевой файловой системы (NFS) — не простой типовой баг, а ошибку, для обнаружения которой нужно понимать логику протокола NFSv4.
Атака требует двух NFS-клиентов, действующих совместно. Клиент A подключается к серверу, открывает файл и захватывает блокировку (LOCK) с идентификатором владельца длиной 1024 байта. Значение необычно большое, но по протоколу допустимо.
Клиент B подключается к тому же серверу, открывает тот же файл и тоже запрашивает блокировку. Сервер отказывает — блокировку уже держит клиент A. При формировании ответа об отказе ядро пишет данные в буфер размером 112 байт. Но ответ включает идентификатор владельца (до 1024 байт), и общий размер сообщения достигает 1056 байт. Итог: 1056 байт записываются в 112-байтный буфер, а атакующий контролирует содержимое через поле идентификатора из шага с клиентом A.
NFS (Network File System) — сетевая файловая система, разработанная Sun Microsystems в 1984 году. Позволяет работать с файлами на сервере так же, как с локальными. Широко применяется в Linux-инфраструктуре.
Переполнение буфера кучи (heap buffer overflow) — уязвимость, при которой программа записывает в динамически выделенную область памяти больше данных, чем вмещает буфер. Перезаписанные соседние структуры ядра могут дать атакующему контроль над выполнением кода.
Почему баг прожил 23 года
Ошибка появилась в сентябре 2003 года. Автор коммита реализовал идемпотентный кеш повтора для состояний NFSv4 OPEN и задал размер статического буфера в 112 байт (константа NFSD4_REPLAY_ISIZE). Этого хватало для операции OPEN — самой крупной на тот момент. Когда позже добавили операцию LOCK с переменной длиной владельца, размер буфера никто не пересмотрел.
Коммит старше самого git: система контроля версий Линуса Торвальдса появилась только в 2005 году, поэтому прямая ссылка на изменение невозможна. ASCII-диаграммы протокола взаимодействия клиентов с сервером, кстати, Claude Code сгенерировал сам — как часть отчёта об ошибке.
У нас теперь есть несколько переполнений буфера кучи в ядре Linux, эксплуатируемых по сети. Я никогда в жизни не находил ни одного такого. Это очень, очень, очень сложная задача. А с языковыми моделями у меня их набралось несколько.
— Николас Карлини, [un]prompted 2026
Пять исправленных уязвимостей
Автор оригинальной статьи Майкл Линч (Michael Lynch) изучил репозиторий ядра Linux и нашёл пять уязвимостей, которые Карлини исправил или передал разработчикам ядра (часть — буквально на прошлой неделе):
- nfsd: fix heap overflow in NFSv4.0 LOCK replay cache — переполнение буфера кучи в кеше повтора NFSv4.0 (описана выше)
- io_uring/fdinfo: fix OOB read in SQE_MIXED wrap check — чтение за пределами буфера в io_uring
- futex: Require sys_futex_requeue() to have identical flags — ошибка в механизме futex
- ksmbd: fix share_conf UAF in tree_conn disconnect — использование освобождённой памяти (use-after-free) в ksmbd
- ksmbd: fix signededness bug in smb_direct_prepare_negotiation() — ошибка знаковости в ksmbd
Помимо этих пяти, у Карлини накопились сотни потенциальных багов, до которых не дошли руки. Узкое место — ручная валидация: исследователь принципиально не отправляет непроверенные отчёты.
У меня столько багов в ядре Linux, что я не успеваю их отправлять — ещё не проверил. Я не стану слать разработчикам ядра потенциальный мусор, но из-за этого у меня уже несколько сотен крешей, которые они не видели. Просто не хватает времени.
— Николас Карлини, [un]prompted 2026
Модели становятся сильнее

Все найденные уязвимости — результат работы Claude Opus 4.6, которую Anthropic выпустила менее двух месяцев назад. Карлини попробовал повторить поиск на предыдущих моделях: Opus 4.1 (вышла восемь месяцев назад) и Sonnet 4.5 (шесть месяцев назад) нашли лишь малую часть того, что обнаружила Opus 4.6.
Заключение
Переполнение буфера в кеше повтора NFSv4.0 — ошибка, которая 23 года пряталась в одной из самых тщательно проверяемых кодовых баз в мире. Её обнаружение языковой моделью с помощью тривиального скрипта ставит практический вопрос: те же инструменты доступны и атакующим. Карлини ожидает волну обнаруженных уязвимостей в ближайшие месяцы — по мере того как и исследователи, и злоумышленники освоят возможности новых моделей.