Upload
lajos
View
34
Download
0
Embed Size (px)
DESCRIPTION
Deeper than Ever Before. Exploring, Subverting, Breaking and Pivoting with NAND Flash Memory. A story of Research by: Josh ” m0nk ” Thomas / @m0nk_dot PacSec 2013. ./whoami. 設立パートナーおよびチーフ「破壊」オフィサー @ Atredis Partners ( www.atredis.com ) ハードウェアリバースエンジニアでセキュリティ 研究者 - PowerPoint PPT Presentation
Citation preview
A story of Research by: Josh”m0nk” Thomas / @m0nk_dot
PacSec 2013
Deeper than Ever BeforeExploring, Subverting, Breaking and Pivoting with NAND Flash Memory...
./whoami
設立パートナーおよびチーフ「破壊」オフィサー @ Atredis Partners (www.atredis.com)
ハードウェアリバースエンジニアでセキュリティ研究者
モバイル /スマートフォーン /組み込みシステム
メッシュネットワークファン
AI 、暗号技術とルートキット元開発者
カーネルドライバとハードウェアの境界を好む
[email protected] / @m0nk_dot on twitter
特定の分野に特化したセキュリティ企業
高度なハードウェアおよびソフトウェアアセスメントが専門
モバイルと組み込みシステム
社会的なインフラ
ブラックボックス
高度なマルウェアおよびルートキットの分析
職人的な高度な技術とオーダーメードなリサーチ
whois atredis.com
story arc
NAND フラッシュの紹介とその防御の考え方について ハードウェアとソフトウェア視点からの NAND の動作方法 プロジェクト NandX: 隠ぺいと破壊
攻撃面の選択 プロジェクトとソースコードの紹介 NAND フラッシュにおける防御の考え方とフォレンジック 隠ぺいからその先へ
プロジェクト Burner: プラットフォームの完全なコントロール Thank you / Q&A
NAND と その防御
NAND における防御の考え方
このプレゼンテーションでは、 NAND フラッシュハードウェアの機能上の側面を取り上げる
バグや欠陥ではなく、純粋にハードウェアの機能について
エレガントでコントロールされた故障メカニズムの再利用
このハードウェアの攻撃面を保護できるのは、リエンジニアリングと高度なフォレンジックツールしかない
よりよいツールが必要
NAND の動作
注意 :科学は難しい
NAND の動作 : ハードウェアの概要
バケツ - 技術用語ではないかもしれない
ページ - 通常は 512 バイト、 2048 バイト、もしくは 4096 バイト
ブロック – 通常は 16 キロバイトから 512 キロバイト
初期値は 1 にセットされる (0xFF)
0 にシフトするのは簡単
1 にシフトするのは難しい
NAND の動作 : 罠
電子の配置は容易
1 個の電子をつかむのは非常に困難
NAND の動作 : データの作成
NAND にデータを書き込むには、配置されている電子を取り除けばよい
本質的には、 0xFF からデータ部分を切り抜く
ファイルを保存する場合は、差分を切り抜くもしくは新しいバージョンを生成すべきかを調べる
このため、フォレンジックは困難に
NAND の動作 : エレガントで
コントロールされた故障 ゲートの作成は困難で、しかも
壊れやすい
通常 10,000 回から 100,000回の書き込みで壊れ始める
摩耗が進むため、摩耗を表面全体に分散させるウェアレべリングを実施する
ウェアレベリングが残すごみによってフォレンジックは困難になる
NAND の動作 : NAND フラッシュの種類
ロー NAND フラッシュ
コントローラはすべてソフトウェアによるコントローラ
ハードウェアは単純なストレージにすぎない
マネージド NAND フラッシュ
コントローラはハードウェアに組み込まれている
組み込みチューリングコントローラ
NAND の動作 : マネージド NAND フラッシュ
NAND の動作 : ソフトウェアと Android カーネ
ル ロー NAND = ドライバは複雑に
MMC/eMMC = ドライバはシンプルに
通常はプロプライエタリ な ( 非公開の ) ウェアレベリングアルゴリズムはハードウェアに組み込まれている
ドライバと無関係に、ハードウェアはシステムとやり取りし、故障メカニズムを明らかにしなければならない
NAND の動作 : MTD メタドライバ
MSM / MTD(Memory Technology Devices) サブシステム
メタドライバのようなもの
Android のブートパーティションで多用される
製品によってはすべてのNAND 管理に使用
NAND の動作 : システムの構築
NAND の動作 : コントロールされた失敗の
おさらい
ハードウェアが故障すると、 NAND はフラグを立てるだけのレイジーイレースをおこなう
コントローラには読み書き不良の閾値がある
障害に対応する実装には、誤り訂正符号と 前方誤り訂正による実装がある
NAND の動作 : 避けられない失敗
不良ブロックが検出されると、その NAND ブロックは アウトオブバンドエリア (OOB) と不良ブロックテーブル (BBT)に記録される
そのブロックはアドレス指定システムから消える
消えてしまったブロックを読めるツールは存在しない
不良ブロックをもとに戻すツールも存在しない
NAND の動作 : When things go wrong
システムによっては、 BBT を完全にカーネルメモリで管理している ( リブート中に「マスタ」としてディスクに書き込まれる )
デュアルページの OOB マーカーを BBT と ECC に使うシステムもある (Sony!)
最初もしくは最後のブロックを全体の BBT と ECC に使うシステムもある ( アドレス -10 と考えてよい )
NAND の動作 : 攻撃面の露出
YAFFS などのファイルシステム
ドライバレベルの MTD
Android / Linux カーネル
フラッシュトランジションレイヤー
ハードウェアの組み込みコントローラをリバースエンジニアリング
ユーザランドにおける不適切なコーディング
プロジェクト NandX:隠ぺい
プロジェクト NandX
目標 :
問題が発生していない任意のブロックを不良としてマーク ( アドレスシステムからそのブロックは削除される )
その不良ブロックに任意のデータを読み書き
Android カーネルと dd(1) を含む他のツールが読み書きできないことを確認
予測 :
膨大なハードウェアのリバースエンジニアリングと組み込みコントローラファームウェアのアセスメント
プロジェクト NandX:第 1 ステージの現実
30以上の機種を購入、テスト、返品
ロー NAND を探す
オープンソースカーネル
プロジェクト NandX:すべての携帯を調査
プロジェクト NandX:Sony Xperia Arc S!
プロジェクト NandX:MTD サブシステム
プロジェクト NandX:API を変更
実施するのは API を正しくない順序で叩くだけ
例外は BBT の OOB 書き込みだけ
ステップ :
ブロックを1つ選択し、内容を消去
ブロック全体に 0xDEADBEEF を書き込む
そのブロックを不良としてマーク ( ソニーの場合、 OOB に0x00)
任意のデータを読み書き
カーネルがクラッシュしリブート
プロジェクト NandX:A disappearing act
ブロック 37 が消える
0xDEADBEEF が書きこまれる
もともとその場所には Android のSettings.app (com.android.settings) があった
ハードウェアでダブルフリーが発生し、リブートする
証明にはソースコードが欠かせない
プロジェクト NandX:主要部分のコード
プロジェクト NandX:不良ブロックをマークする
第 1 ステージ
プロジェクト NandX:不良ブロックをマークする
第2ステージ
プロジェクト NandX:ログの概要
プロジェクト NandX:詳細なログ
プロジェクト NandX:最後に
ブロックが不良としてマークされると、現時点でそのブロックを回収できるツールは存在しない
工場出荷時の設定に戻しても回収できない
別の ROM をフラッシュしても回収できない
dd(1) でもそのブロックはコピーできない
0xDEADBEEF は完全に永続的な状態で隠ぺい
プロジェクト NandX:ツールを武器に
プロジェクト NandX:隠ぺいにとどまらない可能性
思考その 1:
目的のデータを削除し、 IT 部門がデータを消去して廃棄するのを待って、物理的にデータを外部に持ち出す
思考その 2:
不良ブロックとしてマークするというのはシステムから完全に削除されるということ ...
プロジェクト NandX:究極の武器
リモートからカーネルモジュールをロードし、物理的な NAND フラッシュのブロックがなくなるまで 1 ブロックづつ削除
修復は不可能でリプレースが必須
携帯電話に限らず、ほぼすべての組み込み機器で NAND が使用されている
SCADA
プロジェクト NandX:この発表の続きについて
機会があれば、リサーチ内容をオープンソースに
ベンダの企業秘密や知的財産が含まれるため、常に可能というわけではない
このプロジェクトは 100%オープンソースのツールで成り立っているため、このリサーチはリリースが可能だった
すべては次の URL に ( かなり長いホワイトペーパーも含む ):
https://github.com/monk-dot/NandX
プロジェクトBurner:
隠ぺいの向こうへ
プロジェクト Burner:概要
仮説 :
Android フォーンのカーネルを完全に管理下におくと、電源と電圧を内蔵バッテリからコントロールし、物理的に内蔵ハードウェアを操作できる。そのプロセスをコントロールし、それぞれのコンポーネントをターゲットを想定外の電圧によって運動学的破壊に至らしめることも可能になる
結果 :
仮説は正しい
プロジェクト Burner:Android の電源ハードウェア
バッテリーは生の電力を供給する
USB スタックもシステムに電源を供給する
パワーマネージメントIC(PMIC) が配線上の電圧を配分する
カーネルが PMIC を直接管理する
配線は必ずしもコンデンサや抵抗で保護されているわけでない
プロジェクト Burner:Android における電圧制御
ドキュメントの場所 :
<kernel_source>/Documentation/power/regulator/overview.txt
ドライバをのぞくと、 10 個以下の C ソースおよびヘッダで基板上の電圧フローを管理している
基盤の種類と無関係に注目すべきは *_regulator.c ファイル
プロジェクト Burner:ターゲット
プロジェクト Burner がターゲットにしたプラットフォームはSony Xperia Z (yuga)
Qualcomm の Snapdragon リファレンスプラットフォームがベースに
NAND コントローラは SD カードコントローラにつながっている
Qualcomm MSM 7X00A SDCC は NAND および SD カードの配線をコントロールしている
プロジェクト Burner:NAND の電圧を上昇させる
project kernel/sony/apq8064/diff −−git a/arch/arm/mach−msm/board−sony_yuga−regulator.cb/arch/arm/mach−msm/board−sony_yuga−regulator.c
−− RPM_LDO(L5, 0, 1, 0, 2950000, 2950000, NULL, 0, 0),++ RPM_LDO(L5, 0, 1, 0, 5900000, 5900000, NULL, 0, 0),−− RPM_LDO(L6, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), ++ RPM_LDO(L6, 0, 1, 0, 5900000, 5900000, NULL, 0, 0),
プロジェクト Burner: NAND の電圧を上昇させる
高電圧によって :
NAND の読み込みは転送過程で破壊
NAND の書き込みはNAND ハードウェアを破壊
PMIC の値は保持されたままなので、デバイスをリブートするとブートローダがカーネルを読み込む際に NAND すべてを破壊
プロジェクト Burner:NAND の電圧を下げる
project kernel/sony/apq8064/diff −−git a/arch/arm/mach−msm/board−sony_yuga−regulator.cb/arch/arm/mach−msm/board−sony_yuga−regulator.c
−− RPM_LDO(L5, 0, 1, 0, 2950000, 2950000, NULL, 0, 0),++ RPM_LDO(L5, 0, 1, 0, 1250000, 1250000, NULL, 0, 0),−− RPM_LDO(L6, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), ++ RPM_LDO(L6, 0, 1, 0, 1250000, 1250000, NULL, 0, 0),
プロジェクト Burner:NAND の電圧を下げる
低い電圧によって :
ほとんどの NAND読み込みは転送過程でデータが破壊
NAND 書き込みはハードウェアレベルで失敗
このテクニックでは携帯電話をただちにフリーズさせ、 NAND への書き込みもすべて失敗に終わり、二度と起動しなくなる
プロジェクトBurner:温度管理
プロジェクト Burner:温度管理
想定外の電圧をかける場合、温度管理デーモンの thermald に注意が必要
このデーモンを停止すべきではなく、単純に無効化する必要がある
これについては別のプレゼンテーションで
最後に
余談 : マルウェアとルートキット
マルウェアはつまらなく、資本主義的な目的で作られていると思われがち
非常に高度かつ高価なツールに目を向けると、こうした見方は一変する
この分野における高度な研究をさらに推進し、拡大するよう訴えたい。オープンな手法で研究する研究者の数はまだ少ない
オープンソース化した理由は、このリサーチ結果を武器として使えないようにするのが目的
ご質問は ?
Thank You - @m0nk_dot