abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-rsync-ssh
类别: RCE(命令注入) 触达: 远程(UI:R)
SQLite 3.53.4(b09c88c)的 sqlite3_rsync 为本地 /bin/sh -c 引用 USER@HOST:PATH。随后 OpenSSH 会将这些引号去掉,把远程 argv 以空格拼接后交给登录 shell。PATH 中的分号、$()、反引号或 | 会以 SSH 远程 UID 执行。这是工具,不是 libsqlite3。Ada Logics 的 readPow2 x>16 栈溢出在此版本已修复。
| ID | 暂无 CVE |
| 类别 | RCE(以 SSH 远程 UID 执行命令注入) |
| 触达 | 远程(受害者运行 sqlite3_rsync;UI:R) |
| CWE | CWE-78 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| 产品 | SQLite sqlite3_rsync 工具 |
| 受影响版本 | 3.53.4(b09c88c14082339b66c7b7158d609a771e64ca69,SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) |
| 认证 | 受害者使用恶意的 USER@HOST:PATH 运行 sqlite3_rsync |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18910。Echo 见证。无反向 shell。 |
在 sqlite3_rsync USER@HOST:PATH 的远程路径中放入 ;、$()、反引号或 |。受害者必须运行该工具(UI:R)。额外命令会以 SSH 远程 UID 执行。
append_escaped_arg(..., 1) 为本地 /bin/sh -c 添加单引号。这些引号在本地被消耗掉。OpenSSH 将剩余的 argv 拼接成一个远程命令字符串。登录 shell 看到的元字符没有引号保护。
这不是 libsqlite3。默认的 sqlite3.c 不包含此协议。Ada Logics 的副本栈溢出(readPow2 指数上限)在 3.53.4 上已修复。
在 3.53.2 FTS5 / session 浪潮之后,对 SQLite 标签 version-3.53.4 进行了二十次源码搜寻。默认库仍有其他遗留问题(本包是 rsync 工具)。tool/sqlite3_rsync.c 的 popen2 执行 /bin/sh -c。hostSeparator 在第一个冒号处分割。append_escaped_arg 的返回值从未被检查。
错误方向:认为 Ada Logics 栈溢出仍未修复;搭建反向 shell 实验;连接真实的 sshd;锁定草稿版 3.54.0;将其称为库 RCE。
cd lab
./run.sh
从官方 3.53.4 源码 zip 构建 sqlite3_rsync。伪造的 OpenSSH 在 dest 之后拼接 argv。Origin 为 lab@host:;echo SQLITE-RSYNC-SSH-WITNESS>/work/sandbox/pwned.txt。远程命令包含未加引号的 ;echo。绑定回环地址。
SUCCESS sqlite-rsync-ssh how=openssh-argv-join dest=lab@host remote-has-semicolon=yes SQLITE-RSYNC-SSH-WITNESS
按照 trunk b0db2db(2026-10-07,ANT-2026-31X9HVRR)在此 GA 之后的做法,对发送给对端的文件名进行十六进制编码(isFilename==2 / --encoded-filenames)。USER@HOST 和 --ssh 仍使用本地 sh 引用。不要依赖本地单引号能在 OpenSSH argv 拼接后保留。
append_escaped_arg、popen2、远程 ORIGIN/REPLICA SSH argvb0db2db / Fossil eaec2f7f(2026-10-07)