
WebAssembly (WASM) 🌍 — это передовой формат двоичных инструкций, обеспечивающий беспрепятственное выполнение языков высокого уровня, таких как C, C++, Rust и GO, в современных веб-браузерах. Однако обнаружение CVE-2021-38297 🚩 выявило критический недостаток в процессе компиляции и загрузки GO-скомпилированных WASM-бинаров. Эта уязвимость, найденная в JavaScript-загрузчике WASM (wasm_exec.js), поставляемом вместе с GO, допускала неограниченное включение данных в аргумент argv. Поскольку argv хранится в линейной памяти WASM, злоумышленники могли использовать это для перезаписи линейной памяти GO-скомпилированной WASM-программы с помощью чрезмерно большого ввода argv, что приводило к непредсказуемым и потенциально опасным последствиям. Эта уязвимость представляла значительную угрозу в версиях GO до 1.17.2.
Резюме:
argv, а посты — по адресу памяти 0x5000.toLeetSpeak и processSharedVar соответственно.В нашей концепции-доказательстве мы представляем «Vuln-Twitter» — имитацию социальной платформы, которая допускает пользовательский контент в виде постов и комментариев. Vuln-Twitter использует веб-сервер на Node.js и SQLite для хранения данных, а его фронтенд задействует обычный JavaScript вместе с модулем GO WASM под названием wordprocessor.wasm для динамического рендеринга контента. Этот модуль, в частности, включает такие методы, как toLeetSpeak, преобразующие пользовательский ввод в стилизованный «LeetSpeak» для увлекательного пользовательского опыта.

Наше исследование выявляет критическую точку эксплуатации на этапе рендеринга контента, когда каждый комментарий преобразуется модулем GO WASM. Специально созданный комментарий увеличенного размера может вызвать уязвимость, приводящую к переполнению буфера, которое изменяет содержимое исходного поста, демонстрируя классический вектор атаки — хранимый XSS. Эта уязвимость не только подчёркивает потенциал вредоносной манипуляции данными, но и указывает на более широкие последствия методов безопасного программирования в контексте веб-разработки и WASM-приложений. Обратитесь к разделу кода, выполняющему это:

Схема линейной памяти WASM при рендеринге комментария:

Для энтузиастов и исследователей, желающих глубже изучить эту уязвимость, мы предоставляем подробные шаги по воспроизведению среды эксплойта с использованием конкретной уязвимой версии GO. Этот практический подход способствует более глубокому пониманию механики уязвимости и потенциальных стратегий смягчения.
Примечание: для воспроизведения необходимо локально установить версию go go1.17.1 — уязвимую версию, используемую в этом сценарии. Обратитесь к официальной документации GO по установке конкретных версий.
Теперь попробуем воспроизвести описанный сценарий:
git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitternpm install для установки всех зависимостей.npm run resetDB, который инициализирует базу данных несколькими постами и комментариями.npm run dev, который запустит локальный сервер. Откройте localhost:3000 в браузере, и вы увидите страницу входа.Теперь войдите с вредоносной учётной записи, используя имя пользователя: I_CANT_HACK, пароль: hacker. После входа вы увидите ленту с несколькими постами.
Этот пост выглядит довольно интересно:
Amazon: ready 4 black friday? https://www.amazon.com/blackfriday
Что если, используя описанную выше технику, мы сможем перезаписать пост от Amazon.com, чтобы он указывал на вредоносную ссылку?
Обратитесь к файлу exploit.txt — он содержит комментарий, заполненный символами «A» в качестве заполнения, так что мы перезаписываем всё вплоть до адреса 0x5000. В конце вы можете увидеть текст ready for black friday? https://evil.com/blackfriday. Если скопировать этот текст и оставить его комментарием к указанному выше посту, мы сможем перезаписать исходный пост этим текстом.
Попробуйте сами и убедитесь :)

Признавая серьёзность этой уязвимости, мы также описываем комплексную стратегию патчинга, использующую обновлённую и безопасную версию GO для снижения риска. Этот раздел служит руководством для разработчиков и системных администраторов по укреплению их приложений против подобных уязвимостей, подчёркивая важность регулярного обновления программного обеспечения и бдительных методов обеспечения безопасности.
В этом приложении я также предоставил скрипт патча, который использует более новую версию go:
npm run patchServerЭто должно перекомпилировать go-файл с новой версией и запустить сервер с пропатченной версией.
Теперь вы должны заметить, что пост больше не перезаписывается, а если вы посмотрите в консоль, то увидите ошибку Argument length too long.

Наше путешествие по эксплуатации и смягчению CVE-2021-38297 даёт ценные идеи о проблемах и возможностях, связанных с интеграцией языков программирования высокого уровня в веб-среды через WASM. Оно побуждает критически пересмотреть методы обеспечения безопасности в разработке ПО, призывая к упреждающему подходу к управлению уязвимостями и внедрению безопасных стандартов кодирования. Основываясь на нашем понимании, мы считаем, что схема линейной памяти GO показана ниже:

Будучи студентами Университета Карнеги-Меллона, наше исследование CVE-2021-38297 вносит вклад в более широкий академический и профессиональный дискурс о кибербезопасности, предлагая практический пример последствий новых технологий для безопасности программного обеспечения. Наши презентационные материалы, доступные для ознакомления, дополнительно разъясняют наши выводы и методологии, приглашая к диалогу и сотрудничеству в сообществе кибербезопасности.
Этот проект — свидетельство совместных исследований и академической работы, возглавляемый преданной командой студентов и исследователей:
Эта концепция-доказательство демонстрирует социальное приложение Vuln-Twitter, позволяющее нескольким пользователям публиковать контент и комментарии. Веб-сервер, построенный на Node.js, использует SQLite для хранения данных постов и комментариев.
Фронтенд использует обычный JS вместе с модулем GO WASM под названием wordprocessor.wasm. Этот модуль предоставляет такие методы, как toLeetSpeak, который преобразует входные строки в «LeetSpeak» (например, «Hello!» становится «h3ll0!»).
Модули GO WASM помогают отображать посты и комментарии в LeetSpeak.
Во время рендеринга во фронтенде, при получении постов и комментариев от сервера, каждый комментарий подвергается рендерингу в «LeetSpeak» с использованием модуля GO WASM. Комментарий для каждого поста передаётся как часть переменной argv после загрузки модуля GO WASM.
Кроме того, в GO-модуле существует метод processSharedVar(), предназначенный для чтения строки, расположенной по адресу 0x5000, и преобразования её в упрощённую речь (например, «How are you?» становится «How r u?»). Исходный пост явно добавляется по адресу 0x5000 в линейную память для доступа через этот метод, изменяя содержимое поста.
Для тех, кто заинтересован в более глубоком изучении CVE-2021-38297 и его более широких последствий, мы предоставляем подборку ресурсов и материалов для чтения — от официальных бюллетеней безопасности до технических блогов и академических работ. Эти материалы дают всестороннее понимание уязвимости, её влияния на безопасность программного обеспечения и текущих усилий по обеспечению безопасности и целостности веб-приложений.
Оригинальный репозиторий разработки : https://github.com/gkrishnan724/CVE-2021-38297