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

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

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

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


1 комментарий

  1. Аватар

    mike.wazowsky

    14.01.2019 at 17:31

    «Теперь нужно установить XCode и менеджер пакетов brew.» Ставится не Xcode (IDE), а Xcode Command Line Tools (наиболее использываемы консольные утилиты для разаботчика и компиляторы, включая make, GCC, clang, perl, svn, git, size, strip, strings, libtool, cpp)

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

Check Also

Файлы по рельсам. Как читать любые файлы с сервера через Ruby on Rails

Ты наверняка в курсе, что такое Ruby on Rails, если когда-нибудь сталкивался с веб-девом. …