Думаю, тебе не нужно рассказывать, что такое 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'

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

Материалы из последних выпусков можно покупать отдельно только через два месяца после публикации. Чтобы продолжить чтение, необходимо купить подписку.

Подпишись на «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

2 комментария

  1. musipusi

    20.06.2018 at 07:39

    гит 2.7.3
    полностью повторяю манипуляции автора
    на шаге
    sh-4.3$ git submodule add —name «../../fuzz.git» git://github.com/Bo0oM/fuzz.txt fuzz
    <-name "../../fuzz.git" git://github.com/Bo0oM/fuzz.txt fuzz
    Cloning into 'fuzz'…
    fatal: Could not chdir to '../../../../../fuzz': No such file or directory

    гит 2.7.11 аналогичный шаг, но ошибка такая
    '../../fuzz.git' is not a valid submodule name

    что я делаю не так ? версии же вроде уязвимые ?

  2. musipusi

    20.06.2018 at 19:35

    решено: надо зафиксить config файл в папке сабмодуля и папку на 5 уровней выше создать с именем fuzz.
    это что касается 2.7.3

    по поводу 2.7.11 видимо патченный

    но совершенно непонятен практический смысл бага.
    если на системе есть возможность выполнять гит и команды исполнять,зачем еще раз получать code exec через жопу если он по итогу даже с теми же правами исполняется?

Оставить мнение

Check Also

Удаленное удаление. Как захватить контроль над WordPress, заставив его стереть файл

В WordPress, самой популярной в мире системе публикации, была обнаружена серьезная уязвимо…