
SQLite 3.53.4 - عالي - محلي - UAF - rtree last_insert_rowid 0 node hash
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-rtree-rowid0
الفئة: UAF الوصول: محلي
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69، SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
تقوم nodeWrite بتجزئة عقدة rtree جديدة باستخدام iNode==0 عندما تبقى sqlite3_last_insert_rowid() صفرًا بعد INSERT في %_node الذي لا يزال يُبلّغ عن النجاح. تتخطى nodeHashDelete القيمة 0. تقوم nodeRelease بعد SplitNode بتحرير RtreeNode بينما لا تزال التجزئة تحتفظ به. لاحقًا تصبح nodeHashLookup استخدامًا بعد التحرير لذاكرة الكومة. نفس nodeWrite موجودة على مسار geopoly.
لم يتم إثبات RCE. قراءة ASan في nodeHashLookup. إصلاح branch-3.53 اللاحق هو SQLITE_CORRUPT_VTAB عندما يبقى رقم العقدة المُعيَّن صفرًا. هذا الفحص غير موجود في هذا الإصدار GA.
| ID | لا يوجد CVE بعد |
| الفئة | UAF (استخدام بعد التحرير لذاكرة الكومة لـ RtreeNode؛ لم يتم إثبات RCE) |
| الوصول | محلي (SQL غير موثوق أو ملف .db غير موثوق على جدول rtree/geopoly) |
| CWE | CWE-416 |
| CVSS | مرتفع: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| المنتج | SQLite rtree / geopoly (SQLITE_ENABLE_RTREE) |
| المتأثر | 3.53.4 (b09c88c) |
| المصادقة | SQL من المهاجم أو trigger مزروع في الجدول الظل / %_node بدون ROWID |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18890 فقط. شاهد ASan. لا يوجد حمولة استغلال. |
على جدول rtree أو geopoly، اجعل INSERT العقدة يُبلّغ عن النجاح بينما تبقى last_insert_rowid() صفرًا. الطرق الموثقة: استبدال %_node بـ WITHOUT ROWID، أو زرع BEFORE INSERT RAISE(IGNORE) على الجدول الظل، ثم إعادة الفتح بحيث يصبح last rowid للاتصال صفرًا. كرر INSERT حتى انقسام العقدة. يتم تجزئة الشقيق الأيمن كعقدة 0، وتحريره، ويظل قابلًا للعثور عليه.
ثم تستخدم العملية المضيفة RtreeNode محرَّرة. المختبر هو AddressSanitizer heap-use-after-free. التحكم في مؤشر التعليمات ليس في هذه الحزمة. الانهيار موجود.
يتم تعيين SQLITE_VTAB_INNOCUOUS، لذا لا يزال rtree يعمل مع trusted_schema معطّلًا. لا يضبط التجميع الافتراضي SQLITE_DEFAULT_DEFENSIVE. لا يزال trigger مزروع مسبقًا في ملف DB غير موثوق يعمل عندما يُنفَّذ INSERT الخاص بـ pWriteNode في rtree نفسه.
عشرون عملية بحث في المصدر لـ https://github.com/sqlite/sqlite وسم https://github.com/sqlite/sqlite/tree/version-3.53.4. الشجرة الأساسية هي https://sqlite.org/src. GitHub هو مرآة Fossil. لا يزال 3.54.0 مسودة. هذه البقايا نموذجية لـ -DSQLITE_ENABLE_RTREE الإضافي (التجميع الرسمي الموصى به، وWindows nmake OPTS، وautoconf fallback، وfuzzcheck كلها تضبطه).
if( pNode->iNode==0 && rc==SQLITE_OK ){
pNode->iNode = sqlite3_last_insert_rowid(pRtree->db);
nodeHashInsert(pRtree, pNode);
}
static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){
RtreeNode **pp;
if( pNode->iNode!=0 ){
pp = &pRtree->aHash[nodeHash(pNode->iNode)];
for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); }
*pp = pNode->pNext;
pNode->pNext = 0;
}
}
تبحث nodeAcquire في التجزئة قبل رفض iNode<=0. الإصابة على المدخل الصفري المحرَّر هي UAF. الفشل في العثور على iNode<=0 هو SQLITE_CORRUPT_VTAB، وهو مسار مختلف.
المنعطفات الخاطئة المسجلة بالفعل: اعتبار %_rowid last_insert_rowid 0 هو هذا الخطأ (ذلك يعيّن cell rowid 0، وليس hash UAF)؛ توقع SQLITE_CORRUPT_VTAB على هذا الإصدار (ذلك هو الإصلاح اللاحق)؛ ملء 50 خلية بحيث لا يوجد انقسام؛ زرع trigger وعدم إعادة الفتح؛ إخفاء lookaside للتحرير عن ASan؛ تسمية الانهيار RCE.
cd lab
./run.sh
Amalgamation 3.53.4 مع -DSQLITE_ENABLE_RTREE=1 و-fsanitize=address. اختبار rtreeI.test المورّد 2.0-2.2: املأ 51 صفًا (RTREE_MAXCELLS)، وBEFORE INSERT RAISE(IGNORE) على %_node، وأعد فتح last_insert_rowid()==0، ثم INSERT الصف 52 (انقسام)، ثم SELECT *. انقسام التحكم بدون trigger يكون OK. اربط 127.0.0.1:18890. الأداة هي lab/harness.c.
control-split=ok
reopen-last-rowid=0
witness-before-split=SQLITE-RTREE-ROWID0-WITNESS
ERROR: AddressSanitizer: heap-use-after-free
READ of size 8 ... nodeHashLookup
freed by ... nodeRelease / SplitNode
SUCCESS sqlite-rtree-rowid0 how=asan-uaf-nodehash SQLITE-RTREE-ROWID0-WITNESS
بعد sqlite3_last_insert_rowid()، إذا كان iNode لا يزال 0، أعد SQLITE_CORRUPT_VTAB ولا تقم بـ nodeHashInsert. يفعل branch-3.53 11ce330557 / Git 63b6d705 (2026-09-24) ذلك. يتوقع الاختبار "database disk image is malformed". هذا الإصدار GA لا يفعل.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccnodeWrite، nodeHashDelete، nodeRelease، nodeAcquire، SplitNode11ce330557 (2026-09-24، Claude / Ada Logics)