
SQLite 3.53.4 sqlite3_rsync - 높음 - 원격 - RCE - SSH 파일명 명령어 주입
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를 공백으로 이어 붙이면서 그 인용 부호를 제거한다. 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 전용. 에코 증거. 리버스 셸 없음. |
sqlite3_rsync USER@HOST:PATH의 원격 경로에 ;, $(), 백틱, 또는 |를 넣는다. 피해자가 이 유틸리티를 실행해야 한다(UI:R). 추가 명령은 SSH 원격 UID로 실행된다.
append_escaped_arg(..., 1)는 로컬 /bin/sh -c를 위해 작은따옴표로 감싼다. 그 인용 부호는 로컬에서 소비된다. OpenSSH는 남은 argv를 하나의 원격 명령 문자열로 연결한다. 로그인 셸은 그 메타문자를 인용되지 않은 상태로 본다.
이것은 libsqlite3가 아니다. 기본 sqlite3.c는 이 프로토콜을 포함하지 않는다. Ada Logics의 레플리카 스택 스매시(readPow2 지수 상한)는 3.53.4에서 이미 닫혀 있다.
3.53.2 FTS5 / 세션 물결 이후 SQLite 태그 version-3.53.4를 스무 번 소스 헌팅했다. 기본 라이브러리에는 여전히 다른 잔재가 남아 있다(이 팩은 rsync 유틸리티다). tool/sqlite3_rsync.c의 popen2는 /bin/sh -c를 exec한다. hostSeparator는 첫 콜론에서 분리한다. append_escaped_arg의 반환값은 절대 검사되지 않는다.
잘못된 방향: Ada Logics 스택 스매시를 아직 열려 있다고 취급한 것; 리버스 셸을 랩에서 시험한 것; 실제 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
이 GA 이후 trunk b0db2db(2026-10-07, ANT-2026-31X9HVRR)가 하는 방식대로 피어로 전송되는 파일 이름을 헥스 인코딩한다(isFilename==2 / --encoded-filenames). USER@HOST와 --ssh는 로컬 sh 인용으로 유지한다. 로컬 작은따옴표가 OpenSSH argv 결합에서 살아남는다고 의존하지 마라.
b09c88c14082339b66c7b7158d609a771e64ca69)append_escaped_arg, popen2, 원격 ORIGIN/REPLICA SSH argvb0db2db / Fossil eaec2f7f (2026-10-07)