ドラゴンの来襲 - PacSec

ドラゴンの来襲
ARM TrustZoneアーキテクチャに潜
む脆弱性を探して
PacSec 2014のための探求の物語:
@m0nk_dot
@natronkeltner
@afrocheese
我々は何者なのか
● 
● 
● 
● 
Josh Thomas
● 
@m0nk_dot / [email protected]
● 
Partner @ Atredis Partners
Nathan Keltner
● 
@natronkeltner / [email protected]
● 
Partner @ Atredis Partners
Charles Holmes
● 
@afrocheese / [email protected]
● 
Principal Research Consultant
Atredis Partners, www.atredis.com
● 
フォーカスかつ特化したセキュリティ会社
● 
高度なハードウェア・ソフトウェア品質評価を専門にしている
TrustZoneの建前
● 
● 
● 
● 
● 
モバイルセキュリティの「究極的な」ソリューションとして盛大に売
り込まれている
営業は、簡単なBYOD, 安全なPIN入力, APTに対する防御の実現を約
束している [1]
建前としては、隔離されたプロセッサコアとメモリーがあって、外部
から影響を与える事は出来ない状態で、プログラムが特権アクセスで
実行される
「普通の世界」が影響を及ぼすどころか気付きすらしない「セキュア
な世界」で処理を行える
機密処理を隠 した状態で実行する事でマルウェアから情報を守れる
技術を欲しがらない人が居るだろうか?
[1] http://www.arm.com/products/processors/technologies/trustzone/index.php
TrustZoneアーキテクチャ
引用元: http://www.arm.com/images/TrustZone_Software_Architecture.jpg
私がTrustZoneに期待した事
● 
マルウェアに絶対盗み見られたくない処理を代わりに行わせる事が出
来て、同じ魔法の箱を使っている他の人には影響を及ぼす事の無い、
セキュアなチップ
● 
ネットバンキングアプリのログイン
● 
音声の暗号化
● 
2要素認証に関係するデータ
● 
パスワード
● 
その他
TrustZoneの現実
とはいえ、それって何に使われているの?
● 
DRM (Widevine, HDCP)
● 
Qfuses
● 
● 
● 
● 
セキュアで書き換え不可能なキーストレージ
● 
ハードウェアの環境設定 (セキュアブートの設定, JTAGの構成, 機器識別子)
メーカー特有の機能
● 
ブートローダーのアンロック (Dan RosenbergのBlack Hat 2014での発表を参照)
● 
SIMのアンロック
カーネルの整合性の監視 / 判定 (サムスンのKnox)
ユーザーがマルウェアから隠したいものではなく、何処かの偉い人がユーザーから隠したいも
の(例: キャリアロック, アメリカ映画協会 等)。
SnapDragonとは
何か?
● 
SoC (システムオンチップ)
● 
QSEEを実行可能(クアルコムのセキュア実行環境)
● 
ARMバスはちょっと見にはクールだ: AMBA: AXI, APB, etc
● 
機器認証はどうやってるのか?
QSEEが動く機器は?
● 
Android
● 
● 
BlackBerry
● 
● 
Samsung Galaxy S3, Moto X, Sony Xperia Z, HTC One (M7) and
HTC One XL, Nexus 5, LG G2, …
Q30, Z10, …
Windows Phone
● 
Lumia 830, …
インターフェース
● 
SMC[セキュアモニタコール]インターフェース(最も公に研究されて
きた)
● 
割り込み
● 
共有メモリ
● 
周辺機器
TrustZoneアーキテクチャの問題
● 
TrustZoneは、一般的なカーネルに対してのカーネルのようなもの
● 
IOCTLのようなインターフェースから設計思想を学んでいない
● 
ASLR, DEPは無い
● 
TrustZoneのイメージは平文で格納されている
● 
物理メモリのポインタがいたるところにある
● 
TrustZoneの内部メモリやサービス可用性を保護する為のモデルが
多数ある
TrustZoneの保護機能
● 
それぞれの関数が個別に入力の妥当性を検査する
● 
一部のメーカーはクアルコムの検査コードを利用している
● 
独自の検査コードを利用しているメーカーもある
● 
● 
独自の検査コードとクアルコムの検査コードを組み合わせて利用す
るメーカーもある
クアルコムは、たとえ既に使われなくなった関数であっても、一般的
には無効化しない
● 
HTCは関数を無効化するためのアクセスビットマップを実装してい
る
サービス可用性
● 
● 
TrustZoneの裏側では、それぞれのSMCコールは、通常の環境に露出
する機能を実装した個別の「サービス」である。
これらはTrustZone内部で名前が登録されているので、プログラムに
よって特定できる
MSM 8974 ❖
MSM 8960 ❖ 両方
tzbsp_set_boot_addr
tzbsp_resource_config
tzbsp_write_mss_qdsp6_nmi
tzbsp_milestone_set
tzbsp_is_service_available
tzbsp_memprot_map2
tzbsp_cpu_config
tzbsp_get_diag
tzbsp_memprot_unmap2
tzbsp_cpu_config_query
tzbsp_fver_get_version
tzbsp_memprot_tlbinval
tzbsp_wdt_disable
tzbsp_ssd_decrypt_img_ns
tzbsp_xpu_config_violation_err_fatal
tzbsp_wdt_trigger
ks_ns_encrypt_keystore_ns
tzbsp_xpu_disable_mmss_qrib
config_hw_for_offline_ram_dump
tzbsp_ssd_protect_keystore_ns
tzbsp_dcvs_create_group
tzbsp_video_set_state
tzbsp_ssd_parse_md_ns
tzbsp_dcvs_register_core
tzbsp_pil_init_image_ns tzbsp_ssd_decrypt_img_frag_ns
tzbsp_dcvs_set_alg_params
tzbsp_pil_mem_area
tzbsp_ssd_decrypt_elf_seg_frag_ns
tzbsp_dcvs_init
tzbsp_pil_auth_reset_ns
tz_blow_sw_fuse
tzbsp_graphics_dcvs_init
tzbsp_pil_unlock_area
tz_is_sw_fuse_blown
tzbsp_nfdbg_config
tzbsp_pil_is_subsystem_supported
tzbsp_qfprom_write_row
tzbsp_nfdbg_ctx_size
tzbsp_pil_is_subsystem_mandated
tzbsp_qfprom_write_multiple_rows
tzbsp_nfdbg_is_int_ok
tzbsp_write_lpass_qdsp6_nmi
tzbsp_qfprom_read_row
tzbsp_ocmem_lock_region
tzbsp_set_cpu_ctx_buf
tzbsp_qfprom_rollback_write_row
tzbsp_ocmem_unlock_region
tzbsp_set_l1_dump_buf
tzbsp_prng_getdata_syscall
tzbsp_ocmem_enable_mem_dump
tzbsp_query_l1_dump_buf_size
tzbsp_mpu_protect_memory
tzbsp_ocmem_disable_mem_dump
tzbsp_set_l2_dump_buf
tzbsp_sec_cfg_restore
tzbsp_es_save_partition_hash
tzbsp_query_l2_dump_buf_size
tzbsp_smmu_get_pt_size
tzbsp_es_is_activated
tzbsp_set_ocmem_dump_buf
tzbsp_smmu_set_pt_mem
tzbsp_exec_smc_ext
tzbsp_query_ocmem_dump_buf_size
tzbsp_video_set_va_ranges
tzbsp_exec_smc
tzbsp_security_allows_mem_dump
tzbsp_vmidmt_set_memtype
tzbsp_tzos_smc
tzbsp_smmu_fault_regs_dump
tzbsp_memprot_lock2
メーカーが実装したサービス
HTC One M7 / XL
Moto X
motorola_tzbsp_ns_service tzbsp_oem_do_something tzbsp_oem_enc tzbsp_oem_get_rand tzbsp_oem_log_operator Xperia Z
tzbsp_oem_hash tzbsp_oem_set_simlock_retry tzbsp_oem_get_security_level tzbsp_oem_verify_bootloader tzbsp_oem_do_something tzbsp_oem_aes tzbsp_oem_set_simlock tzbsp_oem_update_simlock tzbsp_oem_simlock_magic tzbsp_oem_s1_cmd tzbsp_oem_read_mem tzbsp_oem_set_ddr_mpu tzbsp_oem_update_smem tzbsp_oem_emmc_write_prot tzbsp_oem_write_mem tzbsp_oem_set_gpio_owner tzbsp_oem_read_simlock tzbsp_oem_access_item tzbsp_oem_disable_svc tzbsp_oem_read_simlock_mask tzbsp_oem_memcpy tzbsp_oem_3rd_party_syscall tzbsp_oem_query_key tzbsp_oem_simlock_unlock tzbsp_oem_memprot tzbsp_oem_key_ladder TrustZone内部の仕切り
● 
● 
ああ、しかもその上に...:
TrustZoneは1つの大きい箱のようなもので、1人のプレーヤーが犯し
た1つの間違いが全員に影響してしまう!
● 
プレーヤー: クアルコム, ディスクレティクス, メーカー, ネットフ
リックス? 等
要約すると...
● 
● 
● 
サービス可用性とメモリアクセスのモデルは...もろい
ほとんどの場合、1つのメモリ書き込み脆弱性で、TrustZoneが台無し
になる思われる。
...そしてこのアーキテクチャは、キノコの如く次々とメモリ書き込み
脆弱性を産み出すように設計されている
SCMコール
● 
ARMのSMC命令を利用して、スーパーバイザーモードやカーネル空
間から呼び出す事が出来る。その際、r0レジスタにSCMコマンド構造
体の物理アドレスを格納する。
コマンドヘッダー
コマンドバッファー
レスポンスヘッダー
レスポンスバッ
ファー
● 
struct scm_command {
u32 len;
u32 buf_offset;
u32 resp_hdr_offset;
u32 id;
u32 buf[0];
};
詳細はAndroidカーネルのarch/arm/mach-msm/scm.cを参照
TrustZoneのサービス
● 
TrustZoneのイメージは
サポートされている全て
のSCMコールのテーブ
ルを保持している
struct scm_service {
u32 id;
char * name;
u32 return_type;
int (*impl)();
u32 num_args;
u32 arg_size[0];
}
● 
イメージが読み込まれた
正しいアドレスを確かめ
るのに有用である
HTCの場合
● 
● 
優秀な基本的関数が っている(write_mem, read_mem, memcpy, …)
HTCはそれぞれのtzbsp_oem関数に対応したアクセスビットマスクを
保持している
● 
それぞれのサービスは不要になった時には無効化出来る
メモリ書き込みの脆弱性
● 
このサービスは入力の妥当性を検証しない!
● 
我々が調べたケース全てでg_fs_statusが0だった
● 
我々にゼロ書き込みの脆弱性をもたらした
メモリアドレスの検証
メモリアドレスの「検証」
● 
lenが非常に大きい場合はどうなる?0xffffffffだったら?
● 
0x2A03F000以上だったらどうか?
● 
0x70000だったら?
tzbsp_oem_memcpy
● 
この関数の方がもっと良いよね?
● 
もし「検証」を全て取り除けたならね。
あっ、そうか。
● 
00 00 = MOV r0, r0
● 
00 00 00 00 = ANDEQ r0, r0, r0
この「NOP脆弱性」を使おう
Exploitのソースコード
~完~