Blackhat USA 2024参加レポート
はじめに
高度解析部高度解析課の倉持です。
本記事では、Blackhat USA 2024に参加した際のレポートについてご紹介します。
弊社の取り組みとして、エンジニアが積極的にカンファレンスやCTFに参加し、最新のセキュリティ技術を学んだり、技術を磨くことが出来るように支援したりする制度があります。
支援してくれた会社をはじめとし、関係者の方々にこの場を借りて感謝申し上げます。
余談ですが、今年はDEFCONとあわせて会社から13人が参加しました。
Blackhat USAについて
例年、米国ラスベガスで開催される大規模な国際セキュリティイベントです。
今年は、8/3 ~ 8/8間にMandalay Bay Convention Centerで開催されました。
最先端のセキュリティ技術や研究のセッションを聴講できるBriefings、セキュリティ企業や専門家が提供するコースで学べるTrainingsなどがあります。
参考: https://www.blackhat.com/about.html
Blackhat USA 2024の様子と動向
各講演の詳細内容については、本ブログでは触れませんが一番印象に残った講演であるAttacking Samsung Galaxy A* Boot Chain, and Beyondについて共有します。
この講演では、単一の脆弱性では悪用が困難な脆弱性を、複数組み合わせて最終的にTEE及びSecure Worldを侵害する一連の攻撃手法やAndroidシステム全体に影響を与える攻撃について紹介していました。
Samsung GalaxyシリーズのA225Fでは、SamsungがカスタマイズしたLK(Little Kernel)が使用されています。
このLKには、主に下記の機能が含まれています。
Thor
により通信する機能: Thor(プロトコル)を介してOdinモード(ファームウェアのリカバリをするモード)で通信するために使用されるKnox Security Bit
: SAMSUNGデバイスにプリインストールされている独自のセキュリティおよび管理フレームワーク- JPEGパーサ/レンダー
1つめの脆弱性は、JPEGパーサ/レンダー内に存在したHeap overflowです。スタックのリターンアドレスにジャンプするポインタを上書きし、JPEG バッファのShellcode を指すことで任意のコード実行が起こります。
しかし、攻撃を成功させるためには、細工した画像データを含んだup_paramパーテーションをeMMCストレージに書き込む必要がありました。
up_paramとは、Samsungデバイス内で使用されていて、起動画面やブートローダーの警告メッセージに表示される画像やパラメータを入れるパーテーションのことです。
当然、元々up_paramに含まれている正常な画像には、Shellcodeが含まれているはずがないため、攻撃はトリガーされません。
画像データは、Partition Information Table (PIT)で管理されていて、eMMCから静的にロードされます。
PITは、その名の通り、Flashメモリにパーテーション情報(パーテーション名、サイズ、属性など)を記述するのに使用されるテーブルです。
PITは更新可能であるものの、更新にはup_paramに有効な署名がついているイメージが必要です。
当然、攻撃者が有効な署名が付いているイメージを独自に用意することはできないため、PITを書き換えてShellcodeを含んだ画像を含めるということもできません。
つまり、攻撃を成功させるためにはこの署名検証をバイパスしつつ、細工した画像を配置する必要があります。また、イメージの書き込み時だけでなく、画像を表示する際にも署名検証が行われることに注意します。
署名検証を回避しつつ書き換えを達成するために、GUID Partition Table (GPT)を活用します。GPTは、PITと同様にパーテーションを記述するために使用されるテーブルです。
具体的な攻撃手順は以下の通りです。
- GPTテーブル内の、
vbmeta_vender
という署名検証されずに書き込み可能なパーテーションに、PITをコピーし、新しいPITテーブルを作成する。 - 新しいPITテーブル内のパーティション
md5hdr
への参照とパーティションup_param
への参照を入れ替え、新しいup_param
(つまり、元md5hdr
)にシェルコードを含んだJPEGを書き込む。 vbmeta_vender
のパーテーション名をpit
にリネームする。
2.でmd5hdr
とup_param
を入れ替えることにより、画像表示時の署名検証がスキップされてしまいます。up_param
として参照されているパーテーションの名前がup_param
でないことによりエラーとなり、署名検証しないまま処理が進行するためです(本来はエラーが出た時点で処理を止めるべきです)。
また、3.のパーテーション名のリネームでは、署名検証が行われません。
これらにより、次のブート時に元のpit
ではなく新しいpit
が参照されるようになり、新しいup_param
から画像データをロードするようになります。
実際に画像をパーテーションに書き込む際には、前述したThorを利用します。
このプロトコルは本来ファームウェアのリカバリに用いられるもので、デバイスのブートローダーやパーテーションにアクセスできます。
Thorは認証の仕組みを持っているため、実際に利用する際にはこの認証についてもバイパスする必要がありますが、紙面の都合上、詳細は割愛します。
結果として、USB経由でThorを用いたコミュニケーションすることにより、パーティションの上書きが可能になります。
この攻撃により、通常プロセス(Normal WordのEL1/0)のコントロールが出来るようになります。
次に、TEEのSecure Worldを攻略します。
TEE(Trusted Execution Environment):
TEEとは、ハードウェア強制分離をCPUに組み込んだものです。具体的には、プロセッサとMMUによって、プログラムの実行環境をNormal WorldとSecure Worldに分離させることで、Normal WorldのプロセスからSecure Worldのプロセスの情報にアクセスすることを禁止します。
当然、このアクセスできない情報にはメモリも含まれているため、Secure Worldで鍵管理やデバイス認証に用いる指紋データなどの機密性の高いデータの保護を行うことができます。
Androidでは、主にARM TrustZoneが採用されています。
今、Normal Worldは、前述の脆弱性によりフルコントロールできていますが、Secure Worldにはアクセスできていません。TEEにより隔離されているためです。より深刻な侵害を引き起こすためには、Normal WorldからSecure Worldを攻略する方法について考えなくてはなりません。
Secure Worldでは、Exception Level 3(EL3)で動作するSecure Moniterが最も高い権限を有しています。
Secure Moniterとは、Secure Worldと Normal Worldを切り替えを管理する機構です。Arm Trusted Firmware (ATF)に含まれており、Secure Moniter Call (SMC)を介して切り替えを行います。Normal WorldからSMCを介してアクセスできる(=アタックベクタがある)ため、本講演ではこのSecure Monitorをターゲットに選んでいました。
Linux Kernelから到達可能なSMC Handler であるmediatek_plat_sip_handler_kernel()
という関数を使用することで、SMCをコールする事が出来ます。
実は、この関数の引数の一つに、セキュリティチェックが全く施されていないものがありました。その引数は、本質的にはメモリアドレスを表すものです。実際の値としては、そのメモリアドレスからベースアドレスを引いて4で割ったものになっています。当然、この引数には、意図している範囲のアドレスだけが与えられるべきですが、Normal Worldで任意のコードが実行できているため、異常なメモリアドレスを不正に与えることができます。その結果、メモリアドレスの検証が行われていないため、境界外読み取りにより、ATFの仮想アドレス空間から4バイトのデータをリーク(漏洩)させることができます。
攻撃手法は以下の通りです。
- SMCに
0x82000526
を送信する (uint *)base_address[(任意のアドレス - base_address) /4]
で任意のデータにアクセスする- ATFの仮想アドレス空間から4バイトのリークをすることで、内部データが取得できる
また、ATF SPA (Secure Partition Manager) 内で呼び出される、0x820022A
(smcid)では、mmap
をラップする関数があります。
この関数では、物理メモリを仮想メモリに再マップする事ができ、任意の物理アドレスを指定することが可能であるため、Secure World内のデータを最大8MBリークできてしまいます。8MBに制約されるのは、1回のmmap
で最大1MBかつ9回連続で行うとデバイスがクラッシュしてしまうからです。
これらの2つの脆弱性はどちらもデータを漏洩させるだけであり、任意のコード実行が直ちに可能であるわけではありません。そのため、リスクもそこまで大きくないのではないかと思われるかもしれませんが、Secure Worldが保持しているデータの中には、Android KeyStoreシステムやTrusted Application(TA)などのデータが含まれるため、これらが漏洩することはAndroidシステム全体に深刻な影響を与えます。
講演のスライドがアップロードされているので、ここでは紹介できなかった詳細について興味のある方は是非チェックしてみてください。
トラックのカテゴリとしては、ハードウェアへの攻撃に関する講演が最も多く、クラウドや量子セキュリティなどもありました。
ハードウェア実装された機能のバイパスやソフトウェアの実装不備などで発生する脆弱性は、ハードウェアとソフトウェアの2つの側面で脆弱性を探す必要があり、アプローチやテクニックは勉強になりました。
量子セキュリティは専門外ですが、AI同様に身近になりつつある先端技術のセキュリティ全般を扱っており、興味深かったです。
感想
BlackHatでは、講演の最後に質疑応答の時間が与えられていますが、発表者に質問がある人は発表終了後に列を作り、個々人で質問するという文化があります(※全員がそうするわけではないですが)。これに習い発表者に直接質問してみました。
聞きたいことは聞くことができ、講演内容に加え研究全般についても回答して貰えました。
参加者やスピーカーと交流することで、アイデアやモチベーションに繋がりました。最初は躊躇していましたが、一度話してみたら感じていた不安が無くなりました。
Briefings全体で100を超えていて、聴講したい講演が同時刻に開催されたりするケースや会場間の移動が結構大変でした。移動時間は20分あるものの会場はかなり広く、案外時間に余裕がなかったです。
世界最高水準のカンファレンスなだけあって、講演のレベルの高さに驚き、上には上がいるなあと感じました。しかし、これに圧倒されず、いずれ登壇することを目標として頑張っていこうと前向きに思いました。
終わりに
個人で参加するのは中々ハードルが高いため、会社の支援には大変感謝しています。ただ椅子に座ってBriefingsを聴講しても、アーカイブを見るのと何ら変わりがない為、現地でしか得ることの出来ない学びや気づきを得ることを意識して参加しました。結果、非常に貴重な経験になったと思います。
GMOサイバーセキュリティ byイエラエでは所属するエンジニアの知識・スキルの向上を促進するため、海外渡航やカンファレンス参加を積極的に支援しています。会社の価値観としても、「技術力の追求ができる方と働きたい」というものがあり、本制度を活用していただける方を募集しています。中途からパートタイムまで幅広く採用を行っていますので、興味がある方はぜひ採用情報をご覧ください。