
SQLite 3.53.4 - उच्च - स्थानीय - क्रैश - VALUES UNION ALL फ़ॉलबैक क्लीनअप स्टैक ओवरफ़्लो
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-values-union
Class: Crash Reach: Local
SQLite 3.53.4 (b09c88c) - Hwaci
डिफ़ॉल्ट VALUES एक को-रूटीन का उपयोग करता है। WITH (या स्कीमा रीलोड, या एक गैर-स्थिर पंक्ति) sqlite3MultiValues को UNION ALL पर मजबूर करता है। जब SF_Values सेट होता है तो कंपाउंड-SELECT लंबाई छोड़ दी जाती है (parse.y:562-567)। फिर पर्याप्त बड़ी पंक्ति सूची को SQLITE_LIMIT_EXPR_DEPTH द्वारा अस्वीकार कर दिया जाता है, और पुनरावर्ती sqlite3ExprDeleteNN त्रुटि-सफ़ाई पथ पर C स्टैक को उड़ा देता है।
5000 पंक्तियों का सादा VALUES ठीक है। WITH और 1000 पंक्तियाँ साफ़ त्रुटि देती हैं (Expression tree is too large)। WITH और 300000 पंक्तियाँ sqlite3ExprDeleteNN में ASan स्टैक-ओवरफ़्लो है (rc=134)। RCE नहीं।
| ID | अभी तक कोई CVE नहीं |
| Class | Crash (ExprDelete पर ASan स्टैक-ओवरफ़्लो; RCE प्रदर्शित नहीं) |
| Reach | Local (अविश्वसनीय SQL, या VIEW/TRIGGER के अंदर VALUES) |
| CWE | CWE-674 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Product | SQLite |
| Affected | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc)। बाद के ट्रंक VALUES कंपाउंड कैप का अवशेष। |
| Auth | हमलावर SQL, या एक रोपित स्कीमा जो UNION ALL फ़ॉलबैक लेता है |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18820। ASan अमलगमेशन। क्रैश साक्षी। |
अविश्वसनीय SQL फ़ीड करें जिसे कोई होस्ट तैयार करेगा। एक विशाल VALUES सूची के आगे WITH लगाएँ ताकि को-रूटीन पथ बंद हो जाए। पार्स को एक एक्सप्रेशन-डेप्थ त्रुटि के साथ विफल होना चाहिए। उस ट्री की सफ़ाई sqlite3ExprDeleteNN में तब तक पुनरावर्तित होती है जब तक प्रक्रिया मर न जाए।
वही फ़ॉलबैक तब सक्रिय होता है जब VALUES किसी VIEW या TRIGGER में रहता है (db->init.busy)। होस्ट एम्बेडर है: एक CLI, एक ऐप जो हमलावर SQL तैयार करता है, एक सेवा जो एक शत्रुतापूर्ण .db खोलती है। SQLite VALUES बाइट्स को कोड के रूप में eval नहीं करता। क्रैश ही निष्कर्ष है।
github.com/sqlite/sqlite टैग version-3.53.4 की बीस स्रोत खोजें। स्किप सूची ने पहले ही CVE-2026-11824, session NPD, concat_ws, LOOKASIDE, JSON UAF, WAL-reset को बंद कर दिया था। डिफ़ॉल्ट load_extension बंद है। पार्सर/VDBE अवशेष यह VALUES UNION ALL स्किप और एक पुनरावर्ती डिस्ट्रक्टर था।
if( (p->selFlags & (SF_MultiValue|SF_Values))==0
&& (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0
&& cnt>mxSelect
){
sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
}
if( pParse->bHasWith
|| pParse->db->init.busy
|| exprListIsConstant(pParse,pRow)==0
...
){
/* The co-routine method cannot be used. Fall back to UNION ALL. */
...
pSelect->op = TK_ALL;
pSelect->pPrior = pLeft;
}
clearSelect() pPrior पर पुनरावृत्त रूप से चलता है। sqlite3ExprDeleteNN() अभी भी pRight पर और pLeft पर पुनरावर्तित होता है जब EP_Static सेट होता है।
गलत मोड़: WITH के साथ 1000 पंक्तियाँ प्रलेखित डेप्थ कैप पर साफ़ त्रुटि देती हैं और क्रैश नहीं होतीं; 300000 पंक्तियों की आवश्यकता थी ताकि डिस्ट्रक्टर डेप्थ 8 MiB C स्टैक को उड़ा दे। सादा VALUES को-रूटीन पर रहता है और नेगेटिव कंट्रोल है।
cd lab
./run.sh
कैनोनिकल 3.53.4 स्रोत zip, ASan sqlite3। Compose sqlite-values-union। प्रकाशित 127.0.0.1:18820। इसे लूपबैक पर बाइंड करें।
SUCCESS sqlite-values-union how=with-values-union-all-fallback-exprdelete rows=300000 crash=asan-stack-overflow plain=5000 depth-error=1000 SQLITE-VALUES-UNION-WITNESS
SQLITE_LIMIT_COMPOUND_SELECT को VALUES पर उसी तरह लागू करें जैसे अन्य कंपाउंड कैप किए जाते हैं। डिलीट पर UNION ALL श्रृंखला को पुनरावृत्त रूप से चलाएँ, या ट्री बनने से पहले EXPR_DEPTH को कैप करें ताकि सफ़ाई C स्टैक से बाहर पुनरावर्तित न हो सके। बाद का ट्रंक (Bug 2026-10-04T05:34:47Z) इस GA के बाद है।
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 जब SF_Values सेट होता है तो कंपाउंड-SELECT स्किपsrc/insert.c:681-704 sqlite3MultiValues UNION ALL फ़ॉलबैकsrc/expr.c:1406-1430 पुनरावर्ती sqlite3ExprDeleteNN