
SQLite 3.53.4 CLI - उच्च - स्थानीय - कमांड इंजेक्शन - go और slash टर्मिनेटर फिर dot-command
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
Class: Command injection Reach: Local
SQLite 3.53.4 (b09c88c) का डिफ़ॉल्ट sqlite3 CLI अभी भी SQL Server go और Oracle / को statement terminators मानता है। line_is_command_terminator उस लाइन को ; में बदल देता है। खाली SQL buffer वाली अगली लाइन do_meta_command है, इसलिए .shell / .output / .read operator UID के रूप में चलते हैं।
--safe अभी भी .shell को ब्लॉक करता है। वह नियंत्रण कायम है। डिफ़ॉल्ट sqlite3 --safe को चालू नहीं करता। libsqlite3 नहीं। Oracle एक witness string का echo है।
| ID | अभी तक कोई CVE नहीं |
| Class | Command injection (CLI go / / terminator फिर बाद में एक dot-command) |
| Reach | Local (victim --safe के बिना attacker SQL/script पर डिफ़ॉल्ट sqlite3 चलाता है; UI:R) |
| CWE | CWE-78 |
| CVSS | High: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Product | SQLite (sqlite3 CLI) |
| Affected | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| Auth | victim डिफ़ॉल्ट sqlite3 को एक script देता है; कोई --safe नहीं |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18920। Witness SQLITE-CLI-GO-WITNESS। |
जब operator --safe के बिना sqlite3 को दिए गए script में unterminated SQL के बाद, एक go या / लाइन फिर .shell / .output / .read चलता है, तो वह operator UID के रूप में चलता है।
एक semicolon पहले ही statement समाप्त कर देता है। बचा हुआ भाग terminating SQL है जिसमें ; नहीं है, इसलिए जो wrapper सोचता था कि statement अभी भी खुला है, वह अगला dot-command चला देता है। .shell यानी system()। Lab oracle एक witness का echo है। Reverse shell नहीं।
OpenLiteSpeed के बाद 3.53.4 की बीस source hunts। नवीनतम GA, 3.54.0 draft नहीं। CLI extras डिफ़ॉल्ट library नहीं हैं। --safe अविश्वसनीय scripts के लिए documented sink है (CVE-2022-46908)। यह अभी भी .shell को ब्लॉक करता है। डिफ़ॉल्ट sqlite3 इसे चालू नहीं करता।
src/shell.c.in में अभी भी SQL Server / Oracle compatibility path है। Trunk ac6ac0c22d (2026-10-08) इसे तब तक अक्षम करता है जब तक SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR न हो। वह check-in इस GA के बाद है।
पहले से दर्ज गलत रास्ते: semicolon को उसी leftover के रूप में मानना; CVE-2022-46908 को दोबारा दर्ज करना; --safe के डिफ़ॉल्ट होने की अपेक्षा करना; इसे libsqlite3 RCE कहना; oracle के रूप में reverse shell का उपयोग करना; 3.54.0 (draft) को pin करना।
cd lab
./run.sh
आधिकारिक sqlite-src-3530400 को डिफ़ॉल्ट Unix sqlite3 (--disable-readline) में build करता है। Compose sqlite-cli-go। 127.0.0.1:18920 पर Dummy TCP। डिफ़ॉल्ट CLI ने go और / को terminators माना और फिर .shell echo SQLITE-CLI-GO-WITNESS चलाया। --safe ने cannot run .shell in safe mode प्रिंट किया। Bind loopback।
SUCCESS sqlite-cli-go how=go-then-dot-shell slash=yes safe=blocked SQLITE-CLI-GO-WITNESS
go और / को terminators मानना बंद करें, जो कि trunk ac6ac0c22d करता है जब तक -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR न हो। तब तक, अविश्वसनीय scripts को --safe के साथ चलाएँ। --safe वह नियंत्रण है जो अभी भी कायम है।
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in line_is_command_terminator, process_input rewrite, do_meta_command, failIfSafeMode के बाद .shell system()--safe--safe