
هندسة عكسية منهجية لثنائي lina الخاص بـ Cisco ASA لاكتشاف وتحليل ثغرات تلف الذاكرة، بما في ذلك CVE-2025-20333 وCVE-2025-20362، مع التركيز على إيجاد بدائيات تنفيذ التعليمات البرمجية عن بُعد.
linaأُنشئ: 2026-08-12
الهدف: lab_asav9-12-4-67/lina (ASAv 9.12(4)67، ELF x86-64، PIE؛ قاعدة صورة Ghidra 0x100000؛ 112,687 دالة، ~167 MB مُعيَّنة، 642,707 رمزًا)
هدف المسار: تغطية هندسة عكسية منهجية كاملة للملف الثنائي lina — مُكمِّلةً للهندسة العكسية المستهدَفة القائمة على الفرضيات المُنجَزة حتى الآن — لاصطياد البدائية التي لم يعثر عليها المختبر (وقوع RCE بصلاحيات الجذر دون مصادقة في البرية على 20362+20333 مثبتٌ، إذًا هي موجودة).
كل أعمال الهندسة العكسية السابقة كانت مستهدَفة (فكّ ترجمة fault-PC، تجوال مراجع xref المرساة بالنصوص، مسح نطاقات الربط). لقد أغلقت كل نطاق مُدقَّق (H4-1/2/3/4، انعكاس tostring(userdata)، %p في SSH/SNMP/IKE، عائلات الفائض البديلة، أوراكل البقاء) — انظر ../RCE_BLOCKERS.md، . تلك الإغلاقات لكل نطاق على حدة؛ أمّا من ملف ثنائي فيه 112 ألف دالة فهو بالضبط المكان الذي يجب أن تعيش فيه البدائية المفقودة لدى APT. هذا المسار يستبدل «خمّن السطح التالي» بـ .
../NEW_ROADS_TO_CODE_EXECUTION.mdالموقع مقابل المسار الحرج: البوابة الصعبة في سلسلة الاستغلال المعروفة تبقى P0 (تسرّب معلومات مباشر عن بُعد)؛ قراءة CIFS readdir الزائدة (الخطوة 19i، نافذة 4 بايت) هي التسريب الوحيد المؤكَّد تجريبيًا وتبقى المسارَ التجريبيَّ الأمامي. LINA_FULL_RE هو التحوّط المنهجي: اعثر على تسريب/بدائية أفضل في الكود غير المُدقَّق، أو أثبت عدم وجود أيٍّ منها.
0x55.. (lina) أو 0x7f.. (libc/heap): مُصدِرات سلاسل التنسيق (%p/%lx/%x على المؤشرات)، قراءات زائدة (طول غير محصور ببيانات مبدَّأة)، انعكاس بقايا الكومة، أصداء مخازن غير مهيَّأة.memcpy/memmove/strcpy/strcat/sprintf/vsprintf/gets + حلقات نسخ مخصصة)، عبر كل أسطح البروتوكول (وليس فقط روابط WebVPN Lua المستنفَدة — انظر ../LINA_ALT_OVERFLOW_FAMILIES_RE.md).csco_config للتبديل التلقائي) بحيث يمكن ترتيب ضربات الفرز حسب كونها واصلة فعليًا عبر الشبكة.(مؤجَّل من قِبل المستخدم: البحث عن مصرف CVE-2025-20363 — OSINT تقول إنه يستهلك تسريبًا، وهو شقيق لـ 20333؛ انظر ../CVE-2025-20363_OSINT.md.)
| المرحلة | ماذا | الأدوات | المخرجات |
|---|---|---|---|
| 1. المجموعة | فكّ ترجمة كل الدوال الـ 112,687 دفعةً واحدة إلى القرص، ملف .c لكل دالة، مقسَّمة حسب العنوان | Ghidra run_script_inline (Java، DecompInterface)، مجزأة + قابلة للاستئناف | corpus/<shard>/<addr>.c |
| 2. فرز آلي | ripgrep على المجموعة بحثًا عن أنماط المصارف (فئات التسريب والفائض أدناه) | نصوص محلية، triage/ | جداول ضربات (CSV/MD) |
| 3. مرشِّح الوصولية | إبقاء الضربات في الدوال الواصلة من نقاط دخول الشبكة | مخطط استدعاء Ghidra (get_function_call_graph/script) + قائمة بذور نقاط الدخول | قائمة ضربات مرتَّبة |
| 4. الغوص العميق | هندسة عكسية مستهدَفة للضربات المرتَّبة (نمط وكيل ghidra-re الفرعي الحالي) | ghidra-mcp | وثائق النتائج في هذا المجلد |
المرحلة 1 حساب خالص (تقديريًا ساعات–أيام، دون مراقبة، قابلة للاستئناف). المرحلتان 2–3 رخيصتان/محليتان. المرحلة 4 هي الوحيدة المثقلة بالبشر/LLM وهي محصورة بالقمع.
Research notes/LINA_FULL_RE/
README.md — this file (master plan + status)
TRIAGE.md — sink-pattern catalog + reachability plan (stage 2/3 spec)
scripts/ — decompile + triage + driver scripts
corpus/ — stage-1 output: decompiled functions, sharded (corpus/2c/02c6cc80.c)
_progress.txt — resumable progress marker (done count, last address)
_errors.txt — per-function decompile failures
triage/ — stage-2/3 outputs (hit tables, ranked lists)
findings/ — stage-4 deep-dive writeups (one MD per confirmed candidate)
| المرحلة | الحالة | ملاحظات |
|---|---|---|
| 1. المجموعة | تمّت 2026-08-12 (~19:03 UTC-4) | 111,997/111,997 دالة، 0 خطأ، 548 MB في corpus/؛ استغرقت 26,214 ثانية (~7.3 ساعة) بمعدل 4.3 دالة/ثانية عبر scripts/decompile_all.py (GhidraMCP batch_decompile، حد أقصى 20 دالة/استدعاء) |
| 2. الفرز | تمّ 2026-08-13 | scripts/triage_stage2.py؛ جداول ضربات لكل فئة في triage/*_hits.csv؛ الربط المرتَّب في triage/RANKED.md |
| 3. الوصولية | تمّت 2026-08-13 (إعادة تشغيل، بذور مصحَّحة) | مخطط استدعاء+مرجع للمجموعة (427,198 حافة)؛ 26,291/111,997 واصلة (23.5%) — ما قبل المصادقة 26,278 / مسؤول 13 / ما بعد 20362 صفر. البذور صحِّحت: المسجِّل 0317b4e0، الجلسة 0317c0a0 (القديمتان 030ab4e0/030ac0a0 لم تكونا بداية دالة). ما تزال حدًّا أدنى (جداول الدوال الافتراضية). |
| 4. الغوص العميق | قيد التنفيذ 2026-08-17 | L1 مُغلَق. مسار C في L2 GO (ثابت): create_type3_message في WebVPN UCTE ينسخ TargetInfo من النوع 2 الخاص بالمهاجم دون تثبيت؛ التسريب يركب Authorization: NTLM من النوع 3 عائدًا إلى خادم HTTP الخاص بالمهاجم (findings/L2_NTLM_C_PATH_TYPE3.md). ntlm.parseType2 في Lua هو التوأم الخامل. جولة بروتوكولات O1/O5 مُغلَقة (ثابت): نسخ IKE/SSH/SNMP/EWS/PDTS إمّا بمقاس الوجهة أو في جهة الإرسال أو معروفة مسبقًا (031af6d0 / 02ff2f30). O1 «أخرى» (725) مُغلَق (ثابت): مرشِّح مكدس/عمومي/param+const → لا يوجد GO جديد لفائض الوجهة؛ 015a8b30 مُساعد addrtype غير مُقيَّد يمرّر مستدعوه مقاس AF 4/0x10 فقط (findings/O1_OTHER_SWEEP.md). O2 مُغلَق (ثابت): 605 حلقات نسخ واصلة؛ لا يوجد GO جديد لفائض الوجهة. FUN_02fd7270 = ucte_ntlm_authenticate_connection → نفس create_type3_message كما في GO لمسار C في L2 (). التالي: تجربة NTLM مخبرية (ما بعد 20362) — تتفوق على CIFS من حيث النافذة إذا ظهرت كلمة رباعية /. تحليل ثابت اختياري: O3/O4. |
الاستئناف/التحكم: يتخطى برنامج التشغيل الدوال التي يوجد ملف مخرجاتها مسبقًا — أعد تشغيل python3 scripts/decompile_all.py في أي وقت للمتابعة. إيقاف رشيق: touch corpus/STOP. إذا أُعيد تشغيل Ghidra أو إضافة MCP، فقط أعد تشغيل برنامج التشغيل.
قيود الإضافة المكتشفة (2026-08-12): run_script_inline معطَّل (GHIDRA_MCP_ALLOW_SCRIPTS غير مضبوط) → المجموعة تستخدم نقاط نهاية HTTP الدفعية فقط؛ batch_decompile يأخذ ?functions=0x..,0x..,.. كمعامل استعلام GET (وليس جسم JSON) ويقتطع الاستجابات بصمت إلى 20 دالة → حجم شرائح برنامج التشغيل = 20.
list_functions (مُتحقَّق منه: corpus/02/02c6cc80.c = luaH_get = RVA 0x2c6cc80). لاحظ: إضافة GhidraMCP HTTP تُبلِّغ عناوين بنمط RVA، وليست VA الخاصة بـ Ghidra = RVA + 0x100000.../RCE_BLOCKERS.md / ../TODO.md عندما يتداخل مرشَّح «جديد» مع طريق مغلق.0x55.. مقابل 0x7f.. مقابل الكومة)، وما إذا كانت تتفوق على بدائية CIFS readdir (الخطوة 19i) في الموثوقية.0x7f..0x55..