Содержание статьи
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.
Что такое «подмодули»?
Во время разработки постоянно возникает необходимость задействовать в своем проекте еще какой-то проект. Например, дополнительную библиотеку, которая независимо используется в нескольких других проектах. Чтобы не плодить копии этой библиотеки и всегда иметь простую возможность обновить ее до последней версии, в 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 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»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»