
एक विशेष रूप से तैयार किए गए SZ मान द्वारा ट्रिगर किए गए SQLite SQLAR heap-buffer-overflow के लिए एडवाइज़री और AddressSanitizer रिप्रोड्यूसर, जो ट्रंकेटेड आवंटन और zlib आउट-ऑफ-बाउंड राइट का कारण बनता है।
CVE-2026-39113, SQLite के वैकल्पिक SQLAR एक्सटेंशन में एक हीप बफ़र ओवरफ्लो है। ऐसे एप्लिकेशन में जिसने एक्सटेंशन लोड किया है, एक हमलावर जो नियंत्रित संपीड़ित ब्लॉब और आकार के साथ sqlar_uncompress() को आमंत्रित कर सकता है, LP64 प्रणाली पर zlib को हीप आवंटन से परे लिखने का कारण बन सकता है। यह होस्ट प्रक्रिया के भीतर एक मेमोरी-सुरक्षा सीमा विफलता है; यह SQLite डेटाबेस-फ़ाइल पार्सिंग समस्या, प्रमाणीकरण बायपास, या हर डिफ़ॉल्ट SQLite तैनाती में पहुँच योग्य दोष नहीं है।
कमज़ोर व्यवहार 2026-03-11 को Git कमिट 169f68e (Fossil चेक-इन 8bdc0d485e3ad0c7...) द्वारा पेश किया गया और 2026-04-01 को Git कमिट 34e139d (Fossil चेक-इन 6194f3b5314ef98b...) द्वारा सुधारा गया। प्रभावित दायरा 169f68e से 34e139d के पैरेंट तक के स्रोत स्नैपशॉट और कस्टम बिल्ड हैं। किसी आधिकारिक SQLite रिलीज़ को कमज़ोर सत्यापित नहीं किया गया: SQLite 3.52.0 परिचय से पहले की है, और SQLite 3.53.0 में परिचय देने वाला परिवर्तन और सुधार दोनों शामिल हैं। इसलिए SQLite 3.53.0 सुधारित कोड वाली पहली आधिकारिक रिलीज़ है, न कि प्रभावित रिलीज़।
मैंने सटीक कमज़ोर रिवीज़न, परिचय देने वाले और सुधार करने वाले परिवर्तन, और 3.52.0 तथा 3.53.0 रिलीज़ स्नैपशॉट की समीक्षा की। मैंने एक डिस्पोज़ेबल WSL2 Ubuntu 24.04 वातावरण में अधिकृत रन के संरक्षित आउटपुट का भी निरीक्षण किया। AddressSanitizer ने हीप-बफ़र-ओवरफ्लो और उसके बाद प्रक्रिया समाप्ति देखी, जिससे नेटिव हीप भ्रष्टाचार और सेवा से वंचित करना स्थापित हुआ। कोड निष्पादन प्रदर्शित नहीं किया गया।
SQLAR एक SQLite संग्रह प्रारूप है। ext/misc/sqlar.c में वैकल्पिक एक्सटेंशन sqlar_compress() और sqlar_uncompress() को SQL फ़ंक्शन के रूप में पंजीकृत करता है। यह SQLite का उपयोग करने वाले हर एप्लिकेशन का हिस्सा नहीं है; कमज़ोर पथ के लिए एक्सटेंशन का उपस्थित और लोड होना आवश्यक है।
इस रिपोर्ट के लिए, Mallory निम्न क्वेरी में दिए गए ब्लॉब और SZ तर्कों को नियंत्रित करता है:
SELECT sqlar_uncompress(?1, ?2);
परीक्षण किए गए वातावरण में 32-बिट int, 64-बिट sqlite3_int64 और zlib uLongf था। फ़ंक्शन को कम से कम उतनी मेमोरी आवंटित करनी चाहिए जितनी zlib को लिखने की अनुमति है। इसके बजाय, कमज़ोर स्रोत 64-बिट आकार को sqlite3_malloc() के 32-बिट पैरामीटर प्रकार में परिवर्तित करता है, जबकि uncompress() के लिए पूर्ण मान बनाए रखता है।
कमज़ोर स्रोत स्नैपशॉट ने कॉन्फ़िगरेशन के दौरान Configuring SQLite version 3.53.0 मुद्रित किया। उस डेवलपमेंट-संस्करण स्ट्रिंग को 2026-04-09 की आधिकारिक SQLite 3.53.0 रिलीज़ के साथ भ्रमित नहीं किया जाना चाहिए, जिसके स्रोत में सुधार शामिल है।
मूल्यांकित रिवीज़न पर, ext/misc/sqlar.c में sqlarUncompressFunc() हमलावर-नियंत्रित आकार को 64-बिट पूर्णांक के रूप में पढ़ता है:
sqlite3_int64 sz;
sz = sqlite3_value_int64(argv[1]);
यदि sz धनात्मक है और इनपुट ब्लॉब लंबाई से भिन्न है, तो वही मान दो असंगत तरीकों से उपयोग किया जाता है:
uLongf szf = sz;
const Bytef *pData = sqlite3_value_blob(argv[0]);
Bytef *pOut = sqlite3_malloc(sz);
if( pOut==0 ){
sqlite3_result_error_nomem(context);
}else if( Z_OK!=uncompress(pOut, &szf, pData, nData) ){
sqlite3_result_error(context, "error in uncompress()", -1);
}
इस रिवीज़न पर, SQLite sqlite3_malloc(int) घोषित करता है। परीक्षण किए गए LP64 बिल्ड पर, PoC मान 4294967328 (0x100000020) उस API को पारित होने पर 32 बन गया, जबकि szf ने पूर्ण 64-बिट मान बनाए रखा। इसलिए SQLite ने छोटा आवंटन किया, लेकिन zlib को बताया गया कि आउटपुट बफ़र 4 GiB से अधिक रख सकता है। 4096 बाइट डेटा का प्रतिनिधित्व करने वाले 42-बाइट ब्लॉब को विसंपीड़ित करने से आवंटन सीमा का उल्लंघन हुआ।
यह बेमेल तब परियोजना में आया जब 2026-03-11 परिवर्तन ने आवंटन API को बदले बिना sqlite3_value_int() को sqlite3_value_int64() से बदल दिया। SQLite 3.52.0 की स्रोत समीक्षा में पहले का 32-बिट रीड दिखता है, इसलिए पूर्ण-चौड़ाई/छोटा-आवंटन बेमेल वहाँ मौजूद नहीं था। 2026-04-01 सुधार ने आवंटन को sqlite3_malloc64(sz) में बदल दिया। आधिकारिक 3.53.0 टैग की स्रोत समीक्षा से उस सुधारित कॉल की पुष्टि होती है।
प्रदर्शित प्रिमिटिव SQLite को होस्ट करने वाली प्रक्रिया में एक आउट-ऑफ-बाउंड हीप लेखन है। संरक्षित रन से पता चलता है कि AddressSanitizer ने sqlite3_malloc() के माध्यम से आवंटित 40-बाइट हीप क्षेत्र के तुरंत बाद पहले अमान्य एक-बाइट लेखन का पता लगाया, उसके बाद abort हुआ। यह सीधे प्रक्रिया क्रैश और सेवा से वंचित करने का समर्थन करता है।
शोषण के लिए निम्नलिखित सभी आवश्यक हैं:
SZ मान के साथ sqlar_uncompress() को आमंत्रित कर सकता है;int 32-बिट है जबकि sqlite3_int64 और zlib uLongf 64-बिट हैं; औरPoC विसंपीड़ित बाइट्स को नियंत्रित करता है, जो नेटिव हीप भ्रष्टाचार की गंभीरता के लिए प्रासंगिक है। हालाँकि, इस प्रिमिटिव को कोड निष्पादन में बदलना आवंटक लेआउट, आसपास की प्रक्रिया स्थिति, शमन और उपयुक्त एप्लिकेशन-स्तरीय मार्ग पर निर्भर करेगा। ऐसी कोई श्रृंखला परीक्षण या प्रदर्शित नहीं की गई, इसलिए यह रिपोर्ट कोड निष्पादन का दावा नहीं करती।
संरक्षित रन में सुधारित रिवीज़न के विरुद्ध रनटाइम नकारात्मक नियंत्रण शामिल नहीं था। दो स्रोत-स्तरीय नियंत्रण स्पष्टीकरण को सीमित करते हैं: SQLite 3.52.0 आकार को 32-बिट API से पढ़ता है, और आधिकारिक 3.53.0 स्रोत sqlite3_malloc64() से आवंटित करता है। ये जाँचें पहचाने गए परिचय और सुधार का समर्थन करती हैं, लेकिन निष्पादित सुधारित-लक्ष्य परीक्षणों के रूप में प्रस्तुत नहीं की गई हैं। इस वैकल्पिक एक्सटेंशन को लोड करने वाले एप्लिकेशनों की व्यापकता अज्ञात है।
रिपॉज़िटरी में शामिल हैं:
poc/verify_sqlar_poc.c, जो 4096-बाइट पेलोड बनाता है, उसे संपीड़ित करता है, sqlar.so लोड करता है, और SZ = 4294967328 बाँधता है;poc/reproduce.sh, जो पिन किए गए SQLite और zlib रिवीज़न क्लोन करता है, उन्हें AddressSanitizer के साथ बनाता है, एक्सटेंशन और हार्नेस संकलित करता है, और ट्रिगर चलाता है; औरevidence/asan-summary.txt, अवलोकित अधिकृत रन का पथ-सामान्यीकृत सारांश।रिप्रोड्यूसर को केवल डिस्पोज़ेबल Linux या WSL वातावरण में चलाएँ। यह जानबूझकर मेमोरी भ्रष्टाचार और AddressSanitizer abort को ट्रिगर करता है। स्क्रिप्ट को git, make, एक C कंपाइलर, मानक बिल्ड टूल्स और नेटवर्क एक्सेस की आवश्यकता होती है:
chmod +x poc/reproduce.sh
./poc/reproduce.sh
रिप्रोड्यूसर को 2026-08-21 को WSL2 के अंतर्गत Ubuntu 24.04 पर फिर से चलाया गया और उसने वही AddressSanitizer निष्कर्ष उत्पन्न किया। इसका प्रासंगिक आउटपुट था:
env: sizeof(int)=4 sizeof(sqlite3_int64)=8 sizeof(uLongf)=8
payload: plain=4096 compressed=42 evil_sz=4294967328 low32=32
ERROR: AddressSanitizer: heap-buffer-overflow
WRITE of size 1
#0 inflate_fast zlib/inffast.c:252
#4 uncompress zlib/uncompr.c:100
#5 sqlarUncompressFunc sqlite/ext/misc/sqlar.c:97
The write occurred immediately after a 40-byte heap region.
SUMMARY: AddressSanitizer: heap-buffer-overflow in inflate_fast
ABORTING
PoC exit status: 1
यह आउटपुट असंगत प्रकार की चौड़ाई और तैयार किया गया आकार, zlib लेखन, sqlarUncompressFunc() से कॉल और आवंटन सीमा उल्लंघन दिखाता है। रिप्रोड्यूसर स्क्रिप्ट बाहर निकलने पर अपनी अस्थायी बिल्ड निर्देशिका हटा देती है, जब तक KEEP_BUILD=1 सेट न हो।
उपस्ट्रीम ने कमज़ोर आवंटन को कमिट 34e139d में सुधारा:
- Bytef *pOut = sqlite3_malloc(sz);
+ Bytef *pOut = sqlite3_malloc64(sz);
यह आवंटन चौड़ाई को uLongf szf में बनाए रखे गए और zlib को पारित किए गए धनात्मक 64-बिट sz मान के अनुरूप रखता है। सुधारित कोड आधिकारिक SQLite 3.53.0 में मौजूद है। कमज़ोर अंतराल वाले स्रोत स्नैपशॉट या कस्टम बिल्ड के उपयोगकर्ताओं को 34e139d या बाद के संस्करण में अद्यतन करना चाहिए। जिन एप्लिकेशनों को SQLAR की आवश्यकता नहीं है, उन्हें एक्सटेंशन लोड करने से बचना चाहिए, और जो एप्लिकेशन इसका उपयोग करते हैं, उन्हें अविश्वसनीय कॉलर्स को sqlar_uncompress() में मनमाने तर्क देने से रोकना चाहिए।
एक केंद्रित रिग्रेशन परीक्षण को SQL फ़ंक्शन का मान्य संपीड़ित ब्लॉब और INT_MAX से ऊपर के SZ मान के साथ परीक्षण करना चाहिए जिसके निचले 32 बिट छोटे हों। इसे सत्यापित करना चाहिए कि सुधारित बिल्ड संक्षिप्त आवंटन नहीं करता है और नियंत्रण के रूप में सामान्य सफल विसंपीड़न और अमान्य-इनपुट त्रुटि मामलों को बनाए रखना चाहिए।
CVE-2026-39113 केवल SQLite स्रोत स्नैपशॉट और कस्टम बिल्ड को 169f68e से 34e139d के पैरेंट तक प्रभावित करता है, जब वैकल्पिक SQLAR एक्सटेंशन लोड हो और हमलावर-नियंत्रित कॉल LP64 बिल्ड पर sqlar_uncompress() तक पहुँचें। एक 64-बिट आकार sqlite3_malloc(int) द्वारा संकुचित किया गया जबकि zlib ने पूर्ण मान बनाए रखा, जिससे AddressSanitizer-पुष्टि किया गया हीप-बफ़र-ओवरफ्लो और प्रक्रिया abort उत्पन्न हुआ। किसी आधिकारिक SQLite रिलीज़ को कमज़ोर सत्यापित नहीं किया गया, और कोड निष्पादन प्रदर्शित नहीं किया गया। sqlite3_malloc64(sz) में उपस्ट्रीम परिवर्तन आधिकारिक SQLite 3.53.0 में मौजूद है और आवंटन-चौड़ाई बेमेल को हटा देता है।