Думаю, тебе не нужно рассказывать, что такое 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. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

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

Вариант 2. Купи один материал

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


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

Линус Торвальдс извинился перед сообществом и временно отстранился от разработки

В рассылке Linux Kernel Mailing List Линус Торвальдс неожиданно объявил о том, что временн…