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
© Copyright 2025 ExpyDoc