MTE は、Android カーネル内および Android システム内の任意のプロセス内で独立して有効にできます。Google は特定の設定を強制せず、デバイス ビルダーに最大限の柔軟性を提供することを目指しています。
この文書では、MTE の設定と適用範囲について説明します。MTE は、Android ユーザーにとって、脆弱性の常時有効な緩和策として、セキュリティとコストのトレードオフを提供するものであると考えています。
カーネル
カーネルの MTE はコマンドラインから設定します。デフォルトでは同期モードが有効です。これは、いくつかの理由により今後変更となる可能性があります。
- パフォーマンスに大きな影響を与えることがわかっており、最適化作業が必要です。
- カーネルコードの品質は、MTE を強制(つまり、障害時パニック)モードで出荷するには不十分であると広く認識されています。
現時点では、製品版デバイスでカーネルの MTE を無効にするよう推奨されています。無効にするには、カーネルのコマンドラインに kasan=off
を追加します。
ユーザー空間
Google は、MTE で保護されるユーザー空間のバイナリのデフォルト リストを提供しています。このリストは、Android のセキュリティからの情報に基づいて作成されており、特権を持つコンポーネントや、信頼できない入力を処理するコンポーネントが含まれています。MTE で推奨されるネイティブ バイナリの最新リストは、Android ビルドシステムの memtag-common.mk ファイルにあります。また現在、NFC、Bluetooth、SecureElement などのいくつかのシステムアプリも含まれています。これらのバイナリとアプリは、デフォルトでは非同期モードで有効になっています。
現時点では、デフォルトのターゲット リストを使用することが推奨されています(変更する必要はありません)。また、コアシステムに対する BSP と OEM の追加を評価し、セキュリティが重視されるものについては MTE を有効にすることをおすすめします。
アプリ
現時点で MTE を使用しているのは、上記の 3 つのシステムアプリのみです。サードパーティ製アプリで MTE を有効にするには、その AndroidManifest.xml
で android:memtagMode
を off
以外の値で指定する必要があります。したがって、Geekbench や AnTuTu などの一般的なベンチマーク スイートは MTE では実行できません。カーネルの MTE も無効化されている場合(上記の kasan=off
を参照)、ベンチマークがパフォーマンスに与える影響は、あったとしても非常に限定的なものになると予想されます。
他のアプリに関しては、Chrome での MTE サポートの開発が活発に行われています。現在の Google Play ストア版の Chrome には、マニフェストに memtagMode=async
設定が含まれています。Android エコシステム内のセキュリティに配慮した多くのアプリ(銀行アプリなど)でも、いずれ同じようになると予想されます。一方で、ゲームなど、高性能の CPU パフォーマンスを要求する一部のアプリは、MTE を無効のまま維持していくと予想されます。
その他のモード
上記の手順では、あらゆる場所で非同期 MTE モードのみを使用します。ハードウェアによっては、他のモードでもほぼ同じ速度、またはまったく同じ速度になる場合があります。また、より優れた診断と、ある程度強力な脆弱性の軽減特性も提供します。
他の設定を 1 つか 2 つテストして、パフォーマンスと消費電力の要件に見合うかどうかを確認することをおすすめします。/sys/devices/system/cpu/cpu*/mte_tcf_preferred
に書き込むことで、システム内の各 CPU コアに MTE モードを設定できます。たとえば、sync
(または asymm
)を書き込むと、非同期モードを要求しているユーザー空間のプロセスが、そのコアでの実行中にサイレントで同期モード(または非対称モード)に自動アップグレードされます。このセットアップは、デバイスの起動時に .rc ファイルで実行できます。
他の設定を 1 つか 2 つ測定し、パフォーマンスと消費電力の要件を満たしているかどうかを確認することをおすすめします。検討に値する設定方法を以下に示します。
- すべてのコアで非対称モードにする。
- 大きいコアで非対称モード、その他のコアで同期モードにする。
プロセスが非同期モード(自動アップグレードの可能性あり)を要求していることを確認するには、次の行に PR_MTE_TCF_SYNC と PR_MTE_TCF_ASYNC の両方が含まれていることを確認します。
debuggerd <PID> | head -30 | grep tagged_addr
残念ながら、プロセスにとって効果的なモードを確認する簡単な方法はありませんが、上記の両方の値を示すプロセスは自動アップグレード動作の対象になります。