Думаю, тебе не нужно рассказывать, что такое git, — он сегодня используется всеми от небольших компаний до гигантов индустрии. Найденная в нем уязвимость позволяет злоумышленнику атаковать пользователей, которые клонировали специально сформированный репозиторий. Как его формировать? Об этом я сейчас и расскажу.

INFO

Обнаруженные уязвимости получили идентификаторы CVE-2018-11233 и CVE-2018-11235. Они присутствуют в следующих версиях git:

  • все версии ниже 2.17.1;
  • все версии ниже 2.16.4;
  • все версии ниже 2.14.4;
  • все версии ниже 2.15.2;
  • все версии ниже 2.13.7
  • и другие, более ранние версии.

Наибольший интерес представляет баг CVE-2018-11235, который был обнаружен исследователем Этьеном Сталмансом (Etienne Stalmans). Эксплуатация именно этой уязвимости приводит к самым печальным последствиям — выполнению произвольного кода на машине жертвы. Проблема была найдена в рамках программы охоты за ошибками GitHub и затрагивает функции обработки имени подмодуля.

Баг оказался платформонезависимым и прекрасно существует во всех основных операционных системах — Windows, macOS и Linux. Список уязвимых веток приложения обширен, к тому же под угрозой оказались и программы, в которые включена версия Git «из коробки». В основном это разные IDE, такие как Visual Studio и Xcode.

 

Стенд

Думаю, описание установки git на твою машину будет лишней тратой экранного места. Выбирай удобную тебе платформу и качай дистрибутив. Проследи только, чтобы номер версии входил в число уязвимых. Я ради разнообразия буду использовать git для Windows.

Уязвимая к CVE-2018-11235 версия git
Уязвимая к CVE-2018-11235 версия git
 

Что такое «подмодули»?

Во время разработки постоянно возникает необходимость задействовать в своем проекте еще какой-то проект. Например, дополнительную библиотеку, которая независимо используется в нескольких других проектах. Чтобы не плодить копии этой библиотеки и всегда иметь простую возможность обновить ее до последней версии, в git существует понятие подмодуля (submodule). Подмодули позволяют содержать один git-репозиторий как подкаталог другого. Это дает возможность клонировать еще один репозиторий внутрь проекта, при этом в него по-прежнему можно коммитить отдельно.

Посмотрим, как это сделать. Для начала создадим пустой репозиторий.

$ mkdir subvh && cd subvh
$ git init

Допустим, теперь мы хотим использовать в этом проекте крутой словарь для дирбаста. Загрузим его в качестве подмодуля:

$ git submodule add git://github.com/Bo0oM/fuzz.txt fuzz

где fuzz — это название папки, куда будет помещен репозиторий. Теперь, если заглянуть в git status, мы увидим, что появился новый файл .gitmodules.

$ git status

On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
  new file:   .gitmodules
  new file:   fuzz

Этот конфигурационный файл задает соответствие локального пути внутри проекта с адресом репозитория.

$ cat .gitmodules

[submodule "fuzz"]
    path = fuzz
    url = git://github.com/Bo0oM/fuzz.txt
Добавление подмодуля в репозиторий
Добавление подмодуля в репозиторий

Обрати внимание на заголовок файла: в кавычках указывается название подмодуля, оно аналогично названию папки, в которую мы его клонировали. Разумеется, репозиторий может содержать сколько угодно подмодулей, для каждого будет создана отдельная запись в .gitmodules.

Сам файл находится под версионным контролем вместе с другими твоими файлами. Он отправляется при выполнении push и загружается при выполнении pull вместе с остальными файлами проекта.

Однако, кроме появления .gitmodules, в структуре проекта были сделаны и другие изменения. Как ты знаешь, в корне репозитория в папке .git хранятся служебные файлы. Там можно обнаружить директорию modules с подпапкой fuzz. А в ней уже хранится такой же служебный каталог .git, только от нашего подмодуля. В самой папке подмодуля находится файл .git, в котором указано, по какому пути искать служебную директорию.

$ cat fuzz/.git

gitdir: ../.git/modules/fuzz
Служебная папка .git от подмодуля
Служебная папка .git от подмодуля

Пора закоммитить внесенные изменения.

$ git commit -m "Added submodule"

Теперь попробуем клонировать наш свежесобранный репозиторий с подмодулем.

$ cd ..
$ git clone subvh subtest

Заглядываем в папку fuzz и... не видим там ничего.

Попытка клонирования репозитория с подмодулем
Попытка клонирования репозитория с подмодулем

Дело в том, что для автоматической загрузки подмодулей во время клонирования нужно использовать ключ --recurse-submodules или просто --recursive.

$ git clone subvh subtest --recursive

Теперь все в порядке и можно переходить к деталям уязвимости.

$ git clone subvh subtest --recursive

Cloning into 'subtest'...
done.
Submodule 'fuzz' (git://github.com/Bo0oM/fuzz.txt) registered for path 'fuzz'
Cloning into 'D:/VisualHack/subtest/fuzz'...
remote: Counting objects: 323, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 323 (delta 2), reused 0 (delta 0), pack-reused 317
Receiving objects: 100% (323/323), 1.85 MiB | 943.00 KiB/s, done.
Resolving deltas: 100% (197/197), done.
Submodule path 'fuzz': checked out 'b50734ffa4477b8f7d86bca3f9eed648a9b83ed7'

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии