# CVE-2026-45185 (Dead.Letter) Exim MTA 셸 기반 취약점 스캐너 GnuTLS 빌드에서 use-after-free를 탐지하는 Exim MTA용 셸 기반 취약점 스캐너입니다. 버전, TLS 라이브러리, CHUNKING 구성을 확인하며, CI/CD 통합을 위한 JSON 출력을 생성합니다.
Linux 시스템이 CVE-2026-45185에 취약한지 탐지하는 셸 스크립트입니다. 이 취약점은 Exim 메일 전송 에이전트의 use-after-free 버그로, 원격 코드 실행으로 이어질 수 있습니다.
CI/CD 파이프라인, 구성 관리 도구 및 임시 시스템 감사에 사용하도록 설계되었습니다. 사람이 읽을 수 있는 출력과 기계가 읽을 수 있는 (JSON) 출력을 모두 생성합니다.
CVE-2026-45185 (별칭: Dead.Letter)는 GnuTLS가 TLS를 처리할 때 Exim의 BDAT(바이너리 데이터) 메시지 본문 파싱에서 발생하는 use-after-free 버그입니다.
TLS 종료 중 Exim은 TLS 전송 버퍼를 해제합니다. 그러나 중첩된 BDAT 수신 래퍼가 여전히 들어오는 바이트를 처리하고 ungetc()를 호출하여 해제된 영역에 단일 \n 바이트를 쓸 수 있습니다. 이 1바이트 쓰기는 힙 할당자 메타데이터를 손상시키며, 공격자는 이를 통해 추가 메모리 프리미티브를 얻고 원격 코드 실행을 달성할 수 있습니다.
| 속성 | 세부 정보 |
|---|
| CVE | CVE-2026-45185 |
| 별칭 | Dead.Letter |
| 유형 | Use-After-Free (CWE-416) |
| 구성 요소 | Exim BDAT/CHUNKING 핸들러 (GnuTLS 빌드 전용) |
| 공격 벡터 | 네트워크 — 인증 불필요, TLS 연결 및 CHUNKING 확장만 필요 |
| 영향받는 버전 | Exim 4.97 – 4.99.2, GnuTLS 빌드 전용 |
| 수정된 버전 | Exim 4.99.3 |
| 발견자 | Federico Kirschbaum, XBOW Security Lab (2026년 5월 1일 보고) |
OpenSSL 빌드는 영향을 받지 않습니다. 이 취약점은
USE_GNUTLS=yes로 컴파일된 Exim에만 해당됩니다. Exim이 OpenSSL과 연결된 경우, 버전에 관계없이 취약하지 않습니다.
스크립트는 의사 결정 트리를 통해 작동하며, 안전한 조건이 확인되는 즉시 중단하고 시스템을 취약하지 않음으로 표시합니다.
확인 1 — Exim 존재 여부
$PATH 및 일반 설치 위치 (/usr/sbin/exim, /usr/sbin/exim4, /usr/local/sbin/exim)를 검색합니다. Exim이 없으면 시스템이 취약하지 않으며 스크립트가 즉시 종료됩니다.
확인 2 — Exim 버전
exim -bV 출력을 파싱하고 영향을 받는 범위 (4.97 – 4.99.2)와 비교합니다. ≥ 4.99.3 버전은 패치된 것으로 처리됩니다. 알려진 범위를 벗어난 버전은 취약하지 않은 것으로 표시됩니다 (인식되지 않은 경우 메모 포함).
확인 3 — TLS 라이브러리 (중요 게이트) 세 가지 탐지 방법을 순차적으로 사용합니다:
exim -bV 빌드 정보 (가장 신뢰할 수 있음 — Exim이 자체 컴파일 타임 기능을 보고합니다, 예: Support for: GnuTLS)ldd 공유 라이브러리 연결strings 바이너리 스캔 (대체)OpenSSL이 감지되면 → 판정이 취약하지 않음으로 전환됩니다 (버전 무관). GnuTLS가 감지되면 → 공격 표면이 존재함이 확인됩니다. 둘 다 확인할 수 없으면 → 결과는 불확실입니다.
확인 4 — CHUNKING/BDAT 구성 (해결 방법 확인)
이 시점에서 시스템이 여전히 취약한 것으로 표시된 경우에만 실행됩니다. Exim 구성에서 chunking_advertise_hosts가 명시적으로 빈 값으로 설정되었는지 확인합니다. 이렇게 하면 BDAT 광고가 비활성화되어 공격 벡터가 차단됩니다. 단일 파일 구성과 Debian의 분할 구성 레이아웃 (/etc/exim4/conf.d/ 조각)을 모두 처리합니다.
참고:
chunking_advertise_hosts가 구성에 없는 경우 (기본값), Exim은 모든 호스트에게 CHUNKING을 광고합니다 (*). 비활성화하려면 옵션을 명시적으로 빈 값으로 설정해야 합니다.
확인 5 — 정보 제공 시스템 완화 조치 판정을 변경하지는 않지만, 익스플로잇 가능성에 영향을 미치는 요소를 보고합니다:
/proc/sys/kernel/randomize_va_space) — 2여야 함checksec 출력 (PIE, RELRO, 스택 카나리) — checksec이 설치된 경우MemoryDenyWriteExecute, NoNewPrivileges, SystemCallFilter/proc 파일 시스템 사용 가능 (ASLR 확인용)grep, awk, ldd, headchecksec (선택 사항 — 바이너리 강화 분석용)systemctl (선택 사항 — systemd 유닛 검사용)Debian-exim 그룹 사용자)핵심 취약점 확인을 위해 외부 종속성은 필요하지 않습니다.
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh
| 플래그 | 설명 |
|---|---|
--json | 결과를 JSON 객체로 출력 (아래 참조) |
--quiet | 모든 출력을 억제; 종료 코드만 설정 |
--no-color | ANSI 색상 코드 비활성화 (로그 파일에 유용) |
--help / -h | 사용법 정보 출력 |
| 코드 | 의미 |
|---|---|
0 | 취약하지 않음 (또는 명확한 안전 조건 발견) |
1 | 취약함 |
2 | 불확실 — 하나 이상의 필수 정보를 확인할 수 없음; 잠재적으로 취약한 것으로 처리 |
3 | 스크립트 오류 또는 지원되지 않는 환경 |
CVE-2026-45185 (Dead.Letter) — Exim 취약점 평가
============================================================
[CHECK] Exim 설치 확인 중...
[WARN] Exim 바이너리 발견: /usr/sbin/exim4
[CHECK] Exim 버전 확인 중...
감지된 버전: 4.99.1
[FAIL] Exim 4.99.1이 취약 범위 (4.97 – 4.99.2)에 포함됩니다.
[CHECK] TLS 라이브러리 연결 확인 중 (GnuTLS vs OpenSSL)...
[FAIL] Exim이 GnuTLS에 연결되어 있습니다 — 이 빌드는 영향을 받습니다.
[CHECK] CHUNKING (BDAT) 광고 구성 확인 중...
구성 파일: /etc/exim4/exim4.conf
[WARN] chunking_advertise_hosts가 비활성화되지 않았습니다 — BDAT가 활성화됨 (기본값은 모든 호스트에 광고).
팁: 메인 구성에 'chunking_advertise_hosts =' (빈 값)를 추가하여 해결 방법으로 BDAT를 비활성화하세요.
[CHECK] 시스템 수준 익스플로잇 완화 조치 확인 중 (정보 제공)...
[PASS] ASLR: 전체 무작위화 (randomize_va_space=2)
glibc 버전: 2.35 (2.32+는 더 강력한 힙 메타데이터 검사)
[WARN] systemd: MemoryDenyWriteExecute가 설정되지 않음 — 유닛에 추가 권장
[WARN] systemd: NoNewPrivileges가 설정되지 않음
------------------------------------------------------------
판정
------------------------------------------------------------
취약함 — CVE-2026-45185
이유: Exim 버전 4.99.1이 취약 범위 4.97–4.99.2에 포함됨
권장 조치:
1. Exim을 4.99.3 이상으로 업그레이드 (기본 수정)
2. 해결 방법으로 exim 구성에 'chunking_advertise_hosts =' (빈 값) 설정
3. systemd 유닛에 MemoryDenyWriteExecute=yes 및 NoNewPrivileges=yes 추가
4. ASLR을 2로 설정 확인: echo 2 > /proc/sys/kernel/randomize_va_space
------------------------------------------------------------
--json){
"cve": "CVE-2026-45185",
"alias": "Dead.Letter",
"host": "mailserver-01",
"timestamp": "2026-05-12T17:00:00Z",
"verdict": "vulnerable",
"reason": "Exim version 4.99.1 is in vulnerable range 4.97–4.99.2",
"exit_code": 1,
"findings": {
"exim_binary": "/usr/sbin/exim4",
"exim_version": "4.99.1",
"exim_version_vulnerable": "true",
"tls_library": "gnutls",
"tls_library_detected": "gnutls",
"exim_config": "/etc/exim4/exim4.conf",
"chunking_advertised": "true",
"aslr_level": "2",
"glibc_version": "2.35"
},
"mitigations": [
"aslr=full"
]
}
- name: CVE-2026-45185 확인
run: |
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh --json | tee vuln-report.json
exit $(jq '.exit_code' vuln-report.json)
- name: 취약점 보고서 업로드
if: always()
uses: actions/upload-artifact@v4
with:
name: cve-2026-45185-report
path: vuln-report.json
check-exim-vuln:
stage: security
script:
- chmod +x check_cve_2026_45185.sh
- ./check_cve_2026_45185.sh --json > vuln-report.json
artifacts:
when: always
paths:
- vuln-report.json
allow_failure: false
- name: CVE-2026-45185 확인 실행
script: check_cve_2026_45185.sh --json
register: vuln_check
failed_when: vuln_check.rc == 1
changed_when: false
- name: 취약점 보고서 표시
debug:
msg: "{{ vuln_check.stdout | from_json }}"
# 판정만 가져오기
./check_cve_2026_45185.sh --json | jq -r '.verdict'
# 특정 완화 조치가 발견되었는지 확인
./check_cve_2026_45185.sh --json | jq '.mitigations | contains(["aslr=full"])'
# 여러 호스트에서 실행하고 결과 수집
for host in mail1 mail2 mail3; do
ssh "$host" 'bash -s' < check_cve_2026_45185.sh --json
done | jq -s '.'
# Debian / Ubuntu
apt-get update && apt-get install --only-upgrade exim4
# RHEL / CentOS / Fedora
dnf upgrade exim
# 소스에서
# https://ftp.exim.org/pub/exim/exim4/ 에서 4.99.3 다운로드
# 기존 Local/Makefile 설정으로 재빌드
업그레이드 후 확인:
exim -bV | head -1
# 예상: Exim version 4.99.3 ...
즉시 업그레이드할 수 없는 경우, Exim 구성의 메인 구성 섹션에 다음 줄을 추가하면 BDAT 광고가 완전히 비활성화되어 공격 벡터가 차단됩니다:
chunking_advertise_hosts =
빈 값은 "호스트 없음"을 의미합니다. Exim은 더 이상 EHLO 응답에서 CHUNKING 확장을 광고하지 않습니다. 변경 후 Exim을 다시 시작하십시오:
# Debian / Ubuntu
systemctl restart exim4
# 기타 systemd 시스템
systemctl restart exim
CHUNKING이 더 이상 광고되지 않는지 확인:
# 연결하고 EHLO 응답 확인 — CHUNKING이 나타나지 않아야 함
echo QUIT | openssl s_client -connect localhost:25 -starttls smtp 2>/dev/null \
| grep -i chunking
# 출력 없음 = CHUNKING 비활성화됨
이것은 해결 방법일 뿐, 수정 사항이 아닙니다. 일부 발신 메일 서버는 대용량 메시지 전달에 BDAT를 사용합니다. 이를 비활성화하면 해당 발신자와의 호환성 문제가 발생할 수 있습니다. 가능한 한 빨리 4.99.3으로 업그레이드하십시오.
패치된 시스템에서도 Exim systemd 유닛에 다음 지시문을 추가하면 향후 메모리 손상 취약점의 영향을 줄일 수 있습니다:
# /etc/systemd/system/exim4.service.d/hardening.conf
[Service]
NoNewPrivileges=yes
MemoryDenyWriteExecute=yes
ProtectSystem=strict
PrivateTmp=yes
RestrictAddressFamilies=AF_INET AF_INET6
SystemCallFilter=@system-service
systemctl daemon-reload && systemctl restart exim4
ldd 및 strings로 대체되며, 이는 덜 신뢰할 수 있습니다.