メモリ破壊エクスプロイトは、必ずしもプログラムの制御フローを攻撃者が書いた命令に置き換える必要はありません。データのみを利用する攻撃では、攻撃者が、プログラムが後で正当なものとして扱う値、たとえばパス、権限フラグ、ファイル名、コマンド引数などを変更します。それでもプログラムは通常のコードを実行し続けます。2024年7月1日付のUSENIX記事は、こうした経路を自動的に見つけ、検証することを目的とした研究ツール「Einstein」を紹介しています。このツールは、そのような攻撃が実用化するには特殊すぎたり、作業量が大きすぎたりするという前提に疑問を投げかけています。

データのみを利用する攻撃に関する記事のUSENIXグラフィック
データのみを利用する攻撃に関する記事のUSENIX表紙グラフィック。www.usenix.org

USENIX公式の記事グラフィックは、記事全体で取り上げている研究情報源を示しています。

この違いが重要なのは、一般的な防御が制御フローの乗っ取りを阻止することに重点を置いているからです。DEPや制御フロー完全性などの防御は、攻撃者が実行を横取りしたり、注入したコードを実行したりできないようにすることを目的としています。一方、データのみを利用する攻撃では、プログラムの意図された制御フローを維持したまま、すでに承認された操作が消費するデータを変更することで、有害な動作を引き起こせます。これはメモリ安全性を回避する攻撃ではありません。メモリ書き込みの欠陥がもたらす、別の結果です。

記事は、単純化したウェブサーバーの例でこれを説明しています。サーバーは通常、設定済みのCGIディレクトリと要求されたスクリプト名を組み合わせ、`execve`を通じてオペレーティングシステムを呼び出します。メモリ安全性の欠陥によってクライアントがディレクトリ変数を`/bin`に上書きできる場合、後続の要求で`/sh`を指定すると、サーバーがシステムシェルを実行する可能性があります。サーバーは同じ操作手順を実行し続けますが、その信頼されたデータが、通常の操作を危険なものに変えるのです。

Einsteinの提案手法は、意図的にアプリケーションに依存しないように設計されています。すべてのプロトコルや業務規則をモデル化するのではなく、プログラムをバイナリレベルで計測し、攻撃者が改変できる可能性のあるデータに印を付け、そのデータがセキュリティ上重要なシステムコールの引数に到達するかどうかを観察します。研究者らは、攻撃者に制御されたデータがそのままの形で機微な引数にコピーされる、特に単純な関係を「同一性データフロー」と呼んでいます。その後、Einsteinは候補となるメモリの書き込みを生成し、プログラムを再起動して、その候補が実際に機能するかを確認します。

この確認段階は重要です。汚染された値がシステムコールに到達しても、それだけで悪用可能性が証明されるわけではありません。後続の入力検証、サンドボックス、アプリケーションロジックによって、意図した効果阻断される可能性があります。そのためツールの開発者は、候補の生成と、実際に動作するエクスプロイトの確認を区別しています。これにより、結果は静的な警告よりも強固になります。一方で、その証拠は、あらゆる攻撃経路ではなく、実際にテストされた経路とワークロードに関するものでもあります。

USENIX記事によると、評価対象には`httpd`、`lighttpd`、`nginx`、`postgres`、`redis`が含まれ、それぞれのテストスイートを使ってワークロードを生成したとのことです。また、`nginx`に対する候補エクスプロイトが確認されたとされています。これらの詳細は、研究者が玩具のような例を超えて、広く導入されているサーバーソフトウェアにも目を向けていたことを示しています。ただし、提供された文章だけでは、列挙された製品がすべて現在脆弱であること、特定の導入済みバージョンが悪用可能であること、またはテストスイートの経路が本番設定で最も重要な経路を表していることは確認できません。

最も有用な運用上の問いは、攻撃が悪意のあるコードを避けるかどうかだけではありません。メモリ書き込み之后に、どの信頼された値がセキュリティ上重要になるのかを問うことです。`execve`が使用するパス、`write`に渡されるファイル名、後で消費される権限関連の値などは、それ以外の通常のコード経路を、影響の大きい操作に変える可能性があります。だからこそ、データフロー解析は重要です。改変可能なバイトがプログラム内をどのように移動し、どこで運用上の意味を持つかを追跡するのに役立つからです。

証拠には限界もあります。この記事はEinsteinを開発した研究者自身によって書かれているため、手法と評価についての彼らの説明を直接裏付けるものです。しかし、すべての対象製品に関する独立したセキュリティ監査ではありません。提供された資料には、エクスプロイトコード、影響を受けるバージョンのリスト、ベンダーの助告、他の解析ツールとの再現可能な比較は含まれていません。したがって、この資料が支える結論は限定的です。データのみを利用する悪用は、メモリ安全性の結果として独立したカテゴリで注目する価値があります。特に、攻撃者が改変可能な状態から機微なシステムコールの引数に到達できる場合にはそうです。

防御側の運用上の示唆は、制御フローの保護に加えて、機微なデータとシステムコールの境界でもチェックを組み合わせることです。メモリ安全性が根本的な問題であることに変わりはありません。しかし、コードの実行を防ぐことは、信頼されたコードを有害に利用されることを防ぐのと同じではありません。Einsteinの価値は、危険なデータフローの一部を見えるようにし、テスト可能にすることにあります。すべてのデータのみを利用する攻撃が容易であることも、あらゆるメモリ安全性の欠陥が悪用可能になることも、このツールは示していません。