
SQLite 3.53.4 CLI - High - Local - Command injection - go 및 슬래시 종료자와 dot-command
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cli-go
분석 문서: https://abraxaslabs.tech/research/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 / / 종결자 이후 나중의 점 명령) |
| 도달 범위 | 로컬 (피해자가 --safe 없이 공격자의 SQL/스크립트에 대해 기본 sqlite3를 실행; 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에 스크립트를 입력; --safe 없음 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18920 전용. 증인 SQLITE-CLI-GO-WITNESS. |
운영자가 --safe 없이 sqlite3에 입력하는 스크립트에서 종결되지 않은 SQL 뒤에 go 또는 / 줄이 오면, 이어서 .shell / .output / .read가 운영자 UID로 실행됩니다.
세미콜론은 이미 문장을 종료합니다. 남는 것은 ;가 없는 종결 SQL이며, 문장이 여전히 열려 있다고 판단한 래퍼가 다음 점 명령을 계속 실행하게 됩니다. .shell은 system()입니다. 랩 오라클은 증인의 echo입니다. 리버스 셸이 아닙니다.
OpenLiteSpeed 이후 3.53.4를 대상으로 스무 차례 소스 탐색을 진행했습니다. 3.54.0 초안이 아닌 최신 GA입니다. 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). 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와 /를 종료자로 취급하는 것을 중단하십시오. trunk 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