ai-security
Обвязка на Opus вскрыла обходы аутентификации в SAML
Promtime
ai-securityЗа месяц работы в свободное время исследователь проверил все реализации SAML, до которых смог дотянуться, и нашёл полные обходы аутентификации в четырёх проектах: Authentik, PHP-библиотеке litesaml/lightsaml, OneUptime и Java-клиенте saml-client. Разбор эксперимента опубликован в блоге Oblique, а доступ к модели Opus без ограничений автор получил через программу Anthropic Cyber Verification Program.
Коротко
- Поиск строился на двух фазах: сначала обвязка искала странности в разборе XML отдельными библиотеками, затем собирала из них сквозной эксплойт, а промежуточные результаты складывались в JSONL-файлы.
- Два обхода получили идентификаторы CVE-2026-57580 для Authentik и CVE-2026-63182 для litesaml/lightsaml, причём в Authentik комментарий внутри NameID усекает адрес и даёт возможность войти под чужой учётной записью.
- Обходы подписи для менее заметных сообщений протокола, среди них AuthnRequest, AttributeQuery и LogoutRequest, нашлись уже в двенадцати проектах и приводят к раскрытию данных и произвольным разлогиниваниям пользователей.
Ценность эксперимента скорее в формате, чем в отдельных CVE: сплошная проверка одного протокола по всем доступным реализациям переводит давний спор о качестве SAML в плоскость конкретных отчётов. Узким местом при этом становится пропускная способность сопровождающих: поток обращений, включая сгенерированные моделями, растёт быстрее возможностей их разбирать. Для команд, встраивающих SAML, это выглядит как очередной аргумент против собственных реализаций и в пользу готовых библиотек или перехода на OpenID Connect.
Полные обходы аутентификации подтверждены в четырёх проектах
В Authentik комментарий внутри NameID усекает значение до чужого адреса и даёт аутентификацию под другой учётной записью, это CVE-2026-57580. В остальных трёх случаях сработала подмена подписи в сообщении Response, известная как signature wrapping, у lightsaml она проходит под номером CVE-2026-63182.
Уязвимость в Authentik одновременно прислали восемь независимых исследователей. С 2020 года обход в крупной SAML-библиотеке появляется примерно раз в квартал: на GitHub Enterprise за 2024–2025 годы пришлось четыре записи, CVE-2024-4985, CVE-2024-6800, CVE-2024-9487 и CVE-2025-23369. Почти все они сводятся к тому, что компоненты по-разному интерпретируют XML, и неподписанные данные обрабатываются как проверенные.
Многие библиотеки уже перешли на ужесточённые API, рассчитанные на такие атаки, и структурно сломать протокол автору не удалось. Уязвимее всего свежие реализации: проекты без многолетней истории issue повторяют те же ошибки. Отсюда прежний совет автора: не писать собственную реализацию SAML, а по возможности брать OpenID Connect.
Проверку подписи у второстепенных сообщений обходят в двенадцати проектах
Подпись в SAML технически может стоять на любом сообщении, но внимание безопасности достаётся Response. Обходы проверки подписи для AuthnRequest, AttributeQuery и LogoutRequest нашлись в двенадцати проектах, и счёт продолжается, а последствия сводятся к раскрытию данных и произвольным разлогиниваниям. Один из случаев публично раскрыт в TypeScript-проекте samlify.
Отдельная группа проблем связана с отказом в обслуживании. Обработка произвольного XML, приходящего POST-запросом из интернета, приводила к исчерпанию памяти почти во всех крупных SAML-библиотеках при неаутентифицированных запросах. В Go-пакете xmldsig из-за отсутствующей проверки возникало квадратичное выделение памяти при валидации подписи, эти патчи приняты.
Похожее поведение xmldom в JavaScript затрагивает все Node-библиотеки, соответствующий отчёт пока закрыт. Python-пакеты не фильтруют набор трансформаций, передаваемых в libxmlsec1, поэтому XSLT-шаблон с рекурсивным вызовом заставляет библиотеку разворачивать документ произвольного размера. В Python- и Node-экосистемах эти баги остаются открытыми.
Обвязка делится на фазу гаджетов и фазу подтверждённых находок
Пайплайн собран из типовых примитивов: работа делится между несколькими агентами, промежуточные результаты складываются в общее хранилище и задают направление поиска, очередь задач приоритизируется, сужается и дедуплицируется. Прогон шёл на тарифе Claude Max 20x, исходники выложены в репозитории oblique-security/saml-research.
На фазе гаджетов модель искала странное поведение базовых XML-библиотек, на фазе находок комбинировала гаджеты и подтверждала их сквозным эксплойтом. Между шагами стоит фильтр, отбрасывающий предложения вне области исследования до того, как на их доказательство потратятся токены.
Учить Opus хакингу не пришлось. Корпус известных уязвимостей уводил модель в поиск тех же багов в чужих библиотеках, лучше сработали описание модели угроз и свободное исследование. Один из гаджетов: xml-crypto в Node при канонизации схлопывает инструкции обработки до их текста, что позднее превратилось в эксплойт с усечением адреса в NameID.
Три раунда фиксов в OneUptime
После публичного issue в OneUptime в тот же день влился крупный PR с исправлением, следом автор нашёл ещё два обхода: подпись через подписанный ответ об ошибке (#2981) и модификацию NameID через инструкцию обработки XML (#2988). Устойчивой защита стала только после третьего круга. Сроки исправления отказов в обслуживании в Python- и Node-библиотеках не называются, а самим командам автор советует прогонять LLM-проверку против своей реализации SAML.
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.
Из Google мы используем только имя и аватар. Почту не сохраняем.
