
SQLite 3.53.4 CLI - High - Local - 명령어 주입 - recover dump가 악성 스키마를 dot-command로 출력
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-recover
분류: 명령 주입 도달 범위: 로컬
SQLite 3.53.4 (b09c88c) CLI .recover는 악의적인 sqlite_schema.sql을 이후 dot-command로 출력한다. recoverOneStmt는 첫 번째 구문만 준비한다. 삽입된 CREATE TABLE과 개행 뒤의 .shell은 여전히 기록된다. 문서화된 복원 파이프는 이를 운영자 UID로 실행한다.
.dump의 printSchemaLine은 동일한 출력 클래스다. libsqlite3가 아니다. --safe도 아니다. 오라클은 증인 문자열의 echo다.
| ID | 아직 CVE 없음 |
| 분류 | 명령 주입 (CLI .recover / .dump 스키마 출력) |
| 도달 범위 | 로컬 (피해자가 문서화된 복원 파이프를 실행; 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 hostile.db .recover | sqlite3 restored.db 실행 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18930 전용. 증인 SQLITE-CLI-RECOVER-WITNESS. |
유효한 첫 번째 CREATE와 이후의 .shell을 sqlite_schema.sql에 삽입한다. 해당 db를 두 번째 sqlite3로 복원하는 피해자는 자신의 UID로 dot-command를 실행하게 된다.
삽입물은 .db 파일이다. 피해자 행동은 문서화된 복원 파이프이며, 붙여넣은 go 라인도 아니고 실수로 --safe를 끈 것도 아니다. .shell은 system()이다. 랩 오라클은 증인의 echo다. 리버스 셸이 아니다.
3.53.4의 소스 헌트 20회. Recover 자체의 헌트는 recoverOneStmt를 첫 구문만 준비한다고 판단하고 넘어갔다. 남은 것은 출력 경로다: recoverSqlCb가 여전히 추가 텍스트를 출력한다. 그 스크립트를 파이프로 연결하는 것이 sqlite.org가 복원하라고 알려주는 방법이다.
이미 기록된 잘못된 방향: 첫 구문 준비를 제거로 간주한 것; 3.54.0(초안)에 고정한 것; CVE-2022-46908 --safe를 다시 제출한 것; 이것을 libsqlite3 RCE라고 부른 것; 리버스 셸을 오라클로 사용한 것.
cd lab
./run.sh
sqlite-src-3530400을 기본 Unix CLI recover(OPT_SHELL / SQLITE_ENABLE_DBPAGE_VTAB)로 sqlite3에 빌드한다. .dbconfig defensive off 후 writable_schema. 삽입된 CREATE TABLE t(x);와 개행 뒤의 .shell echo SQLITE-CLI-RECOVER-WITNESS. .recover가 .shell을 출력했다. 두 번째 sqlite3로 파이프되자 실행되었다. 루프백 바인드.
SUCCESS sqlite-cli-recover how=recover-pipe-dot-shell recover-has-shell=yes restore-echo=yes SQLITE-CLI-RECOVER-WITNESS
단일 구문이 아닌 스키마 SQL을 출력하지 말 것. 첫 번째 prepare에서 분할하여 해당 구문만 출력하거나, 해당 행을 거부할 것. 일반 CREATE를 가상 테이블 덤프가 이미 사용하는 %q 방식으로 인용할 것. 이후의 . 라인을 악의적인 것으로 간주하고 버릴 것. 복원 sqlite3에서 --safe는 .shell을 차단하지만, 문서화된 파이프에서는 켜져 있지 않다.
b09c88c14082339b66c7b7158d609a771e64ca69).recover 후 복원ext/recover/sqlite3recover.c recoverOneStmt / recoverWriteSchema1src/shell.c.in recoverSqlCb, .dump printSchemaLine