
: 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でsifterに渡され、-- -fでインジェクタに渡されます。
例:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
sifterフラグ:
--len
search for length differences in all instructions (instructions that
executed differently than the disassembler expected, or did not
exist when the disassembler expected them to
--dis
search for length differences in valid instructions (instructions that
executed differently than the disassembler expected)
--unk
search for unknown instructions (instructions that the disassembler doesn't
know about but successfully execute)
--ill
the inverse of --unk, search for invalid disassemblies (instructions that do
not successfully execute but that the disassembler acknowledges)
--tick
periodically write the current instruction to disk
--save
save search progress on exit
--resume
resume search from last saved state
--sync
write search results to disk as they are found
--low-mem
do not store results in memory
インジェクタフラグ:
-b
mode: brute force
-r
mode: randomized fuzzing
-t
mode: tunneled fuzzing
-d
mode: externally directed fuzzing
-R
raw output mode
-T
text output mode
-x
write periodic progress to stderr
-0
allow null dereference (requires sudo)
-D
allow duplicate prefixes
-N
no nx bit support
-s seed
in random search, seed value
-B brute_depth
in brute search, maximum search depth
-P max_prefix
maximum number of prefixes to search
-i instruction
instruction at which to start search (inclusive)
-e instruction
instruction at which to end search (exclusive)
-c core
core on which to perform search
-X blacklist
blacklist the specified instruction
-j jobs
number of simultaneous jobs to run
-l range_bytes
number of base instruction bytes in each sub range
m: モード - sifterの検索モード(ブルートフォース、ランダム、トンネル)を変更します
q: 終了 - sifterを終了します
p: 一時停止 - 検索を一時停止または再開します
スキャンは4つの異なる検索アルゴリズムをサポートしており、コマンドラインで設定するか、ホットキーで切り替えることができます。
sudo
最良の結果を得るには、ツールをrootユーザーとして実行する必要があります。これは、プロセスがアドレス0のページをメモリにマップできるようにするために必要であり、root権限が必要です。このページにより、多くの命令がメモリアクセス時にセグメンテーションフォルトを発生するのを防ぎ、より正確なフォールト分析が可能になります。
プレフィックス
命令検索の深さの主な制限は、探索するプレフィックスバイトの数です。プレフィックスバイトが1つ増えるごとに、検索空間は約10倍に増加します。プレフィックスバイトは-Pフラグで制限します。
色
sifterのインターフェースは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フラグをsifterに、-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ビットの命令空間を探索できます。