Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
ENLBufferPwn — Information and PoC about the ENLBufferPwn vulnerability | Kitploit
Инструменты/GitHubGitHub/pablomk7/enlbufferpwn
Embedded Systems SecurityVulnerability AnalysisExploitationLearning & EducationBinary Exploitation
GitHubpablomk7/enlbufferpwn

ENLBufferPwn

Information and PoC about the ENLBufferPwn vulnerability

Репозиторий
298112 лет назадПроверено Kitploit

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

ENLBufferPwn (CVE-2022-47949)

CVE:CVE-2022-47949
CVSS v3.1:9.8/10 (критический)
Авторы:PabloMK7, Rambo6Glaz, Fishguy6564
Сообщено:8 августа 2021 г. (Mario Kart 7)
14 апреля 2022 г. (для затронутых игр WiiU и Switch)
Раскрыто:22 декабря 2022 г.

Содержание

  • Описание
  • Детали уязвимости
  • ENLBufferPwn в Mario Kart 7 (3DS)
    • Технические детали
  • ENLBufferPwn в Mario Kart 8
  • Авторы
  • Лицензия

Описание

ENLBufferPwn — это уязвимость в общем сетевом коде нескольких собственных игр Nintendo, начиная с Nintendo 3DS, которая позволяет атакующему удалённо выполнять код на консоли жертвы, просто сыграв с ней в онлайн-игру (удалённое выполнение кода). Она была обнаружена несколькими людьми независимо друг от друга в 2021 году и сообщена в Nintendo в 2021 и 2022 годах. С момента первого сообщения Nintendo исправила уязвимость во многих затронутых играх. Информация в этом репозитории была безопасно раскрыта после получения разрешения от Nintendo.

Уязвимость получила оценку 9.8/10 (критический) в калькуляторе CVSS 3.1.

Ниже перечислены игры, в которых, как известно, когда-либо была эта уязвимость (все перечисленные игры для Switch и 3DS получили обновления, исправляющие уязвимость, поэтому они больше не затронуты):

  • Mario Kart 7 (исправлено в v1.2)
  • Mario Kart 8 (исправлено в v4.2.0)
  • Mario Kart 8 Deluxe (исправлено в v2.1.0)
  • Animal Crossing: New Horizons (исправлено в v2.0.6)
  • ARMS (исправлено в v5.4.1)
  • Splatoon (исправлено в v2.12.1)
  • Splatoon 2 (исправлено в v5.5.1)
  • Splatoon 3 (исправлено в конце 2022 года, точная версия неизвестна)
  • Super Mario Maker 2 (исправлено в v3.0.2)
  • Nintendo Switch Sports (исправлено в конце 2022 года, точная версия неизвестна)
  • Вероятно, и другие...

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

Уязвимость ENLBufferPwn эксплуатирует переполнение буфера в C++-классе NetworkBuffer из сетевой библиотеки enl (Net в Mario Kart 7), используемой во многих собственных играх Nintendo. Этот класс содержит два метода — Add и Set, — которые заполняют сетевой буфер данными, поступающими от других игроков. Однако ни один из этих методов не проверяет, помещаются ли входные данные в сетевой буфер. Поскольку входными данными можно управлять, переполнение буфера на удалённой консоли можно вызвать, просто проведя с атакующим сеанс онлайн-игры. При правильном выполнении жертва может даже не заметить, что на её консоли была вызвана уязвимость. Последствия этого переполнения буфера зависят от игры: от безобидных изменений памяти игры (например, многократное открытие и закрытие домашнего меню на 3DS) до более серьёзных действий, таких как полный захват управления консолью, как показано ниже.

Далее в отчёте основное внимание уделяется Mario Kart 7, поскольку из-за отсутствия мер безопасности (например, ASLR) на 3DS это самый серьёзный случай проявления уязвимости. Однако обойти ASLR в играх для Switch, возможно, можно, перехватив NetworkBuffer, используемый для отправки данных обратно атакующему (и заставив его раскрывать указатели на кучу и код).

ENLBufferPwn в Mario Kart 7 (3DS)

На следующем видео показан серьёзный случай проявления уязвимости в Mario Kart 7, где консоль, контролируемая атакующим (слева), полностью перехватывает управление немодифицированной консолью (справа). Единственное действие пользователя — присоединение к сеансу онлайн-игры с атакующим; в данном случае использовалась функция «сообщества» (обратите внимание, что «сообщество» использовалось для безопасного тестирования уязвимости в изолированной среде, чтобы не затронуть других пользователей, играющих в публичных лобби). Захват управления выполняется путём копирования ROP-пейлоада на удалённую консоль и последующего его выполнения. Затем этот ROP-пейлоад использует другие уязвимости в ОС для повышения привилегий и получения полного контроля. На видео удалённая консоль принудительно запускает установщик CFW (SafeB9SInstaller). Используя те же методы, теоретически можно похитить данные учётной записи/банковской карты или делать несанкционированные аудио/видеозаписи с помощью встроенных микрофона/камер консоли.

ENLBufferPwn - Mario Kart 7 Demonstration - Youtube

Технические детали

Как уже упоминалось, уязвимость возникает из-за недоработки в двух методах класса NetworkBuffer. Ниже приведена реализация класса и методов на C++:

root@kitploit:~
class NetworkBuffer
{
public:
    u8	bufferType;
    u8* dataPtr;
    u32 dataSize;
    u32 currentSize;

    void Set(u8* newData, u32 newDataSize);
    void Add(u8* newData, u32 newDataSize);
}

void NetworkBuffer::Set(u8* newData, u32 newDataSize)
{
    memcpy(this->dataPtr, newData, newDataSize);
    this->currentSize = newDataSize;
}

void NetworkBuffer::Add(u8* newData, u32 newDataSize)
{
    memcpy(this->dataPtr + this->currentSize, newData, newDataSize);
    this->currentSize += newDataSize;
}

Как видите, ни Set, ни Add не проверяют, помещается ли входящий newDataSize в размер буфера (dataSize). Поскольку этот класс NetworkBuffer используется как универсальный контейнер для обмена данными между игроками в сети, содержимое newData и значение newDataSize могут контролироваться атакующим, что позволяет выполнить переполнение буфера.

Ещё одна особенность сетевой библиотеки — асинхронность, благодаря которой игры могут выполнять другие операции, пока данные заполняют буфер. Для этого используется техника двойного буфера. Благодаря этому игра может обращаться к уже полученным данным в NetworkBuffer в то же время, когда поступают новые данные. После заполнения второго NetworkBuffer буферы меняются местами, и цикл повторяется.

В этом PoC эксплуатируется двойной NetworkBuffer, используемый для получения данных Mii (bufferType = 9). Из-за порядка выделения памяти в куче объект NetworkBuffer и его содержимое оказываются расположенными рядом друг с другом. Кроме того, оба буфера, входящие в двойной буфер, расположены в памяти смежно. На следующей диаграмме показано, как выглядит память после выделения буферов:

Representation of the mii data double NetworBuffer in the game's heap

Далее буфер в верхней части изображения будет обозначаться как Buffer0, а буфер в нижней части — как Buffer1. Используя эти знания, атакующий может вызвать переполнение буфера в Buffer0, чтобы перезаписать атрибуты Buffer1, включая его член dataPtr. Поскольку игры 3DS не реализуют ASLR, все адреса памяти на удалённой консоли известны, поэтому dataPtr можно указать на произвольное место. Когда игра поменяет буферы местами, новые данные будут скопированы в произвольное место. Выполняя следующие шаги, на удалённую консоль можно скопировать пейлоад любого размера:

  1. Создайте специально сформированный пейлоад и отправьте его в Buffer0. Это вызовет переполнение на удалённой консоли, перезаписав dataPtr буфера Buffer1.
  2. Заполните Buffer1 произвольными данными. Они будут скопированы по произвольному адресу, на который указывает dataPtr буфера Buffer1 удалённой консоли.
  3. Увеличьте произвольный адрес и размер и начните заново с шага 1.

Ниже показана анимация нормальной работы игры, а затем выполнения описанных выше шагов.

Animation of the normal operation of the double buffers, followed by vulnerability operation

Этот репозиторий содержит PoC, который эксплуатирует эту уязвимость для выполнения следующих операций в зависимости от флагов компилятора:

  • Отправить 4-байтовое значение, которое записывается по адресу статуса приложения на удалённой консоли, принудительно закрывая его и возвращая в домашнее меню.
  • Отправить ROP-пейлоад, который сохраняется в памяти удалённой консоли. После отправки ROP стек перезаписывается, и игра выполняет его (сам ROP-пейлоад в PoC не предоставляется).

Имейте в виду, что этот PoC не реализует никакого обнаружения потери пакетов, поскольку связь между консолями осуществляется через UDP. Для достижения наилучших результатов следует реализовать обработку потери пакетов в коде PoC или разместить консоли в одной сети, чтобы снизить вероятность потери пакетов.

Возможное исправление уязвимого класса NetworkBuffer также предоставлено.

ENLBufferPwn в Mario Kart 8

Уязвимость также присутствует в версиях Mario Kart 8 для WiiU и Switch, но продемонстрирована только для релиза игры на WiiU.

  • Для PoC требуется старая версия NintendoClients, в которой реализованы коммуникации PIA
  • За дополнительной информацией вы можете обратиться к этому отчёту на HackerOne: https://hackerone.com/reports/1541273
  • Более подробное описание будет добавлено сюда позже

Авторы

Хотя эта уязвимость была обнаружена несколькими пользователями независимо, многие из них решили сохранить информацию об уязвимости в тайне. Однако следующие люди ответственны за безопасное раскрытие уязвимости компании Nintendo:

  • PabloMK7 (GitHub, Twitter)
  • Rambo6Glaz (GitHub)
  • Fishguy6564 (GitHub, Twitter)

Лицензия

CC0
Насколько это возможно по закону, PabloMK7, Rambo6Glaz и Fishguy6564 отказались от всех авторских и смежных прав на ENLBufferPwn. Эта работа опубликована из: Испании.

Скачать инструмент