
طُعم نقر. إنّ CVE هو هراء ذكاء اصطناعي.
آسف على اسم المستودع المُضلِّل، لكن هذا CVE هو هراء مُولَّد بالكامل بواسطة LLM، ومن المحزن حقًا أن يقبل CNA هذا مع كل هذا التناقض في الادعاءات 💔
CVE-2026-51302 غير حقيقي 😱
استعلام SQL المنشور لا يُعيد إنتاج خطأ use-after-free في أي إصدار من إصدارات SQLite 3.41 تحت AddressSanitizer. والأهم من ذلك، أن السبب الجذري المذكور غير متوافق تمامًا مع الكود المصدري المتأثر:
exprComputeOperands() غير موجودة في SQLite 3.41.0 أو 3.41.1 أو 3.41.2؛regFree1 هو معرّف سجل صحيح في الآلة الافتراضية، وليس مؤشرًا إلى تخزين في الكومة؛sqlite3ReleaseTempReg() تجعل السجل متاحًا لإعادة الاستخدام ولا تترك مؤشر C معلّقًا في regFree1؛exprComputeOperands()، تُحسب المعاملات قبل تحرير السجلات المؤقتة، على عكس التسلسل المذكور في النشرة؛ وexprComputeOperands().يجب رفض سجل CVE هذا، وسأرفع نزاع CNA إلى MITRE 😉
تحدد النشرة الإصدار المتأثر بأنه "SQLite 3.41" وتقدم هذا الاستعلام:
SELECT CASE WHEN (1+3) THEN (5*8) ELSE (2/0) END FROM test;
وتدعي أن:
sqlite3ReleaseTempReg() تحرر ذاكرة الكومة المرتبطة بـ regFree1؛regFree1 مرجعًا معلّقًا (dangling reference)؛exprComputeOperands() لاحقًا إلى الذاكرة المُحرَّرة؛ وتُعرّف التجميعة (amalgamation) الخاصة بـ SQLite 3.41.0 الدالة كما يلي:
SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){
if( iReg ){
sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0, 0);
if( pParse->nTempReg<ArraySize(pParse->aTempReg) ){
pParse->aTempReg[pParse->nTempReg++] = iReg;
}
}
}
تستقبل الدالة iReg كقيمة من نوع int. وتسجّل ذلك العدد الصحيح في pParse->aTempReg بحيث يمكن تخصيص رقم السجل مرة أخرى:
SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){
if( pParse->nTempReg==0 ){
return ++pParse->nMem;
}
return pParse->aTempReg[--pParse->nTempReg];
}
هذه هي إدارة عمر السجلات أثناء توليد برنامج VDBE. تصف النشرة regFree1 كما لو كان مؤشرًا باقيًا إلى تخزين كومة مُحرَّر. لكنه ليس كذلك:
int regFree1 = 0, regFree2 = 0;
int r1, r2;
r1 = exprVectorRegister(pParse, pLeft, i, regLeft, &pL, ®Free1);
r2 = exprVectorRegister(pParse, pRight, i, regRight, &pR, ®Free2);
codeCompare(pParse, pL, pR, opx, r1, r2, addrDone, p5, isCommuted);
sqlite3ReleaseTempReg(pParse, regFree1);
sqlite3ReleaseTempReg(pParse, regFree2);
كود المقارنة المُولَّد يستهلك معرّفات السجلات قبل تحريرها لإعادة الاستخدام.
وجد بحث git blame في مرآة Git أن exprComputeOperands() أُدخلت بواسطة:
e24f20a4f5a6d26cdaece58eff77619a4ee757b9
2025-06-30T10:30:47Z
Factor out the code that tries to avoid evaluating subquery operands if the other operand is NULL into a subroutine, so that it can be more easily reused by other parts of the code generator.
الدالة غائبة عن التجميعات الرسمية الثلاثة لإصدار SQLite 3.41. لا يمكن لثغرة في SQLite 3.41 أن تسلك مسار تنفيذ عبر دالة أُدخلت في عام 2025، هيا يا MITRE، حقًا؟ 🥲
في كود SQLite الحديث، يكون ترتيب الاستدعاءات المختصر في sqlite3ExprIfTrue() كالتالي:
addrIsNull = exprComputeOperands(
pParse, pExpr, &r1, &r2, ®Free1, ®Free2);
codeCompare(
pParse, pExpr->pLeft, pExpr->pRight, op,
r1, r2, dest, jumpIfNull, ExprHasProperty(pExpr, EP_Commuted));
/* Other switch cases and generated-bytecode handling occur here. */
sqlite3ReleaseTempReg(pParse, regFree1);
sqlite3ReleaseTempReg(pParse, regFree2);
تُنتج exprComputeOperands() معرّفات السجلات، ثم يستهلكها المتصل ويحررها. في المقابل، تدعي النشرة أن sqlite3ReleaseTempReg() تُنفَّذ أولًا وأن exprComputeOperands() تصل لاحقًا إلى الكائن المُحرَّر.
أُدخلت exprComputeOperands() لتجنب تقييم معامل استعلام فرعي مكلف عندما يكون المعامل الآخر NULL. التعبير المنشور:
CASE WHEN (1+3) THEN (5*8) ELSE (2/0) END
يحتوي على عمليات حسابية وتعبير CASE لكنه لا يحتوي على معامل استعلام فرعي. المبرر المقدم لهذا الاستعلام لا يتوافق مع شروط استدعاء الدالة.
آلة افتراضية بالمناسبة
Debian GNU/Linux 13 (trixie)
Clang 19.1.7
AddressSanitizer enabled
Optimisation level: -O1
Frame pointers retained
Sanitizer recovery disabled
قيم SHA للتجميعة:
3.41.0 146ce189b67fdbefbf2d72cdc81e198d07ff643614cc9102e9bf063255e8e7e1
3.41.1 df0d54bf246521360c8148f64e7e5ad07a4665b4f902339e844f4c493d535ff5
3.41.2 01df06a84803c1ab4d62c64e995b151b2dbcf5dbc93bbc5eee213cb18225d987
3.53.3 646421e12aac110282ef8cc68f1a62d4bb15fc7b8f09da0b53e29ee690500431