
WebAssembly (WASM) 🌍 は、C、C++、Rust、GO などの高級言語を最新の Web ブラウザーでシームレスに実行できるようにする、最先端のバイナリ命令形式です。しかし、CVE-2021-38297 🚩 の発見により、GO でコンパイルされた WASM バイナリに対する GO のコンパイルおよびロード処理に重大な欠陥があることが明らかになりました。GO が提供する JavaScript WASM ローダー (wasm_exec.js) で見つかったこの脆弱性は、argv 引数にデータを無制限に含めることを許容していました。argv は WASM のリニアメモリに保存されるため、悪意のある攻撃者は、過大なサイズの argv 入力を使用して GO コンパイル済み WASM プログラムのリニアメモリを上書きし、予測不能で潜在的に危険な結果を引き起こす可能性がありました。この脆弱性は、GO 1.17.2 より前のバージョンでは重大な問題でした。
要約:
argv 変数とメモリアドレス 0x5000 にある投稿を介してコメントを処理します。toLeetSpeak や processSharedVar などの関数は、それぞれコメントと投稿のコンテンツに使用されます。私たちの概念実証では、投稿とコメントを通じてユーザー生成コンテンツを許可する模擬ソーシャルメディアプラットフォーム「Vuln-Twitter」を紹介します。Node.js Web サーバーとデータ保存用の SQLite を利用し、Vuln-Twitter のフロントエンドは、動的コンテンツレンダリングのために、プレーンな JavaScript と wordprocessor.wasm という GO WASM モジュールを組み合わせて使用します。このモジュールには特に toLeetSpeak などのメソッドが含まれており、ユーザー入力を魅力的なユーザーエクスペリエンスのためのスタイル化された「LeetSpeak」に変換します。

私たちの調査により、各コメントが GO WASM モジュールによって変換されるコンテンツレンダリングフェーズに、重要な悪用ポイントがあることが明らかになりました。特別に細工された過大なコメントはこの脆弱性を引き起こし、元の投稿コンテンツを操作するバッファオーバーフローを引き起こして、古典的な Stored XSS 攻撃ベクトルを示します。この脆弱性は、悪意のあるデータ操作の可能性を浮き彫りにするだけでなく、Web 開発と WASM アプリケーションの文脈における安全なプログラミング慣行の広範な影響も強調します。
同じ処理を行うコードセクションを参照してください:

コメントレンダリング時の WASM リニアメモリ図:

この脆弱性をさらに調査したい愛好家や研究者のために、特定の脆弱なバージョンの GO を使用してエクスプロイト環境を再現する詳細な手順を提供します。この実践的なアプローチにより、脆弱性の仕組みと潜在的な緩和戦略についてより深く理解できます。
注: これを再現するには、このシナリオで使用されている脆弱なバージョンである go バージョン go1.17.1 をローカルにインストールする必要があります。特定の Go バージョンのインストール方法については、公式の 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 を通じて Web 環境に高級プログラミング言語を統合することによってもたらされる課題と機会について、貴重な洞察を提供します。これは、ソフトウェア開発におけるセキュリティ慣行の批判的検討を促し、脆弱性管理への積極的なアプローチと安全なコーディング標準の採用を促します。
私たちの理解に基づくと、GO のリニアメモリレイアウトは以下のように示されます:

カーネギーメロン大学の学生として、CVE-2021-38297 に関する私たちの調査は、サイバーセキュリティに関するより広範な学術的および専門的議論に貢献し、新興技術がソフトウェアセキュリティに与える影響に関する実践的なケーススタディを提供します。レビュー可能なプレゼンテーション資料は、私たちの調査結果と方法論をさらに詳しく説明し、サイバーセキュリティコミュニティ内の対話とコラボレーションを促します。
このプロジェクトは、献身的な学生と研究者のチームが中心となって進めた、共同研究と学術的探究の証です:
この概念実証は、複数のユーザーがコンテンツやコメントを投稿できるソーシャルメディアアプリケーション Vuln-Twitter を示しています。Node.js で構築された Web サーバーは、SQLite を使用して投稿データとコメントデータを保存します。
フロントエンドは、wordprocessor.wasm という GO WASM モジュールとともにプレーンな JS を採用しています。このモジュールは toLeetSpeak などのメソッドを公開しており、入力文字列を「LeetSpeak」に変換します(例: "Hello!" は "h3ll0!" になります)。
GO WASM モジュールは、投稿とコメントを LeetSpeak でレンダリングするのに役立ちます。
フロントエンドのレンダリングプロセスでは、サーバーから投稿とコメントを受け取ると、各コメントは GO WASM モジュールを使用して「LeetSpeak」にレンダリングされます。各投稿のコメントは、GO WASM モジュールのロード後に argv 変数の一部として渡されます。
さらに、GO モジュールには processSharedVar() というメソッドがあり、アドレス 0x5000 にある文字列を読み取り、簡略化した発話に変換するように設計されています(例: "How are you?" は "How r u?" になります)。元の投稿は、このメソッドがアクセスできるようにリニアメモリ内の 0x5000 に明示的に追加され、投稿コンテンツを変更します。
CVE-2021-38297 とその広範な影響をさらに深く調査したい方のために、公式のセキュリティ速報から技術ブログや学術論文まで、厳選したリソースと関連資料のリストを提供します。これらの資料は、脆弱性、ソフトウェアセキュリティへの影響、および Web アプリケーションの安全性と完全性を確保するための継続的な取り組みについて、包括的な洞察を提供します。
オリジナル開発リポジトリ : https://github.com/gkrishnan724/CVE-2021-38297