Недавно GitHub заплатил исследователю премию в $18 тыс. за обнаруженный им баг в консоли управления GitHub Enterprise. Уязвимость открывала возможность удаленного исполнения кода.

Компания уже запатчила брешь в конце января, но публично объявила об этом только на прошлой неделе совместно с человеком, нашедшим уязвимость, — независимым пентестером из Германии Маркусом Фенске (Markus Fenske).

GitHub Enterprise — внедряемая на оборудовании предприятия специальная версия GitHub.com. Возможность эксплуатации открывается при комбинации двух багов, как отметил Фенске.

Один из изъянов объясняется тем, что для криптографической подписи сессии Ruby on Rails на консоли используется статическая величина, хотя для подписи cookie-файла на каждой машине она должна генерироваться случайным образом.

Во вторник GitHub признал, что статическая величина использовалась только при тестировании и разработке продукта, но «из-за не связанной с этим переменой в правах доступа к файлу в текущей версии системы не использовался предполагаемый для этого (случайно сгенерированный) ключ сессии».

«С целью тестирования его заменили статической величиной и забыли об этом, когда тестирование закончилось, — сказал Фенске. — В рабочей среде должен был использоваться механизм, заменяющий статическую величину случайной, но он не сработал».

Хотя GitHub не должен использовать статический ключ для подписи сессионных cookie, по словам Фенске, другая проблема заключалась в том, что сессионные данные можно было сериализовать при помощи Marshal. Marshal, библиотека, конвертирующая группы объектов Ruby в байты, имеет метод .load, который позволяет восстановить сконвертированные в ходе сериализации данные.

Как подчеркнул Фенске, в технической документации к Marshal.load содержится рекомендация «никогда не передавать недоверенные данные, в том числе вводимые пользователем, в этом методе», но это именно то, что делал GitHub.

Зная ключ сессии, атакующий мог сгенерировать поддельный cookie-файл, десериализовать его при помощи Marshal.load и таким образом обманом заставить GitHub исполнить произвольный код.

«Так как секрет известен, можно создать валидную цифровую подпись и передать произвольные данные в Marshal.load, добившись таким образом удаленного исполнения кода», — сказал Фенске.

По словам Фенске, днем он (и это правда!) занимается продажей средств для шугаринга, а ночью — взломами с целью исследования. В прошлом месяце он основал консалтинговую компанию в области ИБ, Exablue, и собирается предоставлять услуги ИБ-аудита, пентестинга и «другие услуги данного спектра». По словам новоиспеченного исследователя, на анализ кода GitHub его вдохновил блог-пост тайваньского хакера Orange Tsai об SQL-инжекте, возможность которого тот обнаружил в платформе.

«Спустя две минуты после декодирования исходника и открытия первого файла (config.ru) в первом приложении (интерфейсе управления) я нашел уязвимость», — признался Фенске.

GitHub закрыл уязвимость 31 января, с выходом версии GitHub Enterprise 2.8.7. Теперь, если изначально сконфигурированный секретный ключ сессии не обнаружен, сервис по умолчанию применяет случайно сгенерированный ключ сессии.

Компания отреагировала на новость об уязвимости довольно быстро, патч был выпущен через пять дней после того, как Фенске доложил о баге. Сам исследователь получил $10 тыс. (на данный момент это наивысшая награда в рамках программы Bug Bounty от GitHub) и место в ее Зале Славы.

​»Мне очень понравилось работать с GitHub, — отметил Фенске. — Для такой большой компании скорость реакции поразительна».

Посылая свой отчет в GitHub, исследователь не знал, что компания объявила о повышении выплат на период с января по февраль включительно в честь третьей годовщины учреждения Bug Bounty на платформе HackerOne.

Предоставив отчет, Фенске узнал, что обнаруженная уязвимость считается уязвимостью высокой степени критичности и обеспечила ему дополнительные $8 тыс. и второе место в конкурсе.

«Я просто писал свою статью и послал в GitHub черновик на проверку, и ответ пришел через несколько минут. Они сказали, что я могу публиковать то, что хочу, и дали еще денег сверху, — изумляется Фенске. — Я не знал о конкурсе и был приятно удивлен».

Баг, найденный Фенске, — один из трех багов в GitHub Enterprise, претендовавших на дополнительную премию. Также компания закрыла две различные уязвимости обхода аутентификации в SAML.

По словам Фенске, в последней версии GitHub Enterprise используется ключ из 16 случайных байт в шестнадцатеричной форме. «Взломать такой ключ на восьмиядерном GPU удастся, по моим расчетам, за 469 142 742 208 гигалет. Ученые считают, что Солнце погаснет через 7,7 гигагода, так что платформа пока в безопасности», — сказал Фенске.

Категории: Уязвимости