
SQLite 3.53.4 CLI - High - Local - Command injection - go 및 슬래시 종료자와 dot-command
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 / / 종결자 이후 뒤따르는 dot-command) |
| 도달 범위 | 로컬 (피해자가 --safe 없이 공격자 SQL/스크립트에 대해 기본 sqlite3를 실행; UI:R) |
| CWE | CWE-78 |
| CVSS | High: 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이므로, 문장이 아직 열려 있다고 생각한 래퍼가 다음 dot-command를 계속 실행한다. .shell은 system()이다. 랩 오라클은 증인의 echo이다. 리버스 셸이 아니다.
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라고 부름; 리버스 셸을 오라클로 사용; 3.54.0(초안) 고정.
cd lab
./run.sh
공식 sqlite-src-3530400을 기본 Unix sqlite3로 빌드한다(--disable-readline). Compose sqlite-cli-go. 127.0.0.1:18920의 더미 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와 /를 종결자로 취급하는 것을 중단하는 것, 즉 트렁크 ac6ac0c22d가 -DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR가 없으면 하는 일이다. 그때까지는 신뢰할 수 없는 스크립트를 --safe로 실행하라. --safe는 여전히 유효한 통제이다.
b09c88c14082339b66c7b7158d609a771e64ca69)src/shell.c.in line_is_command_terminator, process_input 재작성, do_meta_command, failIfSafeMode 이후 .shell system()--safe--safe