ドラゴンの来襲 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のソースコード ~完~
© Copyright 2024 ExpyDoc