Во всех популярных системах управления версиями, которые поддерживают обращение к репозиторию через 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), которая позволяет через манипуляцию с символическими ссылками осуществить запись в области ФС за пределами репозитория.

Источник: http://www.opennet.ru/opennews/art.shtml?num=47005