Sandblasterは、バイナリApple Sandboxプロファイルを逆転(再コンパイルする)ツールです。 Apple Sandboxプロファイルは、スキームのような言語であるSBPL( Sandboxプロファイル言語)で記述され、文書化されていないバイナリ形式にまとめられて出荷されます。主にiOSで使用されるサンドボックスプロファイルもMacOSに存在します。 Sandblasterは、私たちの知る限り、バイナリサンドボックスプロファイルを元のSBPL形式に逆転させる最初のツールです。 Sandblasterは、iOS 11を含むバージョン7以降のiOSで動作します。
テクニカルレポートのサンドブラスター:Apple Sandboxを逆転させると、サンドブスターの内部に関する広範な(少し古いものの)情報が提示されます。
Sandblasterは、Dionysus BlazakisとStefan Esserのコードとスライドによる以前の研究に依存していました。
Reverser( reverse-sandbox/フォルダー)とヘルパーツール( helpers/フォルダー)は、任意のPython実行プラットフォームで実行されます。
Sandblasterをインストールしてスタンドアロンを実行する場合がありますが、Iextractor内からインストールして実行することをお勧めします。 IExtractorのドキュメントを確認してください。
Iextractorは、3節BSDライセンスの下でリリースされたオープンソースソフトウェアです。
Sandblasterは、リバーバーにPython2( reverse-sandbox/ )、ヘルパースクリプト用のliefライブラリを備えたPython3( helpers/ )を必要とします。
Sandblasterリポジトリをクローニングした後、Python3のliefをインストールする必要があります。
pip3 install lief
liefのインストールが失敗した場合、コンパイルする必要があります。コンパイルする方法の詳細については、Wikiページにあります。
サンドブラスターを使用するには、バイナリサンドボックスプロファイルとサンドボックス操作にアクセスする必要があります。これは、サンドボックス固有のアクションを定義する一連の文字列です。サンドボックス操作とサンドボックスプロファイルはhelpers/extract_sandbox_data.pyスクリプトを使用して抽出されます。サンドボックスプロファイルは、カーネルサンドボックスエクステンション(iOS 4および9-11のバンドルとして)またはカーネルキャッシュ(iOS 12のバンドルとして)、またはiOSファイルシステムのsandboxdファイル(iOS 5-8用)から抽出されます。サンドボックス操作は、カーネル拡張(iOS 4-11の場合)またはカーネルキャッシュ(iOS 12の場合)から抽出されます。
そのため、入力データとして、SandblasterにはKernelcache、カーネルサンドボックスエクステンション、 sandboxdファイルが必要です。公開されているIPSW( iPhoneソフトウェア)ファイルからそれらの抽出に関する情報とスクリプトは、Iextractorによって提示されます。
以下は、iOS 8.4.1のSandboxプロファイルを逆転させる手順とコマンドです。SandboxKernel拡張子( com.apple.security.sandbox.kext )を想定し、 sandboxdファイルを使用できます。
# Extract sandbox operations from kernelcache.
cd helpers/
./extract_sandbox_data.py -o iPad2,1_8.4.1_12H321.sb_ops iPad2,1_8.4.1_12H321.com.apple.security.sandox.kext 8.4.1
# Extract binary sandbox profile files from sandboxd.
mkdir iPad2,1_8.4.1_12H321.sandbox_profiles
./extract_sandbox_data.py -O iPad2,1_8.4.1_12H321.sandbox_profiles/ iPad2,1_8.4.1_12H321.sandboxd 8.4.1
# Reverse all binary sandbox profiles.
cd ../reverse-sandbox/
mkdir iPad2,1_8.4.1_12H321.reversed_profiles
for i in ../helpers/iPad2,1_8.4.1_12H321.sandbox_profiles/*; do python reverse_sandbox.py -r 8.4.1 -o ../helpers/iPad2,1_8.4.1_12H321.sb_ops -d iPad2,1_8.4.1_12H321.reversed_profiles/ "$i"; done
以下は、iOS 9.3のサンドボックスプロファイルを逆にするための手順とコマンドです。SandboxKernel拡張機能( com.apple.security.sandbox.kext )が利用可能であると仮定します。
# Extract sandbox operations from kernelcache.
cd helpers/
./extract_sandbox_data.py -o iPhone5,1_9.3_13E237.sb_ops iPhone5,1_9.3_13E237.com.apple.security.sandox.kext 9.3
# Extract sandbox profile bundle from kernel sandbox extension.
./extract_sandbox_data.py -O . iPhone5,1_9.3_13E237.com.apple.security.sandox.kext 9.3
cd ../reverse-sandbox/
# Reverse all binary sandbox profiles in sandbox bundle.
mkdir iPhone5,1_9.3_13E237.reversed_profiles
# Print all sandbox profiles in bundle.
python reverse_sandbox.py -r 9.3 -o ../helpers/iPhone5,1_9.3_13E237.sb_ops -d iPhone5,1_9.3_13E237.reversed_profiles/ ../helpers/sandbox_bundle -psb
# Do actual reversing.
python reverse_sandbox.py -r 9.3 -o ../helpers/iPhone5,1_9.3_13E237.sb_ops -d iPhone5,1_9.3_13E237.reversed_profiles/ ../helpers/sandbox_bundle
バイナリサンドボックスプロファイルの抽出は、iOS <= 8とiOS> = 9の間で異なります。iOS> = 9は、カーネルサンドボックスエクステンションのサンドボックスバンドルに保存されるためです。 helpers/extract_sandbox_data.pyスクリプトは、iOSバージョンに応じて適切に抽出します。
reverse_sandbox.pyの-psbオプションは、実際の反転を行わずにサンドボックスバンドルのサンドボックスプロファイルの一部を印刷します。
reverse_sandbox.pyスクリプトは、他のPythonモジュールとlogger.configファイルが必要なため、ディレクトリ( reverse-sandbox/ )で実行する必要があります。
helpers/サブフォルダーには、外部ツールのより良いインターフェイスを提供するヘルパースクリプトが含まれています。
実際の逆転はreverse-sandbox/フォルダーの一部です。ここのファイルは、次のように分類できます。
reverse_sandbox.pyです。コマンドラインの引数を解析し、入力バイナリファイル(抽出セクション)の基本的な解析を行い、他のモジュールから適切な関数を呼び出します。operation_node.pyです。サンドボックスプロファイルに対応するルールグラフを構築し、グラフをSBPLに変換する関数を提供します。 reverse_sandbox.pyによって呼び出されます。sandbox_filter.pyの実装とfilters.json 、 filter_list.py 、 filters.pyの構成によって処理されます。フィルター固有の関数は、 operation_node.pyによって呼び出されます。sandbox_regex.pyおよびregex_parse.pyによって処理されます。 regex_parse.pyは、バイナリ表現を基本グラフに変換するバックエンドパーサーです。 sandbox_regex.pyグラフ表現(オートマトン)を実際の正規表現(つまり、文字列とメタカラクター)に変換します。正規表現を解析するためにreverse_sandbox.pyによって呼び出され、結果の正規表現リストはoperation_node.pyによって公開された関数に渡されます。 operation_node.pyは、サンドボックスフィルター処理ファイルに渡す。reverse_string.pyによって処理されます。 reverse_string.pyの主要なSandboxStringクラスは、 sandbox_filter.pyで使用されます。logger.configファイルで構成されています。デフォルトでは、 INFOとより高いレベルのメッセージがコンソールに印刷され、 DEBUGと高レベルのメッセージがreverse.logファイルに印刷されます。 iOS 12を含むiOSバージョン4以降のサンドブラスターは動作します。Appleはサンドボックスプロファイルのバイナリ形式の更新を行っています:iOS 9サンドボックスプロファイルはバンドルに保存されているため、iOS 10文字列は特殊なバイナリ形式で集約されます。 iOS 11は形式に変更をもたらしませんでした。
ライブディスカッションのためにDiscordにご参加ください。