psj2014 josh pacsec2014-v1-jp - pacsec applied security ... · 営業は、簡単なbyod,...
TRANSCRIPT
PacSec 2014のための探求の物語: @m0nk_dot
@natronkeltner @afrocheese
ドラゴンの来襲�ARM TrustZoneアーキテクチャに潜
む脆弱性を探して
我々は何者なのか�● 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
● Samsung Galaxy S3, Moto X, Sony Xperia Z, HTC One (M7) and HTC One XL, Nexus 5, LG G2, …
● BlackBerry
● Q30, Z10, …
● Windows Phone
● Lumia 830, …
インターフェース�
● SMC[セキュアモニタコール]インターフェース(最も公に研究されてきた)
● 割り込み
● 共有メモリ
● 周辺機器
TrustZoneアーキテクチャの問題�
● TrustZoneは、一般的なカーネルに対してのカーネルのようなもの
● IOCTLのようなインターフェースから設計思想を学んでいない
● ASLR, DEPは無い
● TrustZoneのイメージは平文で格納されている
● 物理メモリのポインタがいたるところにある
● TrustZoneの内部メモリやサービス可用性を保護する為のモデルが多数ある
TrustZoneの保護機能�
● それぞれの関数が個別に入力の妥当性を検査する
● 一部のメーカーはクアルコムの検査コードを利用している
● 独自の検査コードを利用しているメーカーもある
● 独自の検査コードとクアルコムの検査コードを組み合わせて利用するメーカーもある
● クアルコムは、たとえ既に使われなくなった関数であっても、一般的には無効化しない
● HTCは関数を無効化するためのアクセスビットマップを実装している
サービス可用性�
● TrustZoneの裏側では、それぞれのSMCコールは、通常の環境に露出する機能を実装した個別の「サービス」である。
● これらはTrustZone内部で名前が登録されているので、プログラムによって特定できる
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
MSM 8974 ❖ MSM 8960 ❖ 両方
メーカーが実装したサービス�
Moto X
motorola_tzbsp_ns_service
Xperia Z
tzbsp_oem_do_something
tzbsp_oem_s1_cmd
HTC One M7 / XL
tzbsp_oem_do_something tzbsp_oem_enc tzbsp_oem_get_rand tzbsp_oem_log_operator
tzbsp_oem_hash tzbsp_oem_set_simlock_retry tzbsp_oem_get_security_level tzbsp_oem_verify_bootloader
tzbsp_oem_aes tzbsp_oem_set_simlock tzbsp_oem_update_simlock tzbsp_oem_simlock_magic
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コマンド構造体の物理アドレスを格納する。
● 詳細はAndroidカーネルのarch/arm/mach-msm/scm.cを参照
コマンドヘッダー
コマンドバッファー
レスポンスヘッダー レスポンスバッファー
struct scm_command { u32 len; u32 buf_offset; u32 resp_hdr_offset; u32 id; u32 buf[0]; };
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のソースコード�
~ 完 ~