Valve признала свою ошибку, когда хакер Василий Кравец опубликовал второй 0day для Steam

в 6:31, , рубрики: Steam, Valve, xi-tauw, Василий Кравец, Игры и игровые приставки, информационная безопасность, разработка под windows, Софт
Valve признала свою ошибку, когда хакер Василий Кравец опубликовал второй 0day для Steam - 1

Письмо от HackerOne с уведомлением, что Valve отстранила Василия Кравца от участия в программе bug bounty

Независимый исследователь в области информационной безопасности Василий Кравец из Москвы (xi-tauw) попал в центр большой истории, которая в неприглядном свете выставила компанию Valve. Та отказалась выплачивать Василию вознаграждение за первую уязвимость по программе HackerOne, но он её всё-таки разгласил. А после публикации второй 0day для Steam компания признала свою ошибку — и вчера внесла изменения в правила программы bug bounty.

Это большая победа здравого смысла над бюрократией. Осталось только заплатить Василию и разблокировать его аккаунт.

Всё началось 7 августа 2019 года, когда xi-tauw опубликовал статью об уязвимости с локальным повышением привилегий в клиенте Steam. Как и положено, он заблаговременно уведомил Valve. Однако компания ничего ему не ответила. А через некоторое время платформа HackerOne, которая принимает отчёты и обрабатывает платежи в пользу хакеров за найденные уязвимости, прислала Василию большое письмо с уведомлением, что Valve отстранила его от участия в программе.

Сама уязвимость была технически простой: здесь Василий цитирует свою статью на Хабре, где описан формат SDDL (Security Descriptor Definition Language).

Для клиента Steam строка SDDL выглядит так:

O:SYG:SYD:(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;RPWP;;;BU)

Самая интересная часть (A;;RPWP;;;BU) означает, что любой пользователь из группы Users имеет право запускать или останавливать сервис. Василий внимательно изучил, какие разрешения клиент прописывает в реестре Windows. Оказалось, что для раздела HKLMSOFTWAREWow6432NodeValveSteam явно указан Full control для группы Users, и эти разрешения наследуются всеми подключами в разделе и их подключами тоже. Оставалось только создать симлинк в подразделе — и убедиться, что у него есть полные права:

(A;ID;KA;;;BU)(A;OICIIOID;GA;;;BU)

Имея доступ ко всему реестру из подраздела реестра Steam, несложно превратить эту уязвимость в полное повышение привилегий, говорит специалист.

Проще говоря, если на вашем компьютере установлен клиент Steam, то любая программа (зловред) способна через подраздел Steam в реестре повысить свои привилегии до максимально возможных под Windows.

Уведомление Valve

Пришло время уведомить Valve. «Тут меня ждала первая неожиданность, — пишет Кравец. — Прежде чем передавать уязвимость непосредственно в Valve, мне нужно было сначала убедить hackerone staff в том, что у меня действительно отчет об уязвимости, так как Valve используют функцию „Managed by HackerOne”. Мне не жалко — у меня PoC, который вызывает консоль от имени NT AUTHORITYSYSTEM — доказательства налицо. И я получаю отказ в отчёте. Причиной указывается, что мой отчет вне скоупа исследований, поскольку „атака требует возможности располагать файлы в произвольных путях файловой системы”. Моя реакция: „У меня даже нет ни одной операции с файловой системой, но отказ по такой причине, серьезно?”. Пишу комментарий об этом и приходит другой сотрудник, который всё же берётся проверять уязвимость. Подтверждает её и передает Valve».

Однако через некоторое время отчёт снова отвергли. Причины: «Attacks that require the ability to drop files in arbitrary locations on the user's filesystem» и «Attacks that require physical access to the user’s device» (атака требует физический доступ к устройству пользователя). Оказалось, что атаки на повышение привилегий попросту не входят в программу выплаты вознаграждений Valve на платформе Steam.

В связи с этим через 45 дней с момента отчета Кравец публично раскрыл детали уязвимости — а в ответ получил бан и запрет на участие в программе bug bounty.

Российского исследователя поддержал ещё один известный специалист по безопасности Мэтт Нельсон. Он написал, что зарепортил точно такую же уязвимость, и тоже получил отказ. Нельсон также открыл свой PoC.

Второй 0day

20 августа Valve забанила Василия в своей программе на HackerOne, но это его не осановило — и он выложил второй 0day для клиента Steam, тоже с повышением привилегий.

Он написал на Хабре, что ситуация у Valve такая же плачевная, как и раньше: «Последнее обновление, которое было призвано устранить проблему, легко обходится и уязвимость все ещё актуальна».

Второй 0day тоже позволяет любой программе на компьютере выполнить любой код с максимальными привилегиями, воспользовавшись брешью в клиенте Steam. Общее описание эксплуатации уязвимости довольно несложно и состоит из трёх шагов, пишет xi-tauw:

  1. Подготавливаем окружение для эксплуатации (целых два способа на выбор, используя разные недочеты безопасности).
  2. Заставляем Steam скопировать и запустить нашу dll.
  3. Dll должна соответствовать небольшим требованиям.

После публикации второй 0day история получила ещё более широкий резонанс, а компания Valve опять подверглась обструкции за то, что не включает повышение привилегий в свою программу выплаты уязвимостей. Судя по отсутствию изменений в клиенте Steam, компания как будто вообще не рассматривает несанкционированное повышение привилегий в качестве легитимной уязвимости.

Общественность особенно возмутилось баном исследователя, которому компания словно пытается заткнуть рот: «Это абсолютное нарушение стандартной практики Международной организации по стандартизации (ISO), — комментирует Кэти Муссурис (Katie Moussouris), основатель и исполнительный директор Luta Security, — и запрет сообщать о дальнейших проблемах просто безответственный по отношению к пользователям, которые в противном случае выигрывают от продолжения исследований. Нормы раскрытия уязвимостей искажаются платформами, которые ставят прибыль выше людей».

Valve признала ошибку

Valve признала свою ошибку, когда хакер Василий Кравец опубликовал второй 0day для Steam - 2

Вчера компания Valve опубликовала заявление и признала, что ошибочно отвергла отчёты исследователя о багах в своём программном обеспечении: «Наши правила программы HackerOne должны были отфильтровать только сообщения, что Steam используется для запуска ранее установленного вредоносного ПО на компьютере пользователя. Неправильное толкование правил привело к исключению более серьёзной атаки, которая также выполняла локальную эскалацию привилегий через Steam, — объясняет Valve суть недопонимания. — Мы обновили наши правила программы HackerOne, чтобы явно указать, что эти проблемы находятся в скоупе и подлежат рассмотрению. За последние два года мы вознаградили 263 исследователей в области безопасности, которые помогали нам выявить и исправить примерно 500 проблем безопасности, выплатив более $675 000 в виде вознаграждений. Мы стремимся продолжить работу с сообществом ИБ для повышения безопасности наших продуктов через программу HackerOne».

Новые правила программы HackerOne от Valve специально оговаривают, что «любой случай, который позволяет вредоносному или скомпрометированному программному обеспечению выполнять эскалацию привилегий через Steam, без предоставления административных учётных данных или подтверждения диалога UAC, находится в области действия. Любая несанкционированная модификация привилегированной службы клиента Steam также находится в области действия».

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

По состоянию на вчерашний день он был забанен:

Valve признала свою ошибку, когда хакер Василий Кравец опубликовал второй 0day для Steam - 3

Таким образом, справедливость восторжествовала, но ещё не до конца.

Автор: alizar

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js