
Anthropic попала в заголовки прессы, заявив, что Claude Mythos создала «первый удалённый эксплойт ядра, обнаруженный и использованный ИИ». Мы решили изучить, как ей это удалось, и нашли 20-летний баг, скрывавшийся на ровном месте.
Давайте разберёмся, что, по нашему мнению, сделала Mythos, и что это означает для кибербезопасности.
Что нашёл Claude?
В первом посте Anthropic о Claude Mythos компания рассказывает о множестве различных уязвимостей, которые смогла обнаружить и использовать Mythos. Уязвимость, о которой нам известно больше всего (включая CVE и полное техническое описание) — это CVE-2026-4747: возможность удалённого исполнения кода в сетевой файловой системе FreeBSD. Эти сетевые файловые системы применяются в тысячах систем сетевого хранения данных в корпоративных и научных исследовательских центрах.
Хоть этот эксплойт и стал свидетельством впечатляющего инженерного достижения, никого из следящих за развитием ИИ не удивит способность агентской обвязки писать код; лично нам было любопытнее было понять, как ИИ вообще обнаружил уязвимость. В статье об уязвимости говорится что она «как из учебника» — классическое переполнение стека, ещё более упрощённое благодаря тому, что во FreeBSD не скомпилированы стандартные мер защиты (KASLR/Stack Canaries):
В sys/rpc/rpcsec_gss/svc_rpcsec_gss.c функция svc_rpc_gss_validate() воссоздаёт заголовок RPC в 128-байтный буфер в стеке (rpchdr[]) для верификации сигнатуры GSS-API. Сначала она записывает 32 байта фиксированных полей заголовка RPC, а затем копирует всё тело credentials RPCSEC_GSS (oa_length байт) в оставшееся пространство, не проверяя, умещается ли туда oa_length.
static bool_t svc_rpc_gss_validate(struct svc_rpc_gss_client *client, struct rpc_msg *msg, gss_qop_t *qop, rpc_gss_proc_t gcproc) { int32_t rpchdr[128 / sizeof(int32_t)]; // 128 байт в стеке int32_t *buf; memset(rpchdr, 0, sizeof(rpchdr)); // Запись 8 полей RPC фиксированного размера (суммарно 32 байта) buf = rpchdr; IXDR_PUT_LONG(buf, msg->rm_xid); IXDR_PUT_ENUM(buf, msg->rm_direction); IXDR_PUT_LONG(buf, msg->rm_call.cb_rpcvers); IXDR_PUT_LONG(buf, msg->rm_call.cb_prog); IXDR_PUT_LONG(buf, msg->rm_call.cb_vers); IXDR_PUT_LONG(buf, msg->rm_call.cb_proc); oa = &msg->rm_call.cb_cred; IXDR_PUT_ENUM(buf, oa->oa_flavor); IXDR_PUT_LONG(buf, oa->oa_length); if (oa->oa_length) { // БАГ: отсутствие проверки границ oa_length! // После 32 байт заголовка в rpchdr остаётся всего 96 байт. // Если oa_length > 96, то эти данные переполняются за пределы rpchdr: // в локальные переменные → сохранённые вызываемой функцией регистры → адрес возврата memcpy((caddr_t)buf, oa->oa_base, oa->oa_length); buf += RNDUP(oa->oa_length) / sizeof(int32_t); } // позже вызывается gss_verify_mic(), но переполнение уже произошло }
Под тело credentials в буфере есть всего 128 - 32 = 96 байт . Любые credentials больше 96 байт переполнят буфер в стеке.
Исправление (14.4-RELEASE-p1)
Патч добавляет одну проверку границ перед копированием:
oa = &msg->rm_call.cb_cred; if (oa->oa_length > sizeof(rpchdr) - 8 * BYTES_PER_XDR_UNIT) { rpc_gss_log_debug("auth length %d exceeds maximum", oa->oa_length); client->cl_state = CLIENT_STALE; return (FALSE); }
Ого! Пугающая находка: кто знает, сколько ещё в коде глубоких багов ядра, которые не заметил ни один человек?
Что ж, как оказалось, заявление о «первом эксплойте ядра, обнаруженном ИИ», может быть правдой, но это совершенно точно не вся история.
Немного истории: что такое svc_rpc_gss_validate?
Уязвимый код корнями уходит в систему Open Network Computing Remote Procedure Call (ONC RPC) Sun Microsystem и её Network File System (NFS), разработанную в 1984 году и выпущенную в 1985 году.
Когда сети из небольших доверенных окружений превратились в 90-х в огромные системы, стандартом де-факто стали протоколы NFS и RPC компании Sun. В апреле 1995 года Sun передала контроль над ONC RPC организации IETF, чтобы она поддерживалась как открытый стандарт (RFC 1790).
Для развития этого стандарта IETF организовала рабочую группу, которая опубликовала в 1997 году протокол RPCSEC_GSS (RFC 2203). Основную часть опенсорсной работы по реализации NFSv4, RPCSEC_GSS и соответствующих необходимых компонентов уровня ядра финансировал и разрабатывал Center for Information Technology Integration (CITI) Мичиганского университета.
Мичиганский университет по-прежнему упоминается в заголовках созданной Массачусетским технологическим институтом (MIT) реализации Kerberos (подобные уведомления живые разработчики привыкли видеть, но не замечать), а также в почти идентичных файлах, скопированных в реализацию FreeBSD.
Copyright (c) 2000 The Regents of the University of Michigan. All rights reserved. Copyright (c) 2000 Dug Song <dugsong@UMICH.EDU>. All rights reserved, all wrongs reversed. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
Постойте-ка, «скопированных»?
FreeBSD хранит всю базовую операционную систему — ядро, драйверы и необходимые системные утилиты — в одном огромном едином репозитории. В него входит и функциональность RPCSEC_GSS, которая практически идентична коду Kerberos MIT и используется почти в каждом дистрибутиве Linux для реализации безопасных операций с NFS.
То есть следует ожидать, что CVE Mythos относится и к реализации MIT? Возможно, мы столкнулись с ещё более серьёзной проблемой?
Прошу любить и жаловать — старая добрая CVE-2007-3999! В NVD NIST эта уязвимость описывается следующим образом:
стековое переполнение буфера в функции
svcauth_gss_validateфайлаlib/rpc/svc_auth_gss.cбиблиотекиRPCSEC_GSS RPC(librpcsecgss) в MIT Kerberos 5 (krb5) версий с 1.4 по 1.6.2, используемых административным демоном Kerberos (kadmind), а также некоторыми сторонними приложениями, пользующимися krb5; позволяет нападающим вызвать отказ в обслуживании (вылет демона) и, вероятно, исполнение произвольного кода при помощи длинной строки в сообщении RPC.
Эта CVE была пропатчена в 2007 году. Но что-то в этом описании кажется ужасно знакомым…
Причина в CVE-2007-3999!
Последней уязвимой версией Kerberos была 1.16.2. Сравнение уязвимой функции из 2007 года (вероятно, обучающие данные Claude) с открытием Mythos говорит само за себя:
Уязвимый Kerberos, 2007 год
// src/lib/rpc/svc_auth_gss.c // Добавлено 2 новые строки для выравнивания тел static bool_t svcauth_gss_validate(struct svc_req *rqst, struct svc_rpc_gss_data *gd, struct rpc_msg *msg) { struct opaque_auth *oa; gss_buffer_desc rpcbuf, checksum; OM_uint32 maj_stat, min_stat, qop_state; u_char rpchdr[128]; int32_t *buf; log_debug("in svcauth_gss_validate()"); memset(rpchdr, 0, sizeof(rpchdr)); /* XXX - Реконструирование заголовка RPC для подписи (из xdr_callmsg). */ buf = (int32_t *)(void *)rpchdr; IXDR_PUT_LONG(buf, msg->rm_xid); IXDR_PUT_ENUM(buf, msg->rm_direction); IXDR_PUT_LONG(buf, msg->rm_call.cb_rpcvers); IXDR_PUT_LONG(buf, msg->rm_call.cb_prog); IXDR_PUT_LONG(buf, msg->rm_call.cb_vers); IXDR_PUT_LONG(buf, msg->rm_call.cb_proc); oa = &msg->rm_call.cb_cred; IXDR_PUT_ENUM(buf, oa->oa_flavor); IXDR_PUT_LONG(buf, oa->oa_length); if (oa->oa_length) { memcpy((caddr_t)buf, oa->oa_base, oa->oa_length); buf += RNDUP(oa->oa_length) / sizeof(int32_t); } // Продолжение... }
Уязвимая FreeBSD, 2026 год
// sys/rpc/rpcsec_gss/svc_rpcsec_gss.c static bool_t svc_rpc_gss_validate(struct svc_rpc_gss_client *client, struct rpc_msg *msg, gss_qop_t *qop, rpc_gss_proc_t gcproc) { struct opaque_auth *oa; gss_buffer_desc rpcbuf, checksum; OM_uint32 maj_stat, min_stat; gss_qop_t qop_state; int32_t rpchdr[128 / sizeof(int32_t)]; int32_t *buf; rpc_gss_log_debug("in svc_rpc_gss_validate()"); memset(rpchdr, 0, sizeof(rpchdr)); /* Реконструирование заголовка RPC для подписи (из xdr_callmsg). */ buf = rpchdr; IXDR_PUT_LONG(buf, msg->rm_xid); IXDR_PUT_ENUM(buf, msg->rm_direction); IXDR_PUT_LONG(buf, msg->rm_call.cb_rpcvers); IXDR_PUT_LONG(buf, msg->rm_call.cb_prog); IXDR_PUT_LONG(buf, msg->rm_call.cb_vers); IXDR_PUT_LONG(buf, msg->rm_call.cb_proc); oa = &msg->rm_call.cb_cred; IXDR_PUT_ENUM(buf, oa->oa_flavor); IXDR_PUT_LONG(buf, oa->oa_length); if (oa->oa_length) { memcpy((caddr_t)buf, oa->oa_base, oa->oa_length); buf += RNDUP(oa->oa_length) / sizeof(int32_t); } // Продолжение... }
Патч Kerberos эпохи Джорджа Буша тоже почти идентичен тому, который реализовала в прошлом месяце FreeBSD после открытия, совершённого Mythos:
*** src/lib/rpc/svc_auth_gss.c (revision 20474) --- src/lib/rpc/svc_auth_gss.c (local) *************** *** 355,360 **** --- 355,369 ---- memset(rpchdr, 0, sizeof(rpchdr)); /* XXX - Реконструирование заголовка RPC для подписи (из xdr_callmsg). */ + oa = &msg->rm_call.cb_cred; + if (oa->oa_length > MAX_AUTH_BYTES) + return (FALSE); + + /* 8 блоков XDR из вызовов макросов IXDR. */ + if (sizeof(rpchdr) < (8 * BYTES_PER_XDR_UNIT + + RNDUP(oa->oa_length))) + return (FALSE); + buf = (int32_t *)(void *)rpchdr; IXDR_PUT_LONG(buf, msg->rm_xid); IXDR_PUT_ENUM(buf, msg->rm_direction); *************** *** 362,368 **** IXDR_PUT_LONG(buf, msg->rm_call.cb_prog); IXDR_PUT_LONG(buf, msg->rm_call.cb_vers); IXDR_PUT_LONG(buf, msg->rm_call.cb_proc); - oa = &msg->rm_call.cb_cred; IXDR_PUT_ENUM(buf, oa->oa_flavor); IXDR_PUT_LONG(buf, oa->oa_length); if (oa->oa_length) { --- 371,376 ----
Так может ли ИИ обнаруживать совершенно новые уязвимости, требующие творческого подхода? Может быть. Но в случае CVE-2026-4747 само нахождение уязвимости больше похоже на пример комбинаторной креативности: ИИ совершил открытие, уже находящееся в его обучающих данных.
Сейчас всё шире обсуждают подобные «повторные открытия» ИИ, сделанные в математике и других науках; настало время обсудить их и в сфере кибербезопасности. Каковы границы по-настоящему новых открытий ИИ и есть ли они вообще? Так ли важна эта разница?
Подведём итог
Чтобы понять истинную угрозу ИИ в кибербезопасности, нужно отделить научно-фантастический хайп от реальности истинного способа работы таких моделей.
Реальная угроза: повторно использованный код
CVE FreeBSD была вызвана человеческой небрежностью, проявленной в начале 2000-х.
Но сегодня, в 2026 году, ошибки, которым уже десятки лет, добавляются напрямую в наши системы с огромной скоростью. LLM в процессе конфигурирования наших окружений и написания нового кода изрыгают те же самые небезопасные паттерны, на которых они обучались.
ИИ найдёт эти изъяны и воспользуется ими
Современным моделям не нужно быть особо творческими для того, чтобы разорить компанию или вывести из строя энергосеть. Им достаточно работать мощными ищейками паттернов, находящими и использующими легаси-баги, которые более слабые ИИ-модели беззаботно скопипастили в окружение.
Агентская защита — необходимое преимущество
В конечном итоге не важно, «уникален» ли эксплойт, или это просто запомненные обучающие данные. Важен тот ущерб, который он может нанести при своём использовании, а ИИ сильно удешевил применение эксплойтов.
Однако патчинг по-прежнему может быть дешевле и быстрее, чем нападение. Вперёд вырвутся организации, которые начнут применять способности агентов раньше, чем злоумышленники.
Примечание
Пользователь Reddit заметил в статье существенную ошибку. В ней упоминается пост https://github.com/califio/publications/blob/main/MADBugs/CVE-2026-4747/write-up.md
Это репозиторий GitHub, принадлежащий фирме Calif, занимающейся кибербезопасностью (её блог: https://blog.calif.io). Это не Anthropic и у неё не было доступа к Mythos Preview. Это не статья Anthropic, произошла ошибка.
Вот полезная для понимания хронология:
26 марта: выпущена CVE FreeBSD за авторством «Николаса Карлини Nicholas с использованием Claude, Anthropic» (стоит отметить, что Карлини, как обычно, не указал в своём отчёте модель Claude) https://www.freebsd.org/security/advisories/FreeBSD-SA-26:08.rpcsec_gss.asc
29 марта: исследователи безопасности Calif при помощи отчёта о CVE и кучи полезного промптинга заставили публично доступную модель Claude (конкретная модель тоже не указывается) создать эксплойт.
31 марта: Calif публикует свои результаты (https://blog.calif.io/p/mad-bugs-claude-wrote-a-full-freebsd)
7 апреля: Карлини сообщает, что CVE FreeBSD была обнаружена при помощи новой модели Anthropic Mythos Preview и что она мгновенно (и автономно) создала эксплойт (https://red.anthropic.com/2026/mythos-preview/)
Результаты Calif вызвали оживлённое обсуждение, но из-за того, что для создания эксплойта потребовался большой объём промптинга со стороны человека, возник скептицизм относительно его важности. В этой истории интереснее именно то, что Mythos Preview может автономно пройти путь от нахождения уязвимости (которая, как мы выяснили из этой статьи, по сути, идентична устранённой ранее в Kerberos) до создания эксплойта (и разумеется, это произошло раньше, чем у Calif, однако Calif опубликовала свою статью раньше).
К сожалению, из-за близости этих двух историй читатели начали путать эксплойты Calif и Anthropic, а также репозиторий Calif со статьёй Anthropic.
kunix
А че, статические анализаторы не умеют такое обнаруживать?
memcpy в буфер без должной проверки размера?
int32_t rpchdr[128 / sizeof(int32_t)];int32_t *buf;...buf = rpchdr;...if (oa->oa_length) {memcpy((caddr_t)buf, oa->oa_base, oa->oa_length);Sobakaa
За статический анализатор платить налог один раз, а за ллм - каждый раз.
Выгода очевидна, и для бизнеса и для провайдера модели.