
: x86プロセッサファザー
sandsifterは、プロセッサの命令セットを検索するために機械コードを体系的に生成し、実行中の異常を監視することで、x86プロセッサの隠された命令やハードウェアバグを監査します。sandsifterは、すべての主要ベンダーから秘密のプロセッサ命令を発見しました。また、逆アセンブラ、アセンブラ、エミュレータにおける広範なソフトウェアバグ、エンタープライズハイパーバイザの欠陥、そしてx86チップにおける良性およびセキュリティ上重要なハードウェアバグの両方を明らかにしました。
x86プロセッサが多数存在する中で、このツールの目的は、ユーザーが自身のシステムで隠された命令やバグを確認できるようにすることです。
プロセッサの基本監査を実行するには:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t

コンピュータは体系的に異常な命令をスキャンします。上半分には、sandsifterが現在プロセッサでテストしている命令が表示されます。下半分には、sandsifterが見つけた異常が報告されます。
検索には、プロセッサの速度と複雑さに応じて、数時間から数日かかります。完了したら、結果を要約します:
./summarize.py data/log

通常、プロセッサ上で数百万の文書化されていない命令が見つかりますが、これらは一般的に少数の異なるグループに分類されます。異常をビニングした後、summarizeツールは各命令を問題カテゴリに割り当てようとします:
「Q」を押して終了し、システムスキャンのテキストベースの要約を取得します:
スキャンの結果は、ツールが自動的に分類するのが難しい場合があり、手動分析が必要な場合があります。結果の分析についてのヘルプが必要な場合は、./data/logファイルを[email protected]に送信してください。このログには、プロセッサのメーカー、モデル、リビジョン(/proc/cpuinfoから)以外の個人情報は含まれていません。
sandsifterを使ったスキャンにより、数十のオペコードカテゴリにわたる文書化されていないプロセッサ機能、エンタープライズハイパーバイザの欠陥、ほぼすべての主要な逆アセンブリおよびエミュレーションツールのバグ、そしてプロセッサ自体のセキュリティ脆弱性を引き起こす重大なハードウェアバグが明らかになりました。
結果の詳細はプロジェクトのホワイトペーパーにあります。
(TODO: 詳細な結果の列挙はこちら)
sandsifterは最初にCapstone逆アセンブラをインストールする必要があります:http://www.capstone-engine.org/。Capstoneは通常次のようにインストールできます:
sudo apt-get install libcapstone3 libcapstone-dev
sudo pip install capstone
sandsifterは次のようにビルドできます:
make
そして次のように実行します:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
フラグは--flagでシフターに、-- -fでインジェクターに渡されます。
例:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
シフターフラグ:
--len
すべての命令の長さの違いを検索(逆アセンブラが期待したのと異なる実行をした命令、または逆アセンブラが期待した時点で存在しなかった命令)
--dis
有効な命令の長さの違いを検索(逆アセンブラが期待したのと異なる実行をした命令)
--unk
未知の命令を検索(逆アセンブラが認識していないが正常に実行される命令)
--ill
--unkの逆で、無効な逆アセンブリを検索(正常に実行されないが逆アセンブラが認識している命令)
--tick
現在の命令を定期的にディスクに書き込む
--save
終了時に検索の進行状況を保存
--resume
最後に保存した状態から検索を再開
--sync
検索結果が見つかったらすぐにディスクに書き込む
--low-mem
結果をメモリに保存しない
インジェクターフラグ:
-b
モード:ブルートフォース
-r
モード:ランダムファジング
-t
モード:トンネルファジング
-d
モード:外部指向ファジング
-R
生出力モード
-T
テキスト出力モード
-x
定期的な進行状況をstderrに書き込む
-0
null参照を許可(sudoが必要)
-D
重複プレフィックスを許可
-N
NXビットサポートなし
-s seed
ランダム検索におけるシード値
-B brute_depth
ブルートフォース検索における最大検索深度
-P max_prefix
検索する最大プレフィックス数
-i instruction
検索を開始する命令(含む)
-e instruction
検索を終了する命令(含まない)
-c core
検索を実行するコア
-X blacklist
指定された命令をブラックリストに追加
-j jobs
同時に実行するジョブの数
-l range_bytes
各サブ範囲の基本命令バイト数
m: モード - シフターの検索モードを変更(ブルートフォース、ランダム、またはトンネル)
q: 終了 - シフターを終了
p: 一時停止 - 検索を一時停止または再開
スキャンは4つの異なる検索アルゴリズムをサポートしており、コマンドラインで設定するか、ホットキーで切り替えることができます。
sudo
最良の結果を得るには、ツールをrootユーザーとして実行する必要があります。これは、プロセスがアドレス0のページをメモリにマッピングできるようにするために必要であり、root権限が必要です。このページにより、多くの命令がメモリアクセスでセグメンテーションフォールトを引き起こすのを防ぎ、より正確な障害分析が可能になります。
プレフィックス
命令検索の深さの主な制限は、探索するプレフィックスバイトの数です。プレフィックスバイトが1つ増えるごとに、検索空間は約10倍になります。プレフィックスバイトは-Pフラグで制限します。
カラー
シフターのインターフェースは256色のターミナル向けに設計されています。ターミナルによって詳細は大きく異なりますが、おおまかには次のように設定できます:
export TERM='xterm-256color'
GUI
インターフェースは、ターミナルが少なくとも一定のサイズであることを前提としています。インターフェースが正しく表示されない場合は、ターミナルサイズを大きくしてみてください。これは多くの場合、ターミナルのフォントサイズを小さくすることで実現できます。
場合によっては、グラフィカルフロントエンドなしでツールを実行することが望ましい、または必要になることがあります。これはインジェクターを直接実行することで行えます:
sudo ./injector -P1 -t -0
直接インジェクターを呼び出した結果をフィルタリングするには、grepを使用できます。例えば、
sudo ./injector -P1 -r -0 | grep '\.r' | grep -v sigill
プロセッサと逆アセンブラが命令長について一致しなかった(grep '.r')が、命令が正常に実行された(grep -v sigill)命令を検索します。
ターゲットファジング
多くの場合、ファザーを特定のターゲットに向けることは価値があります。例えば、エミュレータが繰り返しの「lock」プレフィックス(0xf0)周辺に欠陥を持っていると疑われる場合、-i および -e フラグを使用してファザーにこの命令空間の領域を検索させることができます:
sudo ./sifter.py --unk --dis --len --sync --tick -- -t -i f0f0 -e f0f1 -D -P15
レガシーシステム
より古いシステム(i586クラスのプロセッサ、低メモリシステム)をスキャンするには、シフターに--low-memフラグを、インジェクターに-Nフラグを渡します:
sudo ./sifter.py --unk --dis --len --sync --tick --low-mem -- -P1 -t -N
スキャンが速すぎる(例えば、数秒で完了する)場合、それは通常、スキャンしているプロセッサにこれらのフラグが必要であるためです。
32ビット vs 64ビット
デフォルトでは、sandsifterはホストオペレーティングシステムのビット数をターゲットとしてビルドされます。ただし、一部の命令は32ビットプロセスで実行された場合と64ビットプロセスで実行された場合で動作が異なります。これらのシナリオを調べるには、64ビットシステム上で32ビットのsandsifterを実行することが有益な場合があります。
64ビットシステム上で32ビットのsandsifterをビルドするには、Capstoneを32ビットとしてインストールする必要があります。その手順は にあります。
sandsifterはChristopher Domas(@xoreaxeaxeax)による研究プロジェクトです。
その後、sandsifterを32ビットアーキテクチャ用にビルドする必要があります:
make CFLAGS=-m32
これにより、64ビットシステム上で32ビットの命令空間を探索できます。