취약점 분석/CVE

CVE-2025-20393: Cisco AsyncOS 원격코드실행 취약점 분석 및 Splunk SPL 탐지 쿼리

y0.0ns 2026. 7. 6. 00:57

1. 취약점 설명

Cisco 이메일 보안 장비에 있는 스팸 격리함(Spam Quarantine) 웹 페이지에 로그인 없이 악성 HTTP 요청만 보내도 장비를 완전히 장악할 수 있는 취약점. 중국계 해킹 그룹(UAT-9686)이 2025년 11월부터 실제 공격에 활용했고, CISA(미국 사이버보안국)가 "현재 공격에 악용 중인 취약점" 목록에 공식 등재함.


2. 취약점 개요

항목 내용
CVE 번호 CVE-2025-20393
CVSS 10.0 (Critical)
발표일 2025년 12월 17일
CWE CWE-20 (Improper Input Validation)
영향 제품 Cisco Secure Email Gateway (SEG), Cisco Secure Email and Web Manager (SEWM)
취약 조건 Spam Quarantine 기능이 활성화 + 인터넷에 노출된 경우

Spam Quarantine이란? 이메일 보안 장비가 스팸으로 판단한 메일을 바로 삭제하지 않고 임시로 격리해두는 공간. 사용자나 관리자가 웹 인터페이스에 접속해 "이건 스팸 아니다"고 직접 꺼내거나 삭제할 수 있다. 이 웹 인터페이스가 이번 취약점의 공격 포인트.

해당 기능은 기본값으로 비활성화 상태이며, 활성화 후 외부에 노출된 환경에서만 공격이 가능하다.


3. 익스플로잇 방식

공격자는 Spam Quarantine 인터페이스로 조작된 HTTP 요청을 전송하는 방식으로 취약점을 트리거한다. 입력값 검증이 미흡하여 요청이 OS 명령어로 처리되고, root 권한으로 실행된다.

공격 흐름:

 
1. Spam Quarantine 포트로 조작된 HTTP 요청 전송
2. 입력값 검증 미흡으로 OS 명령어 인젝션 발생
3. root 권한으로 임의 명령 실행
4. AquaShell(Python 기반 백도어) 설치로 지속 접근 확보
5. AquaTunnel/Chisel로 내부망 피버팅, AquaPurge로 로그 삭제

공격자는 아래 도구들을 조합하여 장기 잠복 및 내부망 이동을 수행했다.


도구 역할
AquaShell Python 기반 백도어, 지속 접근 유지
AquaTunnel / Chisel 터널링 도구, 내부망 피버팅
AquaPurge 로그 삭제 도구, 포렌식 방해

4. 어디서 흔적이 남는가 (로그 소스 매핑)

로그 소스 탐지 가능한 흔적
Cisco SEG 웹 인터페이스 로그 Spam Quarantine 엔드포인트로의 비정상 HTTP 요청
방화벽 / Proxy 로그 장비에서 외부 IP로의 비정상 아웃바운드 연결
SIEM (Splunk) 인증 없는 세션 + 이후 outbound 트래픽 패턴
네트워크 트래픽 Chisel/ReverseSSH 기반 터널링 트래픽 (비표준 포트)

⚠️ 이 취약점 탐지의 핵심 어려움 공격 대상이 EDR 에이전트를 설치할 수 없는 블랙박스 장비(이메일 게이트웨이)라는 점. 장비 내부를 직접 들여다볼 수 없으므로, 네트워크 레벨 로그를 SIEM으로 수집하는 것이 탐지의 전제조건이다.


5. SPL 탐지 쿼리

기본형: Spam Quarantine 엔드포인트로의 비정상 요청 탐지

 
spl
index=proxy_logs OR index=waf_logs
| search uri_path="*/spam-quarantine*" OR uri_path="*/SpamQuarantine*"
| where status!=200 OR method="POST"
| eval suspicious=if(match(user_agent, "(python|curl|wget|libwww|Go-http)"), 1, 0)
| table _time, src_ip, dest_ip, uri_path, method, status, user_agent, suspicious
| sort -suspicious, -_time

쿼리 설명:

  • uri_path 필터로 Spam Quarantine 경로로의 요청만 추출
  • method="POST" 또는 비정상 응답코드를 의심 조건으로 설정
  • 자동화 도구 User-Agent(python, curl 등)를 suspicious 플래그로 표시
  • 정상 사용자는 브라우저로 접근하므로 자동화 툴 UA는 의심 신호로 볼 수 있다

개선형: 인증 없는 접근 + 이후 아웃바운드 연결 연계 탐지

 
spl
index=proxy_logs OR index=waf_logs
| search uri_path="*/spam-quarantine*"
| where status=200 AND (auth_user="" OR isnull(auth_user))
| stats count as attempt_count by src_ip, _time span=10m
| where attempt_count >= 1
| join type=left src_ip
    [search index=firewall_logs
     | where direction="outbound" AND dest_port IN (4444, 8080, 9001, 1080)
     | stats count as outbound_count by src_ip]
| where isnotnull(outbound_count)
| table src_ip, attempt_count, outbound_count

쿼리 설명:

  • Spam Quarantine에 인증 없이 200 응답을 받은 IP를 추출
  • 해당 IP가 이후 비표준 포트로 아웃바운드 연결을 시도하면 침해 가능성이 높다고 판단
  • join으로 Proxy 로그와 방화벽 로그를 엮어 공격 전·후 흐름을 한 번에 포착
dest_port IN (4444, 8080, 9001, 1080) : AquaTunnel, Chisel 같은 백도어 터널링 도구가 주로 사용하는 비표준 포트

⚠️ 주의: 위 쿼리의 필드명(uri_path, auth_user 등)은 환경마다 다를 수 있다. 실제 적용 전 자사 sourcetype에 맞게 필드명을 반드시 확인할 것.


6. 오탐지 줄이는 팁

  • 내부 보안팀 스캐닝: 취약점 스캐너가 Spam Quarantine 엔드포인트를 탐색하는 경우 오탐 발생 가능 → 스캐너 IP를 화이트리스트로 제외
  • 아웃바운드 포트 기준: 비표준 포트 목록은 자사 방화벽 정책 기준으로 "허가되지 않은 포트"를 직접 정의하는 것이 더 정확
  • User-Agent 필터: 내부 모니터링 도구가 python/curl 기반이라면 해당 소스 IP를 제외

7. 임시 대응 / 패치 정보

패치 버전: Cisco AsyncOS 업데이트 적용 (Cisco 공식 어드바이저리 참고)

즉시 적용 가능한 완화 조치:

  1. Spam Quarantine 기능이 불필요하다면 즉시 비활성화
  2. 필요한 경우 방화벽/ACL로 신뢰된 IP에서만 접근 가능하도록 제한
  3. 인터넷에 직접 노출되지 않도록 네트워크 세그멘테이션 적용

⚠️ 이미 침해가 의심되는 경우: 패치만으로는 부족. AquaShell 같은 백도어는 패치 후에도 잔존할 수 있으므로, 어플라이언스를 알려진 정상 이미지로 완전 재구축하는 것이 유일한 완전한 복구 방법.


8. 마무리 / 한계점

이 SPL 쿼리의 한계:

  • Spam Quarantine 관련 로그가 Splunk로 수집되지 않는 환경에서는 탐지 불가
  • 공격자가 정상 브라우저 User-Agent를 흉내낼 경우 기본형 쿼리 우회 가능
  • AquaPurge로 장비 내 로그가 삭제되면 사후 분석이 어려움

결국 이 취약점의 탐지 핵심은 "장비 안"이 아닌 "장비 주변 네트워크 로그를 얼마나 잘 수집하고 있느냐" 에 달려 있다. 방화벽, Proxy, 네트워크 트래픽 로그를 SIEM으로 중앙 수집하는 체계가 갖춰져 있어야 이런 블랙박스 장비 공격에 대응할 수 있다.

더 나은 탐지 방법이나 실제 운영 환경에서의 개선점이 있다면 댓글로 공유해주세요.


참고 자료: