
SQLite 3.53.4 CLI - High - Local - 명령어 주입 - recover dump가 악성 스키마를 dot-command로 출력
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-recover
분석 문서: https://abraxaslabs.tech/research/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. |
sqlite_schema.sql에 유효한 첫 번째 CREATE와 이후의 .shell을 삽입합니다. 해당 db를 두 번째 sqlite3로 복원하는 피해자는 자신의 UID로 dot-command를 실행하게 됩니다.
삽입물은 .db 파일입니다. 피해자 행동은 문서화된 복원 파이프이며, 붙여넣은 go 줄도 아니고 실수로 --safe를 끈 것도 아닙니다. .shell은 system()입니다. 랩 오라클은 증인의 echo입니다. 리버스 셸이 아닙니다.
3.53.4에 대한 스무 차례의 소스 탐색. 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