Исследователь нашёл XSS-уязвимость в SourceHut, позволявшую захватить аккаунт через логи сборки
Исследователь безопасности обнаружил межсайтовый скриптинг (XSS) в ansi2html, инструменте, которым CI-сервис builds.sr.ht платформы SourceHut преобразует цветные ANSI-логи сборок в HTML для показа в браузере. Проблема была в обработке гиперссылок формата OSC 8: специально сформированная escape-последовательность в логе сборки позволяла внедрить в итоговый HTML атрибуты autofocus/onfocus или ссылку с javascript:-протоколом. В результате при открытии такого лога в браузере любого пользователя выполнялся произвольный JavaScript.
По описанию автора, такой вредоносный лог мог появиться даже без учётной записи на SourceHut, например, через патч, отправленный в публичный список рассылки с включённой непрерывной интеграцией, и оказаться на публичной странице сборки, доступной кому угодно. Выполненный в браузере жертвы скрипт мог считать CSRF-токен со страницы лога и пересобрать (resubmit) сборку от имени просматривающего, а если лог откроет администратор, потенциально выдать атакующему права администратора. Отдельно отмечается, что на builds.sr.ht хранятся деплой-ключи для самого sr.ht, то есть теоретический ущерб выходил за пределы одной учётной записи.
Уязвимы были версии ansi2html от 1.7.0 (не включая) до 1.9.4 и builds.sr.ht от 0.40.0 до 0.105.1. Баг был внесён в апстрим ansi2html 3 сентября 2021 года; сам ansi2html использовался в builds.sr.ht с 11 марта 2019 года. Исследователь сразу написал в службу безопасности SourceHut. Основатель проекта, известный под ником Drew, оперативно пропатчил builds.sr.ht, добавив автоматическую санитизацию вывода ansi2html. С мейнтейнерами апстрима ansi2html связаться было сложнее: один из двух основных сопровождающих, Sorin Sbarnea, на momент публикации так и не ответил, а второй, Sebastian Pipping, ответил коротким «напишите мне через две недели», после чего они вместе выпустили несколько новых релизов ansi2html с исправлением.
При подаче заявки на CVE исследователь указывает, что изначально рассчитанный им вектор CVSS был изменён сервисом VulnCheck, и настаивает, что итоговая оценка серьёзности должна быть высокой или критической, а не средней: уязвимость, по его оценке, автоматизируема и «червеобразна» (жертва, открывшая лог, сама может заразить других), а пострадавшие пользователи не могут удалить вредоносные задания сборки, только скрыть их.
Ключевые факты
- XSS обнаружен в ansi2html, инструменте, которым builds.sr.ht (CI-сервис SourceHut) рендерит логи сборок в HTML
- Вредоносная OSC 8-гиперссылка в логе позволяла выполнить JavaScript в браузере любого, кто открывал лог, включая пользователей без своей учётной записи на платформе
- Потенциальный ущерб: кража CSRF-токена, пересборка задания от имени жертвы, при просмотре администратором, потенциальное получение прав администратора и доступа к деплой-ключам, включая ключи самого sr.ht
- Уязвимы ansi2html версий от 1.7.0 до 1.9.4 и builds.sr.ht от 0.40.0 до 0.105.1; баг в апстриме появился 3 сентября 2021 года
- SourceHut оперативно пропатчила builds.sr.ht санитизацией вывода; апстрим ansi2html выпустил исправленные релизы после переписки с одним из двух мейнтейнеров
Почему это важно
Уязвимость показывает, как небольшой вспомогательный компонент CI-системы, конвертер ANSI-логов в HTML, может стать точкой входа для захвата аккаунта и доступа к секретам вроде деплой-ключей. Для сервисов непрерывной интеграции, где чужой пользовательский вывод (логи сборки) регулярно показывается в браузере, это конкретный пример класса риска: любой неэкранированный вывод в логах способен превратиться в исполняемый код на странице.
Кому это важно
Пользователям и администраторам SourceHut и builds.sr.ht, разработчикам и пользователям ansi2html, а также в целом инженерам, которые поддерживают CI/CD-системы с показом логов в браузере и полагаются на сторонние библиотеки для рендеринга произвольного текстового вывода.
Как это применить
Стоит убедиться, что используется ansi2html версии 1.9.4 или новее, а builds.sr.ht обновлён до версии 0.105.1 или новее, в этих релизах уязвимость устранена. Автор также предлагает проверять сырые логи сборок на наличие подозрительных escape-последовательностей вида OSC 8 со вставленными кавычками или javascript:-ссылками как индикатор возможной эксплуатации в прошлом.
Можно ли доверять
Материал, подробный технический разбор от самого исследователя, обнаружившего проблему, с рабочими примерами команд, точными диапазонами уязвимых версий и датами. SourceHut подтвердила проблему выпуском патча. При этом сам автор прямо отмечает, что подтверждённых случаев реальной эксплуатации в дикой природе нет, речь о продемонстрированной, но не зафиксированной на практике атаке; текст публикации, использованный для пересказа, обрывается до конца хронологии событий.
Риски и подводные камни
Оценка серьёзности уязвимости спорна: исследователь настаивает на высоком или критическом уровне, тогда как присвоенный CVSS-вектор был скорректирован сервисом VulnCheck в сторону меньшей серьёзности. Один из двух основных мейнтейнеров ansi2html на момент публикации так и не ответил на сообщение об уязвимости, что могло замедлить исправление для других проектов, использующих библиотеку. Пострадавшие пользователи builds.sr.ht не могут удалить вредоносные задания сборки, только скрыть их, то есть последствия эксплуатации потенциально необратимы даже после исправления самой уязвимости.
«Напишите мне через две недели»
— Себастьян Пиппинг, мейнтейнер ansi2html