Memory Tagging Extension (MTE)

HackTricksのサポート

基本情報

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

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

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
...

チェックモード

同期

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

非同期

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

ミックス

???

実装と検出の例

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

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

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

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

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

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

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

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

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

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

参考文献

Last updated