
SQLite 3.53.4 - उच्च - स्थानीय - क्रैश - COLLATE श्रृंखला SQLITE_LIMIT_EXPR_DEPTH को छोड़ देती है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
राइट-अप: https://abraxaslabs.tech/research/sqlite-collate-depth
वर्ग: क्रैश पहुँच: लोकल
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
COLLATE व्याकरण क्रिया कभी sqlite3ExprCheckHeight को कॉल नहीं करती। sqlite3ExprAddCollateToken एक TK_COLLATE नोड आवंटित करता है जिसमें nHeight अभी भी 1 है, फिर पिछले एक्सप्रेशन को pLeft पर टाँग देता है। सामान्य ऑपरेटर sqlite3PExpr से होकर गुज़रते हैं और दस्तावेज़ित SQLITE_LIMIT_EXPR_DEPTH (डिफ़ॉल्ट 1000) प्राप्त करते हैं। यह ऑपरेटर ऐसा नहीं करता।
वॉकर फिर भी हर pLeft पर रिकर्स करता है। EP_Skip affinity के लिए है, sqlite3WalkExprNN के लिए नहीं। 50-नोड की चेन 1 लौटाती है। 8k और 40k भी, गहराई सीमा से परे। 120k sqlite3WalkExprNN में ASan स्टैक-ओवरफ़्लो करता है (rc=134)। RCE नहीं।
कैनोनिकल ट्री https://sqlite.org/src है। GitHub sqlite/sqlite एक Fossil मिरर है। आधिकारिक ज़िप sqlite-src-3530400। पब्लिक डोमेन लाइब्रेरी। यह पैक AGPLv3 है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | क्रैश (sqlite3WalkExprNN में ASan स्टैक-ओवरफ़्लो; RCE प्रदर्शित नहीं) |
| पहुँच | लोकल (अविश्वसनीय SQL या एक रोपित VIEW) |
| CWE | CWE-674, CWE-770 |
| CVSS | उच्च: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| उत्पाद | SQLite 3.53.4 |
| प्रभावित | 3.53.4 (b09c88c); बाद के trunk COLLATE height चेक का अवशेष |
| प्रमाणीकरण | अविश्वसनीय SQL या VIEW; डिफ़ॉल्ट load_extension बंद रहता है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1:18800। ASan अमालगमेशन। क्रैश साक्षी। |
SQL के रूप में एक लंबी पोस्टफ़िक्स COLLATE BINARY चेन फ़ीड करें, या इसे किसी अविश्वसनीय .db के अंदर एक VIEW में रोपित करें। होस्ट प्रोसेस चेन पर चलता है और C स्टैक पर मर जाता है। दस्तावेज़ित एक्सप्रेशन-गहराई सीमा इस ऑपरेटर पर कभी नहीं चलती।
SELECT 1 COLLATE BINARY COLLATE BINARY ... ही काफ़ी है। CREATE VIEW v AS SELECT 1 COLLATE BINARY ... में वही आकार, फिर एक नए कनेक्शन पर SELECT * FROM v। डिफ़ॉल्ट SQLITE_LIMIT_SQL_LENGTH (1e9) उस ~1.8 MB चेन को रोके रखता है जिसने इस लैब में 8 MB स्टैक को ओवरफ़्लो किया।
यह एम्बेडर प्रोसेस का क्रैश है। यह इंस्ट्रक्शन-पॉइंटर नियंत्रण नहीं है। load_extension बंद रहता है।
OpenLiteSpeed के बाद SQLite टैग version-3.53.4 की बीस सोर्स खोजें। नवीनतम GA, 3.54.0 ड्राफ़्ट नहीं। sqlite.org/security.html अविश्वसनीय SQL और अविश्वसनीय .db को प्रथम-श्रेणी मानता है। डिफ़ॉल्ट load_extension बंद है।
COLLATE के लिए parse.y तीन पंक्तियाँ है:
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken pNew->pLeft = pExpr और EP_Collate|EP_Skip सेट करता है। sqlite3ExprAlloc ने nHeight = 1 छोड़ा। कोई sqlite3ExprCheckHeight नहीं। sqlite3PExpr बाकी हर बाइनरी ऑपरेटर के लिए ये दोनों काम करता है।
गलत रास्ते: 8k COLLATE को क्रैश मानना (इसने 1 लौटाया); 40k को क्रैश मानना (इसने भी 1 लौटाया, SQLITE_LIMIT_EXPR_DEPTH 1000 से काफी आगे); sqlite3WalkExprNN में ASan मरने से पहले 120k की ज़रूरत पड़ना।
यह पिन पर चौदह बचे हुओं में से G1 है। सहोदर अन्य पोस्ट हैं।
cd lab
./run.sh
आधिकारिक sqlite-src-3530400 से ASan amalgamation (टैग version-3.53.4 का fallback clone)। sqlite-collate-depth को compose करें। 127.0.0.1:18800 पर dummy HTTP। इसे loopback से bind करें।
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE 1 लौटाता है। 8k और 40k भी 1 लौटाते हैं। 120k मरता है rc=134, sqlite3WalkExprNN में ASan स्टैक-ओवरफ़्लो। पिन जाँच SELECT sqlite_version() / SELECT sqlite_source_id() है।
pLeft संलग्न करने के बाद COLLATE नोड पर sqlite3ExprCheckHeight को कॉल करें, जैसे sqlite3PExpr पहले से करता है। चाइल्ड से nHeight की पुनर्गणना करें। एक पोस्टफ़िक्स ऑपरेटर अभी भी एक एक्सप्रेशन ट्री है।
ट्रंक 252c0b7bf5 (2026-10-04) इस GA के बाद है।
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y COLLATE क्रियाsrc/expr.c sqlite3ExprAddCollateToken, sqlite3ExprAlloc (nHeight = 1), sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH डिफ़ॉल्ट 1000