abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
技术分析文章:https://abraxaslabs.tech/research/sqlite-cli-go
类别: 命令注入 影响范围: 本地
SQLite 3.53.4(b09c88c)默认的 sqlite3 CLI 仍将 SQL Server 的 go 和 Oracle 的 / 视为语句终止符。line_is_command_terminator 会把该行改写为 ;。当 SQL 缓冲区为空时,下一行会进入 do_meta_command,因此 .shell / .output / .read 会以操作员 UID 执行。
--safe 仍会阻止 .shell。该控制措施依然有效。默认的 sqlite3 不会启用 --safe。这不是 libsqlite3 的问题。Oracle 是对见证字符串执行 echo。
| ID | 暂无 CVE |
| 类别 | 命令注入(CLI 的 go / / 终止符,随后执行后续点命令) |
| 影响范围 | 本地(受害者在未启用 --safe 的情况下,用默认 sqlite3 运行攻击者的 SQL/脚本;UI:R) |
| CWE | CWE-78 |
| CVSS | 高危:7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| 产品 | SQLite(sqlite3 CLI) |
| 受影响版本 | 3.53.4(b09c88c14082339b66c7b7158d609a771e64ca69)SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| 认证 | 受害者将脚本提供给默认 sqlite3;未启用 --safe |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18920。见证字符串 SQLITE-CLI-GO-WITNESS。 |
当操作员在未启用 --safe 的情况下将脚本提供给 sqlite3,且脚本中存在未终止的 SQL 后,go 或 / 行之后的 .shell / .output / .read 会以操作员 UID 执行。
分号已经可以结束语句。剩余部分是终止 SQL,它没有 ;,因此认为语句仍未结束的包装器仍会执行下一个点命令。.shell 就是 system()。实验环境中的 oracle 是对见证字符串执行 echo。不是反弹 shell。
在 OpenLiteSpeed 之后,对 3.53.4 进行了二十次源码排查。使用的是最新 GA 版本,而非 3.54.0 草案。CLI 附加功能并非默认库。--safe 是处理不可信脚本的文档化防护措施(CVE-2022-46908)。它仍会阻止 .shell。默认的 sqlite3 不会启用它。
src/shell.c.in 仍保留 SQL Server / Oracle 兼容路径。主干 ac6ac0c22d(2026-10-08)除非定义 SQLITE_SHELL_LEGACY_COMMAND_TERMINATOR,否则会禁用该路径。该提交晚于本 GA 版本。
已记录的弯路:将分号视为相同的剩余部分;重新提交 CVE-2022-46908;期望 --safe 成为默认值;将此称为 libsqlite3 RCE;使用反弹 shell 作为 oracle;锁定 3.54.0(草案)。
cd lab
./run.sh
将官方 sqlite-src-3530400 构建为默认的 Unix sqlite3(--disable-readline)。Compose sqlite-cli-go。在 127.0.0.1:18920 上运行 Dummy TCP。默认 CLI 将 go 和 / 视为终止符,然后运行 .shell echo SQLITE-CLI-GO-WITNESS。--safe 打印 cannot run .shell in safe mode。绑定回环地址。
SUCCESS sqlite-cli-go how=go-then-dot-shell slash=yes safe=blocked SQLITE-CLI-GO-WITNESS
停止将 go 和 / 视为终止符,这正是 trunk ac6ac0c22d 所做的,除非定义了 -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR。在此之前,请使用 --safe 运行不受信任的脚本。--safe 仍然是有效的控制手段。
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in 中的 line_is_command_terminator、process_input 重写、do_meta_command、.shell 在 failIfSafeMode 之后调用 system()--safe--safe