
SQLite 3.53.4 - 높음 - 로컬 - 힙 OOB 쓰기 - 세션 changeset 동일 이름 nCol 증가
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-session-ncol
분류: 힙 OOB 쓰기 도달 범위: 로컬
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc)에 -DSQLITE_ENABLE_SESSION 적용. 테이블 이름 t를 nCol=2로 재사용한 뒤 nCol=64로 재사용하는 두 블록 changeset이 sessionTableInfo 리셋(sqlite3session.c:5619)을 건너뛰고 첫 블록의 aUpdateMask를 넘어 memset을 수행한다. sessionUpdateFind에서 크기 12의 ASan WRITE. 대조군은 단일 2열 UPDATE apply-rc=0.
SESSION이 켜져 있지 않으면 기본 amalgamation이 아니다. CVE-2026-50812 NPD는 3.53.2+에서 종료되었다. 무기화된 RCE 페이로드가 아니다. 오라클은 ASan WRITE이다.
| ID | 아직 CVE 없음 |
| 분류 | 힙 OOB 쓰기 (크기 12의 ASan WRITE, RCE는 입증되지 않음) |
| 도달 범위 | 로컬 (sqlite3changeset_apply*를 통한 신뢰할 수 없는 changeset) |
| CWE | CWE-787 |
| CVSS | 높음: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 제품 | SQLite Session extra (Hwaci) |
| 영향받는 버전 | 3.53.4 (b09c88c)를 -DSQLITE_ENABLE_SESSION으로 컴파일 |
| 인증 | 호스트가 신뢰할 수 없는 changeset을 적용 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18900 전용. 크기 12의 ASan WRITE 증거. |
두 번째 테이블 블록이 더 큰 nCol로 테이블 이름을 재사용하는 신뢰할 수 없는 changeset을 적용한다. 힙 OOB 쓰기. extra 컴파일. SESSION이 켜져 있지 않으면 기본 amalgamation이 아니다.
첫 블록은 pIter->nCol로 aUpdateMask를 할당한다. 이후 같은 이름의 블록은 sessionTableInfo 리셋을 건너뛰고 이전 할당 위에 더 큰 마스크를 memset한다. 랩: nCol=2 이후 nCol=64 UPDATE. sessionUpdateFind에서 크기 12의 ASan WRITE. 대조군은 단일 2열 UPDATE apply-rc=0.
이 팩을 write-what-where 가젯으로 취급하지 말 것. 크기 12의 ASan WRITE가 오라클이다.
3.53.2 FTS5 / session-NPD 파동 이후 SQLite 3.53.4를 대상으로 한 스무 번의 소스 사냥. CVE-2026-50812는 종료되었다(sessionBindRow가 누락된 값을 SQLITE_CORRUPT로 처리). Session은 여전히 SessionApplyCtx를 테이블 이름만으로 키잉한다. 같은 이름과 더 큰 선언 열 수를 가진 두 번째 블록이 aUpdateMask를 재사용한다.
이미 기록된 오답: 기본 amalgamation을 범위 내로 취급(SESSION이 꺼져 있음), CVE-2026-50812 재신고, 2열 스키마에 대해 nCol=64의 단일 테이블 블록 전송(schemaMismatch, 쓰기 없음), 12바이트 memset으로 RCE 주장.
cd lab
./run.sh
공식 sqlite-src-3530400 zip의 ASan amalgamation. 추가 컴파일 -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK. 127.0.0.1:18900에서 헬스 체크. 루프백에 바인딩할 것.
SUCCESS sqlite-session-ncol how=asan-heap-write-sessionUpdateFind write-size=12 control-apply-rc=0 SQLITE-SESSION-NCOL-WITNESS
이후 changeset 테이블 블록이 이름을 재사용할 때, 새 이름이 이미 하는 방식대로 SessionApplyCtx를 재구축한다: aUpdateMask를 해제하고, sessionTableInfo를 다시 실행하고, 라이브 스키마보다 큰 nCol을 거부한다. 트렁크 3f57024aec / branch-3.53 a1dd7123d8 (2026-08-17)은 이 GA 이후이다.
b09c88c14082339b66c7b7158d609a771e64ca69)sessionChangesetApply :5619, sessionUpdateFind :4381-4412