В клиенте GitHub для macOS до версии 1.3.4 beta 1 нашлась возможность вызвать удаленное выполнение произвольных команд простым переходом по специально сформированной ссылке. В этой статье я расскажу о причинах возникновения и способах эксплуатации этой уязвимости.

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

 

Тестовый стенд

Так как сегодня рассматриваемая уязвимость работает только в macOS, все манипуляции будут производиться в ней. Я скачал виртуальную машину для VMware с macOS 10.14.1 Mojave на одном всем известном трекере.

Информация о виртуалке с macOS
Информация о виртуалке с macOS

Теперь нужно установить 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'
Установка менеджера пакетов yarn
Установка менеджера пакетов yarn

Поэтому устанавливаем версию из ветки 8.х.

$ brew install node@8

Затем заменяем версию «Ноды» на более старую с помощью команд link/unlink.

$ brew unlink node
$ brew link node@8 --force --overwrite
Даунгрейд версии Node с 11.х до 8.х для корректной компиляции
Даунгрейд версии Node с 11.х до 8.х для корректной компиляции

Все готово для компиляции. Сначала последовательно выполняем команды из раздела install. Это подгрузит все необходимые зависимости и пакеты.

$ git submodule update --init --recursive
$ yarn install --force
Установка зависимостей для компиляции GitHub Desktop
Установка зависимостей для компиляции GitHub Desktop

После этого переключаемся на команды из раздела build_script.

/desktop-release-1.3.4-beta0/appveyor.yml
build_script:
  - yarn lint
  - yarn validate-changelog
  - yarn build:prod

Причем первые две можно пропустить и обойтись только последней.

$ yarn build:prod
Успешная компиляция десктопного приложения GitHub под macOS
Успешная компиляция десктопного приложения GitHub под macOS

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

Окно About приложения GitHub Desktop для macOS
Окно About приложения GitHub Desktop для macOS

Пройди начальную настройку, и стенд готов.

 

Детали уязвимости

Посмотрим на исходники. Нас интересует, какие протоколы регистрирует приложение.

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

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

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

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

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


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

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

    Подписаться

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