Memory Tagging Extension (MTE)

htARTE(HackTricks AWS Red Team Expert) を通じてゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

基本情報

メモリタギング拡張(MTE)は、バッファオーバーフローや解放後に使用される脆弱性などのメモリ関連エラーを検出および防止することで、ソフトウェアの信頼性とセキュリティを向上させるよう設計されています。MTEはARMアーキテクチャの一部として、各メモリ割り当てに小さなタグを添付し、そのメモリを参照する各ポインタに対応するタグを提供します。このアプローチにより、実行時に不正なメモリアクセスを検出し、これらの脆弱性を悪用して任意のコードを実行するリスクを大幅に低減できます。

メモリタギング拡張の動作方法

MTEは、メモリを小さな固定サイズのブロックに分割し、通常は数ビットのタグを割り当てることによって動作します。

ポインタがそのメモリを指すように作成されると、同じタグが付与されます。このタグは、メモリポインタの未使用ビットに格納され、効果的にポインタを対応するメモリブロックにリンクします。

プログラムがポインタを介してメモリにアクセスすると、MTEハードウェアはポインタのタグがメモリブロックのタグと一致するかどうかをチェックします。タグが一致しない場合、不正なメモリアクセスを示します。

MTEポインタタグ

ポインタ内のタグは、トップバイト内の4ビットに格納されます:

したがって、これにより最大16種類の異なるタグ値が可能となります。

MTEメモリタグ

物理メモリの16Bごとに対応するメモリタグがあります。

メモリタグは、専用のRAM領域に格納されています(通常の使用ではアクセスできません)。16Bメモリタグごとに4ビットのタグを持つことで、RAMの3%まで可能です。

ARMは、これらのタグを専用のRAMメモリで操作するために次の命令を導入しています:

STG [<Xn/SP>], #<simm>    Store Allocation (memory) Tag
LDG <Xt>, [<Xn/SP>]       Load Allocatoin (memory) Tag
IRG <Xd/SP>, <Xn/SP>      Insert Random [pointer] Tag
...

チェックモード

Sync

CPUは命令の実行中にタグをチェックし、不一致があると例外を発生させます。 これは最も遅くて最も安全です。

Async

CPUは非同期的にタグをチェックし、不一致が見つかるとシステムレジスタの例外ビットを設定します。前のものより速いですが、不一致を引き起こす正確な命令を指摘することができず、例外をすぐに発生させず、攻撃者に攻撃を完了する時間を与えます。

Mixed

???

実装と検出の例

ハードウェアタグベースのKASAN、MTEベースのKASAN、またはカーネル内MTEと呼ばれます。 カーネルアロケータ(kmallocなど)は、このモジュールを呼び出し、使用するタグを準備し(ランダムに)、カーネルスペースに割り当てられたメモリにそれをアタッチし、返されたポインタにそれをアタッチします。

要求されたサイズに十分なメモリグラニュール(それぞれ16B)だけをマークします。したがって、要求されたサイズが35で、60Bのスラブが与えられた場合、最初の16*3 = 48Bをこのタグでマークし、残り無効なタグ(0xEと呼ばれる)でマークされます。

タグ0xFすべてのポインタに一致します。このポインタを持つメモリには、そのメモリにアクセスするために任意のタグを使用できます(不一致がありません)。これにより、攻撃が検出されない可能性があります。

したがって、0xEと0xFを予約しているため、タグを生成するために使用できる値は14個だけです。再利用されるタグの確率は1/17 -> 約**7%**です。

カーネルが無効なタグのグラニュールにアクセスすると、不一致検出されます。別のメモリ位置にアクセスする場合、メモリに異なるタグ(または無効なタグ)がある場合、不一致が検出されます。攻撃者が幸運でメモリが同じタグを使用している場合、検出されません。確率は約7%です。

もう1つのバグは、割り当てられたメモリの最後のグラニュールで発生します。アプリケーションが35Bを要求した場合、32から48までのグラニュールが与えられます。したがって、36から47までのバイトは同じタグを使用していますが、要求されていません。攻撃者がこれらの余分なバイトにアクセスすると、これは検出されません

**kfree()**が実行されると、メモリは無効なメモリタグで再タグ付けされるため、free後に使用されると、不一致が検出されます。

ただし、free後に同じチャンクが以前と同じタグで再割り当てされる場合、攻撃者はこのアクセスを使用でき、これは検出されません(約7%の確率)。

さらに、**slabpage_alloc**のみがタグ付きメモリを使用しますが、将来的にはvmallocstackglobalsでも使用される予定です(ビデオの時点ではこれらはまだ悪用される可能性があります)。

不一致が検出されると、カーネルはパニックを起こして、さらなる悪用や攻撃の再試行を防ぎます(MTEには誤検知がありません)。

参考文献

Last updated