[CODE BLUE 2019]VBScriptからChakraCoreへ:Windowsシステムのスクリプトエンジンを使ったアドベンチャー[レポート] #codeblue_jp

CODE BLUE 2019「VBScriptからChakraCoreへ:Windowsシステムのスクリプトエンジンを使ったアドベンチャー」についての参加レポートです。闇が深い…
2019.10.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

『世界トップクラスのセキュリティ専門家による日本発の情報セキュリティ国際会議』でありますCODE BLUE 2019に参加していますのでレポートします。

このブログは下記セッションについてのレポートです。

VBScriptからChakraCoreへ:Windowsシステムのスクリプトエンジンを使ったアドベンチャー  Presented by ユキ・チェン

Windowsオペレーティングシステムの開発には、VBScript、JScript、Internet ExplorerでのJScript9、そして Microsoft EdgeでのChakraなど、複数の主要なスクリプトエンジンが使われる。最も古いエンジン(vbscriptやjscript)はすでに20年近く経過しているが、今年はこうした旧来のエンジンで、マルウェアによる活発なゼロデイ攻撃が見られた。 このプレゼンテーションでは、こうした主要なスクリプトエンジンをバグハンターの視点から取り上げる。各エンジンについて、最初にエンジンの基本アーキテクチャの簡単な紹介を行い、次に、その中に発見されたバグ(場合によっては新しいクラスのバグ)を含む典型的な攻撃領域について議論する。また、バグを悪用して、各エンジンでリモートでのコード実行をデモする。これらのバグの一部は設計によるもので、完全に修正するのは本当に困難である。例を挙げると、私たちは4年前に特定のクラスのvbscriptバグを初めて報告したが(マイクロソフトが修正をリリースするのに6か月以上かかった)、今日でもこのようなバグを多数発見することができる。 Windows上のスクリプトエンジンは決して単独ではない。全体像としてすべてのエンジンを確認することにより、それらが相互にどのように関係を持つことができるかを見ることができる。ひとつのバグが異なるエンジンでトリガーされる可能性がある、またはひとつのエンジンで修正されたが別のエンジンでまだトリガー可能であるバグ、等の例を示す。また、スクリプトエンジンは、DOM、システムアプリ、またはサードパーティのソフトウェアなどの他のコンポーネントと関係を持つこともあり、新しい攻撃シナリオをもたらす。また、「ひとつのスクリプトエンジンの機能によってDOM、ActiveX、その他のスクリプトエンジンに多数の脆弱性が生じる可能性」や「スクリプトのバグが、どのように他のシステムアプリでリモートでのコード実行を達成したり、アプリケーションサンドボックスを壊したりするのか」など、実際のケースを用いてそのような新しい攻撃シナリオを紹介する。 過去20年間にわたるWindowsスクリプトエンジンの歴史を詳しく見ていこう!

レポート

  • 中国でバグハンティングをしている
  • メジャーWindows Scriptエンジンについて
    • 1996: VBScript / JScript in IE3
    • 2008: JScript9(Chakra)
    • VBScriptは古いもの
    • 脆弱性もたくさんある
  • VBScript/JScript
    • これらは多くの同じものを抱えている
    • インタプリタ
    • ほぼ同じコードになっている
    • 主要なスクリプトエンジンも同じ名前
    • VARIANT Structure
      • 別のデータタイプをラップする
      • 一般的なVTタイプがある
      • BSTR String等
    • アタックサーフェース
      • オーバーフローやUse after freeなどは他と同じ
      • Variableライフサイクルマネジメント
      • evilターミネータ
    • Variable life cycle management
      • 大きな問題はVBScriptエンジンにはガベッジコレクションのような仕組みがない
      • 様々な問題に派生する
      • UAFの例
        • StrCompで2つのStringをコンバート
        • この中でフリーできる
      • 例2
        • external functionからコールバックする
        • 外部関数なのでFreeされているか感知できない
        • putPropertyによってshallow copy
      • MSは1年以上かかって修正した
        • 多くのサードパーティコンポーネントが対象になっている
        • AutoVariantRefするようになった
        • コレ自体はいいが、AutoVariant Refのあとにもう一度チェックされなければ攻撃ができる
      • AutoVariantRef Patch Bypassができる
      • さらにFixされたあとにBypassがあった
      • 3度目もBypassできた
      • 4度目も…
        • ちょっとチープ
        • 前任者がやめたのかも?w
      • 5度目
        • まだ2,3回できそうだったが
        • MSがこれ自体を無効化してしまった
    • VBScript Type confusion
    • reference counter overflow
      • すぐに新しいものに書き換えたらいける
      • これを経由してUAFできる
    • Evil Class_Terminate
      • 様々な場所で様々な攻撃へ派生可能
  • JScript アタックサーフェース
    • normal memory issues
      • ヒープオーバーフローできる
    • JScriptガベッジコレクション
      • VBSより優れている
      • GCBlockで管理
      • GCrootつかってトレーシング
      • すべてのGCrootをたどってすべてのvarが辿れたらFreeにする
    • JScript GCの問題
      • UAFのパターン
        • stackVarだけ残ってしまうのでUAFできる
        • CVE-2018-8653 ITW 0day
      • UAF Tips
        • 1つだけのvarをFreeできない
        • GC Blockすべて
  • JScript9 / Chakra
    • 昔ながらもバグがあるが大きなアタックサーフェースはJIT
    • JITコンパイラー
    • Type Confusionを引き起こせる
    • Edgeで直っていてもIEだと直っていない
    • 他にもいっぱい脆弱性がある
  • Go Beyond the Browser
    • ActiveX Control
    • Adobe Reader
    • MS Officeでも0day
    • メディアプレイヤーでも
    • Sandbox Escape
      • IEは楽
    • EdgeはIE Modeを使える
    • Adobe Reader -> IE
      • レンダープロセスからinvokeできる
    • Chrome / Firefox -> IE
      • res://で行けた
      • IEで開くかというポップアップが出る
    • JavaScript and WPAD/PAC
      • WPADはプロキシを探す
      • プロセスをハイジャックしてWindows Updateする
  • 結論
    • 現在も0dayできるスクリプトエンジンがある

 

感想

デモと内容が濃くてあんまりメモできていませんが、とにかくたくさんのアタックサーフェースについて説明されていました。

潜在的な問題を抱えている感じでVBScriptとJScriptの闇の深さを感じました…