
cve-2025-46285 إثبات مفهوم بسيط لإعادة الإنتاج
إخلاء مسؤولية مهم: المحتوى التالي مخصص فقط لأغراض تعليم أمن السيبراني والبحث الدفاعي وتحليل مبدأ الثغرات. يُرجى عدم اختبار هذه الثغرة أو استغلالها في بيئات غير مرخصة. قد يؤدي استغلال ثغرات النظام إلى عواقب قانونية وتلف الأجهزة.
CVE-2025-46285 هي ثغرة فيضان عدد صحيح (Integer Overflow) في أنظمة تشغيل Apple (بما في ذلك macOS و iOS و iPadOS و tvOS و watchOS و visionOS). تكمن المشكلة الأساسية في كيفية معالجة الطوابع الزمنية (Timestamp). قامت Apple بإصلاح هذه المشكلة عن طريق إدخال طوابع زمنية 64 بت (64-bit timestamps).
int64_t أو uint64_t) لدعم نطاق زمني أطول ومنع الفيضان.في لغات البرمجة منخفضة المستوى مثل C/C++، يعني فيضان الأعداد الصحيحة أن نتيجة عملية حسابية تتجاوز النطاق الذي يمكن لنوع البيانات تمثيله.
int32_t): القيمة القصوى هي (2^{31}-1) (2,147,483,647).وفقًا للوصف: "قد يتمكن تطبيق من الحصول على صلاحيات الجذر" (An app may be able to gain root privileges). يحدث هذا عادةً عبر المسار التالي:
launchd أو أنظمة فرعية للنواة).ملاحظة: نظرًا لأن CVE-2025-46285 تتضمن فيضانًا صحيحًا على مستوى النواة، وقد قامت Apple بإصلاحها، فلا يمكن تقديم POC مباشر يستغل أحدث الأنظمة. الكود التالي هو كود تعليمي محاكى يهدف إلى عرض مبدأ فيضان الطابع الزمني 32 بت وكيفية إصلاح المشكلة بشكل صحيح في الكود.
يُحاكي هذا الـ POC مكونًا معرضًا للثغرة لمعالجة الطوابع الزمنية ويوضح كيف يمكن أن يؤدي الفيضان إلى أخطاء منطقية.
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <stdlib.h>
// محاكاة لمكون نظام معرض للثغرة
// استخدام عدد صحيح مُوقَّع 32 بت لتخزين الطابع الزمني، وهو أصل CVE-2025-46285
typedef struct {
int32_t timestamp; // نقطة الثغرة: استخدام عدد صحيح 32 بت
int32_t duration; // المدة
int is_valid; // علامة الصلاحية
} TimeSensitiveData;
/**
* دالة معرضة للثغرة: حساب وقت الانتهاء
* المشكلة: إذا تجاوز current_time + duration قيمة INT32_MAX، سيحدث فيضان
* النتيجة: قد يصبح timestamp سالبًا، مما يؤدي إلى إبطال عمليات التحقق الأمنية
*/
int vulnerable_check_expiration(int32_t current_time, int32_t duration) {
int32_t expiration_time;
// محاكاة فيضان العدد الصحيح
// إذا كان current_time قريبًا من INT32_MAX، فإن إضافة duration ستؤدي إلى الالتفاف إلى قيمة سالبة
expiration_time = current_time + duration;
printf("[Vulnerable] الوقت الحالي: %d, المدة: %d\n", current_time, duration);
printf("[Vulnerable] وقت الانتهاء المحسوب: %d\n", expiration_time);
// التحقق الأمني: إذا كان الوقت الحالي أكبر من وقت الانتهاء، فهو غير صالح
// لكن إذا أصبح expiration_time سالبًا بسبب الفيضان بينما current_time موجب،
// فإن current_time > expiration_time يكون صحيحًا دائمًا، مما يؤدي إلى حكم خاطئ "منتهي الصلاحية"
// أو في بعض المنطقيات، قد يتم تفسير الوقت السالب على أنه "صالح إلى الأبد" أو تجاوز التحقق
if (current_time > expiration_time) {
return 0; // منتهي الصلاحية
} else {
return 1; // صالح
}
}
/**
* دالة مُصلحة: استخدام عدد صحيح 64 بت لمعالجة الطوابع الزمنية
* الحل: استخدام طابع زمني 64 بت لمنع الفيضان
*/
int fixed_check_expiration(int64_t current_time, int64_t duration) {
int64_t expiration_time;
// استخدام عدد صحيح 64 بت، نطاق واسع جدًا، يكاد يكون من المستحيل حدوث فيضان
expiration_time = current_time + duration;
printf("[Fixed] الوقت الحالي: %lld, المدة: %lld\n", current_time, duration);
printf("[Fixed] وقت الانتهاء المحسوب: %lld\n", expiration_time);
if (current_time > expiration_time) {
return 0; // منتهي الصلاحية
} else {
return 1; // صالح
}
}
/**
* محاكاة سيناريو الهجوم
* يقوم المهاجم ببناء طابع زمني قريب من INT32_MAX، مع إضافة مدة صغيرة،
* مما يؤدي إلى فيضان وإنتاج قيمة سالبة، وبالتالي تجاوز عمليات التحقق الأمنية المستندة إلى الوقت
*/
void demonstrate_attack() {
printf("\n=== عرض هجوم فيضان العدد الصحيح ===\n");
// تعيين وقت قريب من القيمة القصوى للعدد الصحيح 32 بت
// INT32_MAX = 2147483647
int32_t near_max_time = 2147483640;
int32_t small_duration = 10;
printf("الطابع الزمني الذي بناه المهاجم: %d\n", near_max_time);
printf("المدة التي بناها المهاجم: %d\n", small_duration);
int result_vuln = vulnerable_check_expiration(near_max_time, small_duration);
if (result_vuln == 1) {
printf("[!] نجاح استغلال الثغرة: اعتقد النظام خطأً أن البيانات لا تزال صالحة!\n");
printf("[!] السبب: 2147483640 + 10 = -2147483646 (التفاف الفيضان)\n");
printf("[!] الوقت الحالي (%d) ليس أكبر من وقت الانتهاء (-2147483646)، لذا أعادت الدالة صالح.\n", near_max_time);
} else {
printf("[*] فشل استغلال الثغرة\n");
}
}
/**
* عرض السلوك بعد الإصلاح
*/
void demonstrate_fix() {
printf("\n=== عرض السلوك بعد الإصلاح ===\n");
int64_t near_max_time_64 = 2147483640;
int64_t small_duration_64 = 10;
int result_fixed = fixed_check_expiration(near_max_time_64, small_duration_64);
if (result_fixed == 1) {
printf("[+] الإصلاح فعّال: النظام يتعرف بشكل صحيح على أن البيانات صالحة.\n");
printf("[+] السبب: 2147483640 + 10 = 2147483650 (لا فيضان)\n");
printf("[+] الوقت الحالي (%lld) ليس أكبر من وقت الانتهاء (2147483650)، لذا أعادت الدالة صالح.\n", near_max_time_64);
} else {
printf("[*] انتهت صلاحية البيانات\n");
}
}
int main() {
printf("إثبات المفهوم لـ CVE-2025-46285: فيضان العدد الصحيح يؤدي إلى خطأ في معالجة الطابع الزمني\n");
printf("======================================================\n");
// 1. عرض الهجوم
demonstrate_attack();
// 2. عرض الإصلاح
demonstrate_fix();
printf("\n======================================================\n");
printf("الاستنتاج: استخدام الأعداد الصحيحة 64 بت (int64_t) يمكن أن يتجنب تمامًا مشاكل الفيضان هذه.\n");
printf("طبقت Apple هذا الإصلاح في الإصدارات مثل iOS 18.7.3 و macOS 14.8.3 إلخ.\n");
return 0;
}
TimeSensitiveData يُحاكي الكائن الذي يخزن الطوابع الزمنية في النظام.int32_t timestamp هو أصل الثغرة، حيث يحد من نطاق تمثيل الوقت.vulnerable_check_expiration:
expiration_time = current_time + duration; يحدث فيه فيضان عندما يكون current_time قريبًا من INT32_MAX.2147483647 + 1 يصبح -2147483648.current_time > expiration_time تؤدي إلى فرع منطقي خاطئ بسبب المقارنة مع سالب، مما قد يؤدي إلى تجاوز السياسة الأمنية.fixed_check_expiration:
int64_t.int64_t, uint64_t) لتخزين الطوابع الزمنية.demonstrate_attack:
INT32_MAX (2147483640) ومدة صغيرة (10).expiration_time سالبًا.2147483640 > -2147483646 صحيح، تعيد الدالة 0 (منتهي الصلاحية). لاحظ: في بعض المنطقيات الأمنية، إذا كان النظام يتوقع قيمة غير صفرية لكلمة "صالح"، أو إذا كان المنطق if (expiration_time < 0) return VALID;، فيمكن للمهاجم بناء حالة "صالح إلى الأبد". يُظهر هذا المثال بشكل أساسي الشذوذ العددي الناتج عن الفيضان.demonstrate_fix: