世界を動かす技術を、日本語で。

Tachy0n: 最後の0day脱獄

概要

  • SiguzaによるiOS 13.0〜13.5向け「tachy0n」カーネルエクスプロイトの詳細解説
  • 2020年5月23日にunc0ver v5.0.0で0dayとして公開、Appleが1週間後に緊急パッチ
  • Lightspeedバグ(CVE-2020-9859等)を利用したカーネルLPEの仕組み
  • 過去のSpice脱獄や1dayエクスプロイトとの関係や手法の進化
  • Appleの回帰テスト不足がもたらした再発バグの背景

tachy0n:最後の0day Jailbreak

  • Siguza が5年ぶりに公開したカーネルエクスプロイト解説記事
  • iOS 13.0〜13.5 を対象とし、unc0ver v5.0.0で0dayとしてリリースされた経緯
  • Apple が本脆弱性のみを修正する緊急パッチ(2020年5月)を一週間後に配信
  • 0dayとして公開されたが、以前は1dayとしても利用されていた事実
  • Pwn20wnd が回帰テストによりバグを再発見した経緯

Lightspeedバグの概要

  • Synacktiv によるLightspeedバグ(CVE-2020-9859等)の技術的詳細
  • lio_listioシステムコール 内での非同期/バッチI/O処理用構造体の管理不備
  • レースコンディション による二重解放(double free)の発生条件
    • lio_contextの割当→解放→再割当→再解放の流れ
  • kalloc.16ゾーン 内での再割当とcanary値による安全対策の隙間
  • 実際にはレースが成功するまで何度も繰り返し試行できる点

Spice脱獄と1dayエクスプロイト

  • Spice脱獄 (Jake Blairチーム)でのiOS 11.x向けLightspeedバグ利用
  • アプリ版とracoon版 で異なるカーネルエクスプロイト手法
    • 目的はどちらも mach port偽造 による権限昇格
  • A7〜A9(X) デバイスではユーザランドから直接カーネルポインタ偽造が容易
  • A10/A11 では追加の情報漏洩バグやサンドボックスエスケープが必要
  • racoon 環境特有の制約とRootDomainUserClient経由のスプレー手法
    • IOSurface未使用でもOSUnserializeXMLを利用したリークが可能
  • sysctl 経由でカーネル__DATA領域へのデータ配置が容易(racoonはroot権限)
  • CVE-2018-4413 (panicall)の情報漏洩バグでカーネルスライド取得
  • iOS 11向けにはより優れたカーネルエクスプロイトが既に存在

Appleの回帰テスト不足とその影響

  • iOS 12での SockPuppetバグ 再発(Appleのパッチ適用漏れ)
  • 回帰テスト の未整備が再発バグ検出の抜け穴に
  • Pwn20wnd が既知の1dayバグに対するテスト自動化で未修正バグを発見
  • シンプルだが手間のかかる作業が大企業の弱点となる実例

今後の展開やunc0verに関する詳細は、次の記事タイトル以降で解説予定。

Hackerたちの意見

もしそうなら、Appleはすごい戦略を採用したってことだね。デバイスのルート化の方法を全部封じ込めることで、脱獄開発者が見つけた脆弱性を無料で修正してるんだ。

でも、そうじゃないみたい。記事によると「プライベート」コミュニティにはまだエクスプロイトがあって、Appleはそれをパッチしてるんだ。一般の人たち、特に開発者は、なぜかもうやってないみたい。

Appleが脱獄に対して今は100万ドル払ってるって聞いたよ。これはフリーマーケットでの最低価格だね。

脱獄したらAppleに連絡して数百万ドルを申請する方法ってあるのかな?X: こんにちはApple、脱獄したんだけど?それとも仲介者を通すの?それとも公開されてるメールアドレスとかあるのかな?(1次サポートに直行して忘れられないように)

その境界は2015年、約10年前に破られたんだ。https://www.dailymail.co.uk/sciencetech/article-3301691/New-...

それが市場価格だよ。https://cyberscoop.com/zerodium-android-zero-days-bounty/

彼が1兆ドルの企業を打ち負かした方法は、Appleが苦手なシンプルだけど面倒で退屈な作業、つまり回帰テストを通じてだった。 > だって、これまでにもこんなことがあったから。iOS 12では、SockPuppetが脱獄で使われた大きなエクスプロイトの一つだった。Project Zeroのネッド・ウィリアムソンによって見つけられ、Appleに報告されて、iOS 12.3でパッチが当てられたんだけど、その後Project Zeroのバグトラッカーでは制限が解除された。でも、すべての予想を裏切って、iOS 12.4で再び現れたんだ。まるでパッチが当てられたことがなかったかのようにね。おそらく、Appleがそのバージョン用にXNUを別のブランチに分岐させて、そこでパッチを適用しなかったからだと思うけど、これで彼らがこういうことに対する回帰テストを持っていないことが明らかになった。これは簡単で、かつ非常に報われる可能性のあるギャップだった。実際、知られている1日の脆弱性のために回帰テストを実装した後、Pwnはヒットを得たんだ。今、他にどれだけのプロジェクトがこれをやってるのか気になるな。誰かが新しいバージョンのLinux/FreeBSD/OpenWRT/OpenSSHなどで歴史的な脆弱性を実行するCIファームを運営してるのかな?それには、各脆弱性を自動化された形でまとめる必要があるし(これは簡単だと思う)、それに投資するCIリソースも必要だし(これはハードル高いけど、新しいバージョンごとにランダムに選んで実行すれば節約できるかも)、気を使う必要もあるし(これは簡単だといいな)、考えつく必要もある(意外と難しい)。

今、他にどれだけのプロジェクトがこれをやってるのか気になるな。もし「プロジェクト」が情報機関を指すなら、少なくともG10の情報機関はこれをやってると考えても安全だと思うよ。ロシア、中国、北朝鮮もそうだし、プライベートグループもたくさんいるだろうね。

根本的な問題は、多くの組織がセキュリティ関連のことを独立したワークフローやバグのクラスに分けてしまっていることだと思う。これは、セキュリティと機能開発の分割に適用されるコンウェイの法則みたいなもんだね。だから、たとえ成熟した回帰テストスイートを持っているビルド/リリース手順があっても、内部の組織の都合で「セキュリティ」問題は含まれていない可能性が高い。

そうそう、回帰テストって、修正したバグが再発しないか確認するのはQAの標準的な部分だよね。20年前に大学でMozillaのボランティアQAをやってたんだけど(ああ、その数字は恐ろしい)、彼らは常に増え続ける回帰テストのスイートを持ってた。主にレンダリングやレイアウト、JavaScriptエンジンのバグ用で、再現して修正したことを証明するためにはミニマルなテストケースを作る必要があったんだ。それをビルドパイプラインに簡単に投げ込むことができた。バグは生活の一部だけど、修正に時間とお金をかけて、また戻ってくるのは最悪のシナリオだよね。品質を重視する組織は確実に回帰テストに投資してる。でも、残念ながら多くの組織はQAを全く尊重せず、最低入札者に外注してることが多い。Appleが脱獄に対する回帰テストを持っていないのは本当に信じられない。歴史上最も注目されたバグの一つなのに。最近のMozillaには批判すべき点がいくつかあるけど、2000年代初頭にはTinderboxやBugzillaのようなツールを使って、非常に堅牢なQAとCI/CDの体制を持ってたんだ。DevOpsが登場してそれが一般化したとき、え、みんなこれやってなかったの?って思った。どうやら自分はバブルの中にいたみたいで、全然普通じゃなかった。

名前は思い出せないけど、見たことのあるFOSSプロジェクトがある(ビール)。でも、彼らのテストケースディレクトリは覚えてるよ。各問題ごとに一つずつあって、数千もあったはず。Sqliteだったかもしれない。調べてみる価値があるね。もし修正をバックポートしていないなら、テストもバックポートしないだろうね。

「kheap分離について知っていることはすべて忘れろ、タスクポートの緩和策も忘れろ、SSVとSPTMも忘れろ」 これは、友達と外国語で話していてうまくいってたのに、次の文で脳外科手術や核物理学の話を始められて、理解が崖から落ちるような感じだね。あと、ブラストファーネスの改修についての会話を通訳しようとしたときもそうだった。脱獄については、もうそんなことはなくて悲しいな。自分の脱獄したiPadで何か役に立つことをした記憶はないけど、楽しかったよ。今ならテザリングアプリとUTM + JITソリューションをインストールするかな(1)。1: SideStoreは期待できそうだったけど、俺のアカウントは以前有料のApple Developerアカウントだったから、期限切れにならない10個のアプリIDがあるんだ。だから、前述のUTMみたいなアプリをインストールするには新しいアカウントを作るか、再度支払わないといけないんだよね。