Уязвимость в Git, Subversion и Mercurial, допускающая подстановку команд через URL ssh://

Во всех популярных системах управления версиями, которые поддерживают обращение к репозиторию через SSH, выявлена уязвимость, позволяющая выполнить любую команду в системе при попытке обработки специально оформленной ссылки «ssh://» на репозиторий. Проблема уже устранена в Git 2.7.6-2.14.1 (CVE-2017-1000117), Subversion 1.9.7 (CVE-2017-9800) и Mercurial 4.3 (CVE-2017-1000116), а также в GitHub и GitLab. Не исключено, что уязвимость проявляется и в других приложениях, использующих URL «ssh://». Интересно, что похожая уязвимость (CVE-2004-0489) была устранена в браузере Safari ещё в 2004 году.

Суть уязвимости сводится к тому, что при обработке URL «ssh://» допускается использование символа «-» вначале имени хоста, что позволяет использовать это имя для передачи опций ssh. Например, указав:

   git clone ssh://-oProxyCommand=gnome-calculator/wat

в качестве имени хоста при запуске ssh будет передана строка «-oProxyCommand=gnome-calculator», которая будет обработана как опция в ssh. Так как через ssh-опцию ProxyCommand можно вызвать дополнительный обработчик установки соединения с сервером, появляется возможность выполнить любую команду в системе (в примере запускается gnome-calculator).

Для автоматизации атаки на Git злоумышленник может разместить подобный URL в файле .gitmodules подконтрольного ему репозитория. На системах пользователей, клонировавших данный репозиторий, команда злоумышленника будет запущена при выполнении операции «git clone —recurse-submodules». Для защиты от данного вида атак в Git отныне запрещено использование имён хостов и репозиториев, начинающихся с символа «-«.

В GitHub проблема позволяла организовать выполнение кода через манипуляции с настройками Git LFS. Атака осуществлялась через размещение в репозитории файла .lfsconfig, в котором в качестве пути к LFS-хранилищу применялась конструкция вида «url = ssh://-oProxyCommand=some-command». Метод позволяет организовать выполнение произвольного кода на стороне клиентов, клонировавших репозиторий с подобным файлом, при наличии у них плагина Git LFS.

Проблемы с обработкой «ssh://» также были найдены и в GitLab (CVE-2017-12426), причём позволяли выполнить команду на стороне сервера GitLab при попытке импортировать репозитории, указав в web-интерфейсе в секции «Repo by URL» путь, подобный «ssh://-oProxyCommand=some-command».

В Mercurial 4.3 помимо вышеописанной проблемы прекращена поддержка Python 2.6 и устранена ещё одна уязвимость (CVE-2017-1000115), которая позволяет через манипуляцию с символическими ссылками осуществить запись в области ФС за пределами репозитория.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.