Содержание статьи
Баг нашел Андре Баптиста (André Baptista) в рамках ивента H1-702 2018. Уязвимость заключается в некорректном механизме обработки кастомной URL-схемы x-github-client://
, с помощью которой происходит общение с приложением.
Тестовый стенд
Так как сегодня рассматриваемая уязвимость работает только в macOS, все манипуляции будут производиться в ней. Я скачал виртуальную машину для VMware с macOS 10.14.1 Mojave на одном всем известном трекере.

Теперь нужно установить XCode и менеджер пакетов brew.
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Разработчики GitHub не предоставляют возможность скачивать старые версии приложения. Поэтому придется компилировать его из исходников. Клонируем репозиторий с десктопным клиентом GitHub и не забываем, что последняя уязвимая версия — 1.3.4 beta 0, ее мы и будем использовать.
$ git clone --depth=1 -b release-1.3.4-beta0 https://github.com/desktop/desktop.git
Клиент разработан на основе фреймворка Electron и написан на TypeScript с использованием React. А это значит, что нам понадобится Node.js с кучей библиотек. Чтобы понять, как скомпилировать приложение, можно заглянуть в файл appveyor.yml
. Это конфигурационный файл для сервиса системы непрерывной интеграции (CI) с таким же названием AppVeyor.
/desktop-release-1.3.4-beta0/appveyor.yml
install:
- cmd: regedit /s script\default-to-tls12-on-appveyor.reg
- ps: Install-Product node $env:nodejs_version $env:platform
- git submodule update --init --recursive
- yarn install --force
Git у нас уже имеется, а вот менеджер пакетов yarn
нужно установить с помощью brew
.
$ brew install yarn
Он уже идет в комплекте с Node, но имеющаяся версия слишком нова для нашего проекта.
/desktop-release-1.3.4-beta0/appveyor.yml
environment:
nodejs_version: '8.11'

Поэтому устанавливаем версию из ветки 8.х.
$ brew install node@8
Затем заменяем версию «Ноды» на более старую с помощью команд link/unlink.
$ brew unlink node
$ brew link node@8 --force --overwrite

Все готово для компиляции. Сначала последовательно выполняем команды из раздела install
. Это подгрузит все необходимые зависимости и пакеты.
$ git submodule update --init --recursive
$ yarn install --force

После этого переключаемся на команды из раздела build_script
.
/desktop-release-1.3.4-beta0/appveyor.yml
build_script:
- yarn lint
- yarn validate-changelog
- yarn build:prod
Причем первые две можно пропустить и обойтись только последней.
$ yarn build:prod

Теперь в директории /dist/GitHub Desktop-darwin-x64/GitHub Desktop.app
находится готовое приложение. Можно скопировать его в папку Applications и запустить.

Пройди начальную настройку, и стенд готов.
Детали уязвимости
Посмотрим на исходники. Нас интересует, какие протоколы регистрирует приложение.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»