第20回 初心者のためのセキュリティ勉強会 (https://sfb.connpass.com/event/249919/) での発表資料です。
Apple M1 CPUの脆弱性「PACMAN」について解説するkuzushiki第20回 初心者のためのセキュリティ勉強会 kuzu7shiki
View Slide
発表内容Apple M1 CPU の脆弱性「PACMAN」の詳細が 6/9 に公開されたPACMAN: Attacking ARM Pointer Authentication with Speculative Executionhttps://pacmanattack.com/面白そうだったので調べてみることに第20回 初心者のためのセキュリティ勉強会 kuzu7shiki2 / 13
PACMAN ってなに?Apple M1 CPU の Pointer Authentication を回避することができる新しい攻撃手法PACMAN は ソフトウェア攻撃とハードウェア攻撃の中間 に位置する画期的な攻撃とのこと第20回 初心者のためのセキュリティ勉強会 kuzu7shiki3 / 13
M1 CPU 使ってるから心配なんだけどソフトウェアのアップデートをちゃんとしているなら大丈夫!あくまで数あるセキュリティ機構のうち Pointer Authentication という機能をバイパスできるだけQ. M2 CPU 買えば大丈夫?A. 「M2 チップで PACMAN が可能となるかどうかはまだ確認されていない」とのことなので、不安な方は購入を待つと良いかも…第20回 初心者のためのセキュリティ勉強会 kuzu7shikiAPPLE M1 チップのポインタ認証を迂回する攻撃「PACMAN」 | スラド IT から引用4 / 13
Pointer Authentication って何?ポインタの先頭部分に Pointer Authentication Code (PAC) と呼ばれるハッシュを付与し、検証できるようにする仕組みメモリ破壊の脆弱性(バッファオーバーフローなど)により、ポインタが書き換えられ不正な命令を実行されるのを防ぐM1 独自の機能というわけではなく、ARM, Qualcomm, Samsung などのチップメーカーも今後対応予定第20回 初心者のためのセキュリティ勉強会 kuzu7shiki5 / 13
どうやってバイパスするの? (1 / 3)投機実行を悪用したサイドチャネル攻撃投機実行とは?標準的な CPU は順番通りに命令を実行命令に使うデータを読み込むまで待機 <- この時間がもったいない!データを読み込むまでの間にもできることをしよう、というスタンス例えば下記のケースでは yes() と no() を両方実行しておき、使わないほうは破棄する <- ここが大事第20回 初心者のためのセキュリティ勉強会 kuzu7shiki` ` ` `1 if (cond):2 yes()3 else:4 no()6 / 13
どうやってバイパスするの? (2 / 3)破棄されるほうの分岐で PAC の検証を行う通常、PAC の検証に失敗すると例外となりプログラムがクラッシュしてしまう-> 投機実行の裏で行った場合、「例外となる」という結果が破棄されるため、クラッシュさせずに続行できるでも、破棄されるのに PAC の検証に成功したかどうやって判定するの?第20回 初心者のためのセキュリティ勉強会 kuzu7shiki7 / 13
どうやってバイパスするの? (3 / 3)サイドチャネル攻撃を行うサイドチャネル攻撃とは?コンピュータの物理的な特性を外部から観察あるいは測定することで、内部の情報の取得を試みる攻撃今回は TLB (仮想アドレスに対応した物理メモリのアドレス専用のキャッシュ) を使うTLBは直前に参照されたアドレスを格納するPAC を求めたいポインタのアドレスで埋め尽くしてしまうPAC の検証後にそのポインタへアクセスさせるように仕向け、その後アクセスした際の時間を確認アクセス時間が短い -> TLBに格納されているキャッシュがロードされずに残ってる -> 検証失敗アクセス時間が長い -> TLBに格納されているキャッシュがロードされ退避された -> 検証成功アクセス時間により、 PAC の検証が成功したかどうかを確認できる!第20回 初心者のためのセキュリティ勉強会 kuzu7shiki8 / 13
攻撃の実証 (1 / 3)1. PACMAN 攻撃の正確さ不正な PAC と正常な PAC (それぞれ1万個)を用い、TLB のデータに差が生じるかを検証している縦軸: 頻度横軸: ロードが成功し TLB から退避されたデータの個数(a) と (b) では異なる PACMAN ガジェットを使用している不正な PAC と 正常な PAC で明確な差が生じている-> PACMAN 攻撃は正確である第20回 初心者のためのセキュリティ勉強会 kuzu7shiki9 / 13
攻撃の実証 (2 / 3)2. 総当りにかかる時間1つの PAC をテストするのに平均 2.69 ミリ秒かかる-> M1 では 16 ビットの PAC が使われているので平均で 2.94 分かかると推定できる -> 十分実用的( 2.69 x 10 x 2 ≒ 176.29 ≒ 2.94 x 60 )3. 総当りの正確さ50 回実験を行った-> 45回は正しい PAC が見つかり、残りの5回は見つからなかった「ダメじゃん」と思われるかもしれないが、あくまで偽陰性のため再度総当りすればよい。※偽陽性(不正な PAC を「正しい」と判断してしまう)があるとクラッシュしてしまうので NG第20回 初心者のためのセキュリティ勉強会 kuzu7shiki-3 1610 / 13
攻撃の実証 (3 / 3)4. 実際に悪用できることの確認意図的にバッファオーバーフローの脆弱性を作り込み、 Pointer Authentication をバイパスして関数ポインタをカーネル内に存在する別の関数に書き換える-> 攻撃に成功した第20回 初心者のためのセキュリティ勉強会 kuzu7shiki11 / 13
対策1. PAC の検証結果が投機実行により漏洩しないように、マイクロアーキテクチャやソフトウェアを変更する2. Spectre に対する防御の先行研究を、PACMAN に対する防御に適応させる3. ソフトウェアに存在するメモリ破壊の脆弱性にパッチを適用する-> 皆さんが実行できるのは 3 の対策のみ第20回 初心者のためのセキュリティ勉強会 kuzu7shiki12 / 13
終わりにApple M1 CPU の脆弱性「PACMAN」についてざっくりと解説した今後検証コードが公開されるとのことCheck back here for a complete release of all of our code coming soon.-> 来月までに公開されていたら勉強会でデモやるかも第20回 初心者のためのセキュリティ勉強会 kuzu7shiki13 / 13