
SQLite 3.53.4 - 높음 - 로컬 - 크래시 - FTS5 secure-delete PutVarint 푸터 오버런
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fts5-securedel
분류: 크래시 도달 범위: 로컬
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) - Hwaci
fts5DoSecureDelete는 nPg = iPgIdx 이후 sqlite3Fts5PutVarint로 FTS5 리프 푸터를 재구성합니다. 푸터에서 디코딩된 키 오프셋이 원본 블롭에 대해 상한이 적용되지 않아, PutVarint 커서가 nn + FTS5_DATA_PADDING (20)을 벗어납니다. 일반적으로 추가 SQLITE_ENABLE_FTS5가 필요합니다. 공격 데이터베이스는 이미 secure-delete를 사용했습니다.
이는 이후 트렁크 Fossil 9cd4f9e920 / Git d9de6eedbe91 / branch-3.53 34171bee08 (2026-08-11, YEONBA)의 잔재입니다. 해당 체크인은 이 GA 이후입니다. 이는 not CVE-2026-11824가 아닙니다: 이 핀에서 fts5LeafRead는 이미 szLeaf<4를 거부합니다.
| ID | 아직 CVE 없음 |
| 분류 | 크래시 (ASan 크기 1 WRITE; RCE는 입증되지 않음) |
| 도달 범위 | 로컬 (조작된 FTS5 데이터베이스를 연 뒤 DELETE/flush) |
| CWE | CWE-787 |
| CVSS | 높음: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| 제품 | SQLite (GitHub 미러 sqlite/sqlite) |
| 영향받는 버전 | 3.53.4 SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| 인증 | 없음 (신뢰할 수 없는 인덱스 파일) |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18860 전용. ASan 힙 쓰기. RCE 페이로드 없음. |
이미 secure-delete를 사용한 조작된 FTS5 데이터베이스를 연 뒤 DELETE(또는 secure-delete를 flush하는 모든 쓰기)를 수행하면 fts5DoSecureDelete가 Fts5Data를 넘어 푸터 varint를 씁니다. 크래시 / ASan 크기 1 힙 쓰기. RCE는 입증되지 않음. CVE-2026-11824가 아님.
MATCH만으로는 이 싱크가 아닙니다. 트리거는 DELETE/flush입니다. 조작된 파일은 SQLITE_DBCONFIG_DEFENSIVE를 끌 필요가 없습니다.
다른 데이터베이스 및 HTTP 서버 핀 이후 SQLite 3.53.4에 대한 20회의 소스 헌트. CVE-2026-11822 / CVE-2026-11824는 이 트리에서 닫혀 있습니다 (fts5LeafRead szLeaf<4). YEONBA의 이후 트렁크 바운드는 그렇지 않습니다. 3.53.4 fts5corruptB.test 파일은 여전히 테스트 3.2에서 끝납니다; 트렁크 테스트 4.0은 hexdb에 DELETE FROM t WHERE rowid = 1을 더한 것입니다.
iPgIdx -= nShift;
nPg = iPgIdx;
fts5PutU16(&aPg[2], iPgIdx);
for(iIdx=0; iIdx<nIdx; /* no-op */){
u32 iVal = 0;
iIdx += fts5GetVarint32(&aIdx[iIdx], iVal);
iKeyIn += iVal;
if( iKeyIn!=iDelKeyOff ){
int iKeyOut = (iKeyIn - (iKeyIn>iOff ? nShift : 0));
nPg += sqlite3Fts5PutVarint(&aPg[nPg], iKeyOut - iPrevKeyOut);
iPrevKeyOut = iKeyOut;
}
}
ext/fts5/fts5_index.c:5514-5544. iKeyIn은 32비트 int입니다. 이후 트렁크는 원래 nPg를 유지하고, i64 iKeyIn을 사용하며, PutVarint 전에 iKeyIn>nPg를 거부합니다.
잘못된 접근: CVE-2026-11824를 이 버그로 취급; DELETE 대신 MATCH; szLeaf를 범위 내로 유지하고 오버플로하지 않은 라이브 CREATE/INSERT 플랜트; 페이로드 없이 Winter의 WAL-plus-FTS5 체인 RCE라고 부르기.
cd lab
./run.sh
공식 sqlite-src-3530400 zip의 ASan 아말감, -DSQLITE_ENABLE_FTS5. Hexdb lab/yeonba-fts5corruptB-4.hexdb (트렁크 fts5corruptB.test 4.0)가 필요합니다. 루프백 127.0.0.1:18860에 바인드. Compose 프로젝트 sqlite-fts5-securedel.
SUCCESS sqlite-fts5-securedel how=asan-heap-buffer-overflow-write-1-fts5DoSecureDelete db=yeonba-hexdb bytes=5120 SQLITE-FTS5-SECUREDEL-WITNESS
ASan 프레임: fts5PutVarint64 -> sqlite3Fts5PutVarint -> fts5DoSecureDelete / fts5FlushSecureDelete.
원래 nPg를 유지합니다. iKeyIn을 i64로 넓힙니다. sqlite3Fts5PutVarint 전에 iKeyIn>nPg를 거부합니다. 그것이 Fossil 9cd4f9e920 / branch-3.53 34171bee08입니다. 3.53에 체리픽합니다.
b09c88c14082339b66c7b7158d609a771e64ca69ext/fts5/fts5_index.c fts5DoSecureDelete, fts5FlushSecureDelete, fts5LeafReadext/fts5/fts5_varint.c sqlite3Fts5PutVarintd9de6eedbe91 / branch-3.53 34171bee08 (2026-08-11, YEONBA)szLeaf<4 부모이며, 이 잔재가 아닙니다