プロジェクト NandX

Deeper than Ever Before
Exploring, Subverting, Breaking and Pivoting with NAND Flash Memory...
A story of Research by:
Josh”m0nk” Thomas
PacSec 2013
/
@m0nk_dot
./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ステージの現実


ローNANDを探す

オープンソースカーネル
30以上の機種を購入、テスト、返品
プロジェクトNandX:
すべての携帯を調査
プロジェクトNandX:
Sony Xperia Arc S!
プロジェクトNandX:
MTDサブシステム
プロジェクトNandX:
APIを変更

実施するのはAPIを正しくない順序で叩くだけ



例外はBBTのOOB書き込みだけ
ステップ:

ブロックを1つ選択し、内容を消去

ブロック全体に0xDEADBEEFを書き込む

そのブロックを不良としてマーク ( ソニーの場合、OOBに0x00)

任意のデータを読み書き
カーネルがクラッシュしリブート
プロジェクトNandX:
デモ
http://youtu.be/AE_oUkKKaBY
プロジェクト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>/Documenta
tion/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/ar
m/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/ar
m/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