
TrustZone対応ARMv8コアのセキュアワールド内のソフトウェアに対するトレース駆動キャッシュ攻撃の実行と可視化を支援するために設計されたツール
Cachegrabは、TrustZone対応ARMv8コアのセキュアワールドで動作するソフトウェアに対するトレース駆動型キャッシュ攻撃の実行と可視化を支援するツールです。Cachegrabの内部動作の概要については、Cachegrabリリースアナウンスを参照してください。
AndroidデバイスでCachegrabを使用することが可能です。最近のAndroidバージョンはカーネルモジュールを許可しないため、CONFIG_MODULESおよびCONFIG_MODULE_UNLOADカーネルオプションを有効にし、カーネルを再ビルドしてデバイスに書き込む必要があります。カーネルソースに対してCachegrabカーネルモジュールをビルドし、insmodを使用してターゲットデバイスの実行中のカーネルに挿入します。
次に、Cachegrabサーバーとshimライブラリをビルドし、両方を/data/local/tmpにコピーします。サーバーを起動します。最後に、adb forward tcp:8000 tcp:8000を使用して、ローカルTCPポート8000をデバイスのポートにバインドします。
警告: サーバーは攻撃者が任意のシェルコマンドを指定して被害者コードを起動することを許可します。これらのコマンドはHTTP経由で指定され、root権限で実行されるため、Cachegrabを実行しているテストデバイスが信頼できるネットワーク上にあることが重要です。
最後に、Cachegrab GUIをロードしてlocalhost:8000に接続します。
Cachegrabクライアントは、攻撃データを含むサンプルを処理するパイプラインの概念を中心に構成されています。パイプラインは、サンプルソース、フィルターのリスト、およびアナライザーで構成されます。サンプルソースは、ファイルシステム上の場所、Cachegrabサーバーを実行しているデバイス、またはカスタムのものにすることができます。パイプラインはソースからサンプルを収集し、各サンプルをパイプライン内のフィルターに通します。フィルターはサンプル内のデータを変更できます。最後に、フィルター処理されたサンプルはアナライザーに渡され、攻撃データの最終処理が行われます。
クライアントの多くはGUIを使用して操作でき、便利なパイプラインのペアを管理する簡単な方法を提供します。最初のパイプラインは、「Scope」パネルで設定されたCachegrabサーバーからサンプルを収集します。これらのサンプルを一連のフィルターに通し、結果のフィルター処理されたサンプルをデータセットに保存します。データセットはGUIを使用してインポートまたはエクスポートでき、サンプルデータの簡単な転送が可能です。2番目のパイプラインは、データセットからサンプルを取得し、別の一連のフィルターにサンプルを通し、フィルター処理されたトレースをウィンドウにプロットします。

cachegrabクライアントのPythonモジュールを直接使用して、収集スクリプトまたは分析スクリプトを作成することもできます。次のスクリプトは、GUIによってエクスポートされたデータセットを取得し、各サンプルのトレースにいくつかの処理を実行し、結果のデータを出力します。
from cachegrab import Pipeline
from cachegrab.data import Dataset, Trace
from cachegrab.sources import DatasetSource
from cachegrab.filters import Filter
from cachegrab.sinks import AnalysisSink
class SampleFilter(Filter):
def filter(self, sample):
for t in sample.get_trace_names():
data = sample.get_trace(t).data
sample.set_trace(t, Trace(data - data.mean()))
return sample
class SampleAnalysis(AnalysisSink):
def analyze_once(self, sample):
for t in sample.get_trace_names():
print sample.get_trace(t).data
dataset = Dataset().load("exported_dataset_location")
pipeline = Pipeline(DatasetSource(dataset), SampleAnalysis())
pipeline.add_filter(SampleFilter())
pipeline.run()