
SQLite 3.53.4 - عالي - محلي - بقايا صلاحيات - FULL JOIN USING يتخطى sqlite3AuthRead
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fj-using-auth
التحليل المكتوب: https://abraxaslabs.tech/research/sqlite-fj-using-auth
الفئة: صلاحية متبقية النطاق: محلي
SQLite 3.53.4 (b09c88c / SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
تعيد lookupName() كتابة عمود FULL JOIN USING إلى coalesce(...) (TK_FUNCTION). لا تُشغَّل sqlite3AuthRead إلا من أجل TK_COLUMN / TK_TRIGGER، لذا لا تتلقى أعمدة USING أي استدعاء SQLITE_READ أبدًا. المُضمِّن الذي ثبّت sqlite3_set_authorizer ورفض/تجاهل READ على t2.x لا يزال يُرجع ذلك العمود عبر SELECT x FROM t1 FULL JOIN t2 USING(x).
المُفوِّض معطّل عند الفتح الافتراضي. إنه بقايا من واجهة C البرمجية تلك. ليس RCE. يبقى FULL JOIN ON وLEFT JOIN USING مرفوضين / دون تسريب. لا يزال coalesce(t2.x) الصريح يمر عبر التفويض.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (تخطي المُفوِّض على مستوى العمود) |
| النطاق | محلي (sqlite3_set_authorizer في المُضمِّن؛ SQL من المهاجم) |
| CWE | CWE-863، CWE-284 |
| CVSS | مرتفع: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| المنتج | SQLite (نسخة GitHub المرآة sqlite/sqlite) |
| المتأثر | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69). إصلاح المُفوِّض FULL JOIN USING الخاص بـ 3.54 فقط (2cb2287768) غير موجود في هذا الإصدار GA. |
| المصادقة | المُضمِّن ثبّت sqlite3_set_authorizer؛ الدالة الافتراضية هي NULL |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18840 فقط. سلسلة إثبات. ليس RCE. |
ضد مُضمِّن ثبّت sqlite3_set_authorizer كقائمة تحكم وصول على مستوى الأعمدة، جهّز SELECT x FROM t1 FULL JOIN t2 USING(x) (أو NATURAL FULL JOIN). يُرفض SELECT x FROM t2 المجرّد (SQLITE_AUTH 23). أما صيغة FULL JOIN USING فتُرجع العمود المرفوض قراءته. لا يُطلق أي استدعاء READ t2.x.
المُفوِّض معطّل ما لم يثبّته المُضمِّن. sqlite3_open الافتراضي ليس هذه البقايا. ليس RCE.
عشرون عملية بحث في المصدر للإصدار 3.53.4 بعد PHP. كانت قائمة التخطي قد ذكرت بالفعل إصلاح المُفوِّض FULL JOIN USING الخاص بـ 3.54. لا يزال مفقودًا في أحدث إصدار GA. pExpr->op هو TK_FUNCTION عند lookupname_end، لذا لا يُشغَّل أبدًا حاجز AuthRead. كما يمنع WRC_Prune المُتجوِّل من النزول إلى وسائط coalesce.
lookupname_end:
if( cnt==1 ){
#ifndef SQLITE_OMIT_AUTHORIZATION
if( pParse->db->xAuth
&& (pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER)
){
sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList);
}
#endif
المسارات الخاطئة المسجّلة مسبقًا: اعتبار authorizer مُفعّلًا افتراضيًا؛ توقّع أن يُسرّب LEFT JOIN USING أو FULL JOIN ON؛ توقّع أن يتخطى coalesce(t2.x) الصريح عملية AuthRead؛ تثبيت الإصدار 3.54.0 بينما كان لا يزال مسودة.
cd lab
./run.sh
يبني تجميع sqlite-src-3530400 الرسمي. أداة الاختبار هي lab/auth.c. الاسترجاع عبر 127.0.0.1:18840. المفوّض يمنع READ على t2.x. يُرفض SELECT x FROM t2. يُرجع SELECT x FROM t1 FULL JOIN t2 USING(x) الشاهد، مع 0 READ t2.x. يُرفض FULL JOIN ON. LEFT JOIN USING لا يسرّب. خط الأساس لـ IGNORE هو NULL؛ IGNORE FULL JOIN USING لا يزال يسرّب.
SUCCESS sqlite-fj-using-auth how=full-join-using-skip-authread baseline=denied fj-using=witness fj-on=denied left-using=no-leak SQLITE-FJ-USING-AUTH-WITNESS
قم بتكرار sqlite3AuthRead على كل عنصر فرعي من pFJMatch بعد إعادة كتابة الدمج (coalesce rewrite)، بالطريقة التي يفعلها trunk 2cb2287768 / Git 5694c3bb للإصدار 3.54. إن تفويض a[0] فقط (bbd69ce274) ليس كافيًا. إن LEFT JOIN USING و FULL JOIN ON تقومان بالتفويض بالفعل؛ فهما ليسا هذا المتبقي.
b09c88c14082339b66c7b7158d609a771e64ca69)src/resolve.c إعادة كتابة الدمج في lookupName وبوابة AuthReadsrc/auth.c sqlite3AuthRead / sqlite3AuthReadCol