
SQLite 3.53.4 - उच्च - स्थानीय - क्रैश - COLLATE श्रृंखला SQLITE_LIMIT_EXPR_DEPTH को छोड़ देती है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Class: Crash Reach: Local
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 नहीं |
| Class | Crash (sqlite3WalkExprNN में ASan स्टैक-ओवरफ़्लो; RCE प्रदर्शित नहीं) |
| Reach | Local (अविश्वसनीय SQL या एक रोपित VIEW) |
| CWE | CWE-674, CWE-770 |
| 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 3.53.4 |
| Affected | 3.53.4 (b09c88c); बाद के trunk COLLATE height check का अवशेष |
| Auth | अविश्वसनीय SQL या VIEW; डिफ़ॉल्ट load_extension बंद रहता है |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 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 अमलगमेशन (टैग version-3.53.4 का फ़ॉलबैक क्लोन)। Compose sqlite-collate-depth। 127.0.0.1:18800 पर डमी HTTP। इसे लूपबैक पर बाइंड करें।
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 की पुनर्गणना करें। एक पोस्टफ़िक्स ऑपरेटर अभी भी एक एक्सप्रेशन ट्री है।
Trunk 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