概要
ここでは、公開エクスプロイトの解析や、私自身の1dayエクスプロイトの一部を投稿します。
[ 公開エクスプロイト解析 ]
- 個人的には、公開エクスプロイトを学ぶ最良の方法は、そのエクスプロイトを完全に理解できるまで1行ずつ読み解いていくことだと思っています。このような(過剰なまでにコメントを付けた ;) )エクスプロイトをいくつか投稿することで、他の人々がそこから学び、またコミュニティに何かを還元する試みになればと思っています。さらに、記録用としての目的もあります。こうしたことは時間が経つにつれて頭の中から消えていってしまうからです。
CVE-2016-8655
CVE-2016-5342
mp3バージョン
ttyバージョン
- これは、freener氏のAndroid LPEエクスプロイトのコメント付きバージョンです。
- arm32
- ヒープオーバーフロー
- このエクスプロイトは、別のオブジェクト内のオブジェクトポインタを上書きします。ret2dir攻撃を使用して、破損したポインタがエクスプロイトペイロードを保持するカーネル内の予測可能な固定アドレスを指すようにします。このエクスプロイト技術はPXNとPANをバイパスします。
CVE-2016-2434
- これは、Jianqiang Zhao氏のAndroid LPEエクスプロイトのコメント付きバージョンです。
- arm64
- 任意のアドレスの16バイトをゼロアウトします
- このエクスプロイトは、カーネル内の固定アドレスに配置された有用なグローバルオブジェクトの16バイトを消去します。
- グローバルオブジェクト内の破損したオブジェクトポインタは、ユーザーランドからのエクスプロイトペイロードを参照します。この種の攻撃は、PAN(またはPANエミュレーション)を搭載したデバイス/カーネルでは機能しません。
- extra_recipe脱獄を理解するための私の試みです
- 特にkppバイパスの部分に興味を持っていました。このテーマについていくつかのスライドがあり、バイパスのぼんやりとしたイメージは掴めましたが、細部まで深く掘り下げて、コード内で実際に何が起きているのかを確認したいと思っていました
- また、脱獄に必要な最終的な要素(Cydiaのインストールなど)も理解したいと思っていました。
yalu102 (ViewController.m)
- 実際のバグに関連する部分と、それがどのように悪用されたかにコメントを付けました。
- オリジナルのエクスプロイトではなくyalu102を調べた理由は、port-feng-shui技術の方がよりクリーンで、理解するのがより簡単に見えたからです。
- 解析はkppバイパスの直前で終了します
- ここに飛んだのは、各種の数値オフセットについてもう少し情報があったからです。
- また、yalu102ではオブジェクトファイルしかないのに対し、こちらではpatchfinder.cが完全な状態で残されています。
- cydiaの部分はやや不完全なので、kppの後にcydiaブランチへ飛びました
- tfp0取得後およびポストエクスプロイテーション後の脱獄の材料を理解しようとしています
empty_list (sploit.c)
- Ian Beer氏のempty_listカーネルエクスプロイトの詳細な解説です。
- 非常に弱いプリミティブから始めて、より強力なAARを構築し、最終的に本格的なタスクポートを構築するという驚くべき技術を使用しています。エクスプロイトコードの背後にあるポートマジックは信じられないほどです。しかも、これらすべてを8 NULLバイトのヒープオーバーフローで実現しています。本当に驚異的です。
- 信頼性を向上させるための素朴なアイデアをいくつか書き留めておきました。将来的に誰かが、より信頼性の高いバージョンのエクスプロイトをリリースしてくれることを願っています。 :)
- 素晴らしいエクスプロイトをありがとう、Ian Beer氏!
CVE-2018-4233
- これは、@niklas_b氏のiOS Webkitエクスプロイトのコメント付きバージョンです。
- 非常に明快かつ簡潔で、徹底的に注釈が付けられた解説記事を書いてくれたkudima(@begger_dd)氏に心から感謝します! :)
- その解説記事では、JIT型混乱バグ、ボックス化/アンボックス化の変換におけるいくつかの制限(信頼性を損なう可能性がある)、そして初期/後期のAAR/AAWプリミティブがどのように構築されるかの詳細なウォークスルーが説明されています。また、最近の一連の緩和策(インデックスマスキング、ArrayBufferバッキングストアのポイズニング、W^X JITのメカニズムの一部変更、JSObject構造の変更など)の後のエクスプロイト技術の変化についての洞察も提供しています。
jsc_ConcatMemcpy_infoleak
- これは、kudima氏のWebKit情報漏えいエクスプロイト(2018.8.27に修正済み)のコメント付きバージョンです。
- これは、lokihardt氏によって報告されたバグの1つに対する不完全な修正に由来します。lokihardt氏の報告によるパッチは、Double -> Objectの型混乱プリミティブを修正しましたが、その逆のObject -> Doubleは修正しませんでした。
- 単一のオブジェクトとマーカーを含むバタフライでWebKitヒープをスプレーし、その後concatバグをトリガーして、複数のdouble配列の大部分を初期化されていないヒープデータで埋めます。初期化されていない、バグのあるconcatによって生成されたdouble配列を反復処理し、以前にスプレーされたオブジェクトのアドレスを見つけてリークします。
- 素敵なエクスプロイトと解説記事に、改めてkudima(@begger_dd)氏に感謝します! :)
jsc_prop_enum_uaf
- これは、kudima氏からのもう1つの寄稿です。kudima氏のWebKitリモートコード実行エクスプロイト(このコミットで修正済み)のコメント付きバージョンです。iOS 12.1で修正され、iOS 12.0.1までで動作します。
- 問題は、baseline-JITされたforinループ内でコードを実行している間に、JSOBjectを支えるStructureIDオブジェクトを解放してガベージコレクタをトリガーするコードを導入できることですが、ガベージコレクタは"JSPropertyNameEnumerator->m_cachedStructureID"メンバーをマークせず、"JSPropertyNameEnumerator->m_cachedStructureID"が指すStructureIDオブジェクトがスイープフェーズ中に解放され、ダングリングポインタが発生することです。
- StructureIDオブジェクトがGCによって解放された後、新しいStructureIDオブジェクトを作成するコードを導入できます。これにより、以前に解放された"StructureIDオブジェクト"のスロットが再利用されます。
- オブジェクトAのStructureIDを解放し、その後オブジェクトBにその場所を引き継ぐ新しいStructureIDを作成させることで、型混乱の状況を作り出すことが可能です。"JSPropertyNameEnumerator->m_cachedInlineCapacity"はオブジェクトAのインラインプロパティサイズに設定される一方、"JSPropertyNameEnumerator->m_cachedStructureID"はオブジェクトBを表す新しいStructureIDオブジェクトを指すからです。これにより、'op_get_direct_pname'内のチェックが通過し、オブジェクトBがその境界外のインラインプロパティにアクセスできるようになります。
- これは、AAR/AAWなどのより強力なプリミティブを構築するために悪用でき、さらにそれを任意のコード実行に使用できます。
- クールなエクスプロイトと非常に詳細な解説記事をありがとう、kudima(@begger_dd)氏! :)
[ 1Day ]
CVE-2017-2547
- ある日、Zer0con 2018で発表された後のsingi氏のエクスプロイトを見て、これを改善することにしました。
- これは、pwnjsに統合する前の、スタンドアロンバージョンのエクスプロイトです。
- 改善点は以下の通りです
- 信頼性の向上(汚染されたメモリでの長時間のブラウジングセッション後も問題なく動作します)
- さまざまなブラウザバージョンと互換性を持たせるために、ハードコードされたすべてのオフセットを削除
- 異なるエクスプロイト技術(標準的なmisalign技術)を使用
- 最終的にwebkitプロトタイプを作成してpwnjsフレームワークに統合
- コードをはるかに読みやすくし、大量のコメントを追加
- スペシャルサンクス
- 素晴らしいphrack記事と公開エクスプロイトに対して、qwertyoruiop & Samuel Grob氏
- 素晴らしいpwnjsフレームワークに対して、Brian Pak & Andrew Wesie氏!