지난번 정리한 FortiMail 취약점 글의 실무 후속편이에요. 받아 둔 파일만으로 버전, 침해 지표, 설정을 점검하는 오프라인 도구 fortimail-response를 만들어 공개했어요.

GitHub: kh20134/fortimail-cve-2026-104286-response (MIT 라이선스)

관련 글: FortiMail CVE-2026-104286 실무 대응 체크리스트, 취약점 점검 도구 vulnscan 소개

왜 만들었나

앞선 글에서 버전 확인, IoC 점검, IBE 비활성화를 체크리스트로 정리했어요. 그런데 장비가 여러 대면 사람 눈으로 버전표와 로그를 대조하다 놓치기 쉬워요.

그래서 Fortinet 권고(FG-IR-26-175)에 공개된 값만으로 판정을 자동화했어요. 장비에 접속하지 않고, 취약점을 시험하는 코드도 없어요.

도구가 하는 일

  • 버전 판정: 버전 문자열, get system status 저장본, CSV 인벤토리를 취약/이전 필요/수정됨/권고 범위에 없음으로 분류
  • 로그 검색: System Event, Encryption, GUI CSV 내보내기, WAF 접근 로그에서 권고 IoC 검색
  • 설정 확인: CLI 설정 백업에서 IBE 사용 여부와 HTTP/HTTPS 허용 인터페이스 확인
  • 보고서: 한국어 터미널 요약, JSON, HTML

버전표와 지표는 data/versions.yaml, iocs.yaml에 있어요. 권고가 바뀌면 이 파일만 고치면 돼요.

종료 코드 1은 취약, 7.2 이전 필요, 판정 불가 버전, 높음·중간 지표 일치가 있다는 뜻이에요. 0이 안전하다는 뜻은 아니에요.

사용법

Python 3.10 이상이 필요해요.

python3 -m pip install \
  -e ".[dev]"

버전 하나, 또는 저장해 둔 출력과 인벤토리를 판정해요.

fortimail-response \
  version 7.6.6
fortimail-response version \
  --status-file status.txt
fortimail-response version \
  --inventory inventory.csv

로그, 설정, 보고서를 한 번에 돌릴 수도 있어요.

fortimail-response check \
  --inventory inv.csv \
  --log system-event.log \
  --log encryption.log \
  --config fortimail.conf \
  --html report.html
  • --log는 여러 번 줄 수 있어요.
  • --json으로 JSON도 함께 저장해요.
  • --strict면 낮음 지표와 IBE 사용도 종료 코드 1로 처리해요.

결과 화면

fortimail-response 인벤토리 판정 터미널 화면

(합성(가상) 데이터 실행 결과, 출처: 본인 깃허브)

fortimail-response HTML 보고서의 버전 판정 표

(합성(가상) 데이터 실행 결과, 출처: 본인 깃허브)

예제 장비 이름과 로그는 모두 합성 데이터예요. 7.2.4 장비는 "이전 필요", 7.0.6은 "권고 범위에 없음"으로 나와요.

탐지 룰·플레이북

탐지 룰 예시

  • Sigma: 권고 IP 2개와 공개된 로그 문자열
  • Suricata: 권고 IP 2개
  • WAF: 권고 우회책인 POST /ibe 중 '../' 포함 요청 차단

공개된 지표와 제조사 우회책만 담았어요. 필드명과 SID는 운영 환경에 맞춰 조정해야 해요.

플레이북·체크리스트

트리아지, 임시 완화, 패치, 계정·키 교체, 포렌식 보존, 보고(KISA 118)까지 순서대로 정리했어요. 체크리스트는 장비당 한 장 인쇄해서 변경 기록에 붙이는 용도예요.

자료 간 차이

2026년 10월 10일 확인 과정에서 자료끼리 어긋난 부분은 이렇게 처리했어요.

  • NVD에는 Fortinet의 9.8이 Secondary로만 있고 NVD Primary 점수는 없어요.
  • NVD weaknesses는 CWE-22만 있어요. CWE-158은 권고와 CISA 설명에 있어요.
  • 7.2의 목표는 7.4.9 이상으로 좁혔어요. 7.4.0~7.4.8도 영향 버전이라서예요.
  • 7.0은 권고 표와 NVD 설명에 없어서 취약으로 표시하지 않아요.
  • 7.3은 권고 표에 없어서 "권고 범위에 없음"으로 둬요.
  • cron 지표는 권고에 공개된 O=/migadmin 조각만 찾고, 생략된 명령은 추측하지 않아요.
  • archive234는 권고의 예시 계정명이에요.

한계와 주의

  • 지표가 없어도 침해가 없었다는 뜻이 아니에요.
  • 일치 항목은 포렌식 확인이 필요해요.
  • 빌드 번호는 보지 않고 세 자리 버전만 비교해요.
  • 인터넷 노출은 설정만으로 판단하지 못해요. 방화벽과 같이 봐야 해요.
  • 내부 사용자 로그인 실패는 특이도가 낮아 --strict에서만 실패로 처리해요.
  • 제조사 권고와 조직의 사고 대응 절차가 우선이에요.

FAQ

장비에 접속하나요?

아니요. 사용자가 넘긴 파일만 읽어요. 원격 조회, 로그인, 스캔 기능은 없어요.

종료 코드 0이면 끝인가요?

아니요. 취약 버전과 높음·중간 지표가 없었다는 뜻일 뿐이에요. 수집 구간 밖이나 형식이 다른 로그의 흔적은 알 수 없어요.

권고가 갱신되면요?

YAML만 고치거나 --iocs-file, --versions-file로 바꿔 끼우면 돼요.

마무리

체크리스트를 손으로 대조하던 일을 파일 기반으로 반복 가능하게 만든 도구예요.

결과는 조사의 시작점으로 쓰시고, 개선 의견은 GitHub 이슈로 남겨 주세요.

GitHub: https://github.com/kh20134/fortimail-cve-2026-104286-response