Уязвимости в Pagure и OBS, допускавшие компрометацию пакетов в репозиториях Fedora и OpenSUSE

Исследователи безопасности из компании Fenrisk раскрыли информацию об уязвимостях в инструментариях Pagure и OBS (Open Build Service), позволявших скомпрометировать инфраструктуры формирования пакетов дистрибутивов Fedora и openSUSE. Исследователи продемонстрировали возможность совершения атаки для выполнения произвольного кода на серверах с Pagure и OBS, что можно было использовать для подстановки изменений в пакеты в репозиториях Fedora и openSUSE.

В платформе Pagure, используемой в Fedora для совместной работы c кодом и метаданными пакетов, выявлены 4 уязвимости. Для эксплуатации выявленных проблем требуется наличие учётной записи в сервисе Pagure, которую может получить любой желающий (в настоящее время в Pagure.io зарегистрировано 24899 пользователей). Три проблемы позволяют прочитать файлы в системе, а одна проблемы выполнить свой код на сервере. Проблемы были выявлены 1 января 2024 года, сообщены через bugzilla.redhat.com 25 апреля 2024 года и устранены в Pagure через 3 часа.

  • Уязвимости CVE-2024-4981 и CVE-2024-47515 вызваны некорректной обработкой символических ссылок в функциях обновления файла и генерации архивов. Уязвимости позволяют прочитать содержимое локальных файлов на сервере, например, можно узнать содержимое файла с параметрами сеанса администратора Pagure и получить доступ с его правами.
    Эксплуатация уязвимости в функции _update_file_in_git() сводится к созданию репозитория в Pagure; добавлению в него коммита с новым файлом, который создан как символическая ссылка на желаемый системный файл; открытию данного файла для редактирования в web-интерфейсе.
  • Уязвимость (CVE-2024-4982) в функции view_issue_raw_file() позволяет выйти за пределы базового каталога через указание символов “/..” в параметрах запрошенного Issue. Проблема позволяет прочитать файлы в системе, насколько позволяют права доступа процесса под которым выполняется web-интерфейс. Например, для просмотра файла /etc/passwd можно открыть страницу “https://pagure.local:5000/your-repository/issue/raw/../../../../../../../etc/passwd”.
  • Уязвимость (CVE-2024-47516) в функции PagureRepo.log(), даёт возможность добиться подстановки своих команд и выполнения кода на сервере. Проблема вызвана тем, что при просмотре истории изменения файла через web-интерфейс вызывается команда “git” с передачей идентификатора ветки в командной строке (например, “/usr/bin/git –pretty=oneline –abbrev-commit — README.md”). Корректность идентификатора не проверяется, поэтому можно вместо него передать любую опцию командной строки, например, “–output=/tmp/foo.bar” для перенаправления вывода в файл. Атакующий может перезаписать файл в системе через отправку запроса следующего вида: https://pagure.local:5000/test/history/README.md?identifier=–output=/tmp/foo.bar

    Pagure выполняется под пользователем git, поэтому перезаписать получится только файлы данного пользователя. Для организации выполнения своего кода на сервере можно воспользоваться сервисом для доступа к репозиторию по SSH, при обращении к которому выполняется команда “bash -c /usr/libexec/pagure/aclchecker.py”. Атакующий может использовать уязвимость для перезаписи файла “/srv/git/.bashrc” и данный файл будет запущен командным интерпретатором bash при обращении к репозиторию по ssh.

    Атака сводится к регистрации в системе Pagure, созданию репозитория, добавлению в репозиторий файла README.md с примечанием к коммиту вида “|| /bin/bash” и отправке запроса “https://pagure.local:5000/test/history/README.md?identifier=–output=/srv/git/.bashrc”. В ходе данных шагов в файл “/srv/git/.bashrc” будет записана строка вида “34а5с43 || /bin/bash”. Для запуска созданного файла “/srv/git/.bashrc” достаточно подключиться к репозиторию по SSH под своей учётной записью. Выполнения кода с правами пользователя git на сервере Pagure позволяет контролировать всё содержимое репозиториев с пакетами.



В платформе OBS (Open Build Service), применяемой в openSUSE и некоторых других дистрибутивах для сборки пакетов, выявлена одна уязвимость (CVE-2024-22033), позволяющая выполнить свой код на сервере. Уязвимость выявлена 27 июня 2024 года, сообщена проекту openSUSE 29 июня и устранена 10 июля.

Уязвимость присутствует в сервисе “obs-service-download_url”, в котором отсутствовала должная проверка URL, применяемого при запуске утилиты wget из скрипта, осуществляющего загрузку исходного кода в OBS. Атакующий может указать в сервисе OBS конфигурацию формируемого пакета, в которой вместо URL для загрузки кода будет указана опция командной строки для wget, например:

–output-document=/tmp/test tempfile

Для обхода возвращения ошибки при попытке запустить wget без URL в примере указана опция “download-manifest”, позволяющая указать список URL в отдельном файле. Вышеуказанный пример приведёт к запуску команды:

/usr/bin/wget -i /srv/obs/service/XXXXX/src/tempfile -4 –output-document=/tmp/test

которая позволяет записать в файл /tmp/test содержимое, загруженное по ссылке, указанной в файле /srv/obs/service/XXXXX/src/tempfile из кода, загруженного атакующим в OBS через интерфейс build.opensuse.org, допускающий свободную регистрацию. Кроме перезаписи файла на сервере, атакующий также может отправить себе любой файл, указав вместо “–output-document” опцию “–post-file”, например, “–post-file=/etc/passwd”. Таким образом атакующий может читать и записывать файлы на сервере, насколько позволяют права доступа, под которым выполняется сервис OBS.

Для того, чтобы превратить возможность записи в файл в выполнение кода на сервере исследователи предложили метод, состоящий из двух этапов. Два этапа необходимы, так атакующий может создать файл “.wgetrc” с настройками к wget, но этого недостаточно для запуска команд. Но при этом, через “.wgetrc” можно создать условия для выполнения в системе любой программы, но без передачи ей аргументов. Для запуска произвольного кода предложено запускать программу “prove”, которая обрабатывает файл конфигурации “.proverc”, допускающий указание опции “–exec” для выполнения любого кода.

На первом этапе через вышеотмеченные манипуляции с “download-manifest” в домашнем каталоге пользователя “obsservicerun” создаётся файл “.proverc”, включающая команды, которые будут выполнены при запуске процесса “prove”. На втором этапе создаётся файл
.wgetrc” с параметром “use-askpass=/usr/bin/prove”, приводящим к вызову “prove”. После появления данных файлов достаточно создать условия загрузки любых данных при помощи wget и это приведёт к запуску кода атакующего на сервере с правами пользователя “obsservicerun”. Прав пользователя “obsservicerun” достаточно для извлечения из репозиториев ключей, используемых пользователями OBS для заверения пакетов.



Release. Ссылка here.