
SQLite 3.53.4 - عالي - محلي - بقايا صلاحيات - FULL JOIN USING يتخطى sqlite3AuthRead
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 و DENY/IGNORE لـ READ على t2.x لا يزال يُرجع ذلك العمود عبر SELECT x FROM t1 FULL JOIN t2 USING(x).
المُفوِّض (Authorizer) معطّل عند الفتح الافتراضي. بقايا من واجهة C API تلك. ليس RCE. FULL JOIN ON و LEFT JOIN USING يبقيان مرفوضين / بلا تسريب. coalesce(t2.x) الصريح لا يزال يُفوَّض.
| ID | لا يوجد 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
المنعطفات الخاطئة المسجّلة مسبقاً: اعتبار المُفوِّض مفعّلاً افتراضياً؛ توقع تسريب LEFT JOIN USING أو FULL JOIN ON؛ توقع أن coalesce(t2.x) الصريح يتخطى AuthRead؛ تثبيت 3.54.0 بينما كان لا يزال مسودة.
cd lab
./run.sh
يبني دمج sqlite-src-3530400 الرسمي. أداة الاختبار هي lab/auth.c. Loopback 127.0.0.1:18840. المُفوِّض DENY 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، بالطريقة التي يفعلها trunk 2cb2287768 / Git 5694c3bb للإصدار 3.54. تفويض a[0] فقط (bbd69ce274) ليس كافياً. LEFT JOIN USING و FULL JOIN ON يُفوَّضان بالفعل؛ ليسا هذه البقايا.
b09c88c14082339b66c7b7158d609a771e64ca69)src/resolve.c إعادة كتابة coalesce في lookupName وبوابة AuthReadsrc/auth.c sqlite3AuthRead / sqlite3AuthReadCol