개요
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2024-21762 |
| 벤더 | Fortinet |
| 제품 | FortiOS (SSL VPN 기능) |
| 공개일 | 2024-02-08 |
| CVSS v3.1 | 9.6 Critical |
| CWE | CWE-787 (Out-of-Bounds Write) |
| 인증 | 불필요 |
| 야생 악용 | 확인됨 (CISA KEV 등재) |
기본 원리: Out-of-Bounds Write
메모리 경계를 넘어서는 쓰기
Out-of-Bounds Write(OOB Write)는 할당된 메모리 영역 밖에 데이터를 쓰는 취약점이다. 스택 오버플로우가 스택 메모리를 넘어 쓰는 것처럼, 힙 OOB는 힙에 할당된 버퍼를 넘어 인접한 메모리에 쓴다.
정상적인 메모리 접근:
heap_buf = malloc(100); // 100바이트 할당
heap_buf[0] ~ heap_buf[99] = 유효한 접근
OOB Write:
heap_buf[100] = 'X'; // ← 경계 밖 쓰기!
→ heap_buf 다음에 있는 다른 청크의 메타데이터 또는 데이터 덮어씀
결과:
인접한 힙 청크의 헤더(prev_size, size, flags) 덮어쓰기
→ malloc/free 내부 연결 리스트 조작 가능
→ 다음 malloc() 또는 free() 시 임의 메모리 쓰기 가능 (힙 익스플로잇)
C 언어에서 흔한 OOB 패턴
/* 패턴 1: 경계 검사 부족 */
char *buf = malloc(size); // 클라이언트가 요청한 크기
int offset = get_offset_from_request(); // 클라이언트 제어 가능
buf[offset] = value; // offset이 size 이상이면 OOB!
/* 패턴 2: 정수 오버플로우 → 잘못된 크기 할당 */
uint16_t user_len = parse_length_field(packet); // 예: 65535
char *buf = malloc(user_len + 1); // 65535 + 1 = 0 (오버플로우!) → 1바이트만 할당
memcpy(buf, packet_data, user_len); // 65535바이트 복사 → OOB!
취약점 상세
영향 받는 버전
FortiOS 7.4.0 ~ 7.4.2 → 7.4.3+ 으로 업그레이드
FortiOS 7.2.0 ~ 7.2.6 → 7.2.7+ 으로 업그레이드
FortiOS 7.0.0 ~ 7.0.13 → 7.0.14+ 으로 업그레이드
FortiOS 6.4.0 ~ 6.4.14 → 6.4.15+ 으로 업그레이드
FortiOS 6.2.0 ~ 6.2.15 → 6.2.16+ 으로 업그레이드
FortiOS 6.0 (모든 버전) → EoL, 마이그레이션 필요
FortiProxy 7.4.0 ~ 7.4.2 → 7.4.3+
FortiProxy 7.2.0 ~ 7.2.8 → 7.2.9+
취약한 컴포넌트
취약점 위치: sslvpnd (SSL VPN 데몬)
취약한 엔드포인트: /remote/login, /remote/ 계열 경로
트리거: 특수 조작된 HTTP 요청 (인증 불필요)
공격 경로:
인터넷 → HTTPS 443 또는 10443
→ FortiOS SSL VPN 포털
→ sslvpnd가 요청 파라미터 파싱 중 OOB Write 발생
→ 힙 손상 → RCE
# 취약점 탐지 (버전 확인, 실제 익스플로잇 아님)
import requests
import urllib3
urllib3.disable_warnings()
def check_fortios_vulnerable(host):
"""FortiOS SSL VPN 존재 및 버전 확인"""
endpoints = [
'/remote/login',
'/remote/logincheck',
'/api/v2/cmdb/system/global'
]
for endpoint in endpoints:
try:
r = requests.get(
f"https://{host}{endpoint}",
verify=False,
timeout=10,
allow_redirects=False
)
server = r.headers.get('Server', '')
if 'FortiGate' in server or 'FortiOS' in server:
print(f"[+] FortiOS SSL VPN 감지: {host}")
print(f" Server: {server}")
return True
except:
pass
return False
check_fortios_vulnerable("target.company.com")
실제 악용 패턴 (Mandiant/CISA 분석)
공격 그룹: UNC5325 (중국 연계 추정)
공격 대상: 미국/유럽 정부, 국방, 기술, 제조업
공격 시점: 2024년 1월 (패치 전 제로데이)
공격 후 행동
# 1단계: CVE-2024-21762 RCE → sslvpnd 권한으로 쉘
# (FortiOS는 특수 리눅스 배포판, 루트에 가까운 권한)
# 2단계: VPN 자격증명 수집
cat /data/etc/shadow # 비밀번호 해시
cat /var/log/sslvpnd/sslvpnd.log # VPN 접속 로그 (IP, 사용자명)
cat /etc/config/user.cfg # VPN 사용자 설정
# 3단계: 관리자 백도어 계정 생성 (지속성)
config system admin
edit "maint_backup"
set password "Secur3P@ss!"
set accprofile "super_admin"
set trusthost1 0.0.0.0/0
end
# 4단계: BOLDMOVE/COATHANGER 백도어 설치
# FortiOS 전용 맞춤형 악성코드
# 정상 바이너리(/bin/smartctl)를 악성 버전으로 교체
# 또는 /lib/libav.so.1 같은 라이브러리 교체
# 5단계: 내부망 피벗
# SSL VPN이 내부망과 연결되어 있으므로
# VPN 인터페이스를 통해 내부 서버 접근
BOLDMOVE 악성코드 특성
FortiOS 전용 백도어:
- FortiOS의 파일 시스템 구조 이해 필요 (맞춤 제작)
- 정상 Fortinet 도구로 위장 (파일명: /bin/smartctl)
- C2 통신을 정상 SSL VPN 트래픽으로 위장
- ICT(Integrity Check Tool) 우회 로직 포함
- 재부팅 후에도 지속되는 지속성 메커니즘
탐지 방법
# FortiOS 관리 콘솔에서 직접 확인
# 1. 관리자 계정 전수 검토
get system admin
# 알 수 없는 계정이 있으면 백도어 의심
# 2. 최근 VPN 로그인 확인
execute log filter category 1
execute log display
# 비정상적인 시간대, 알 수 없는 IP에서 접속 확인
# 3. 알려진 IoC 파일 확인
diagnose sys top 10
# 비정상적인 프로세스 확인
# 방화벽 CLI
get system performance status
diagnose debug application sslvpnd 8 # sslvpnd 디버그 로그
# 외부에서 버전 확인 스크립트
import requests, re, urllib3
urllib3.disable_warnings()
def get_fortios_version(host: str) -> str | None:
"""FortiOS 버전 원격 식별 시도"""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
# 로그인 페이지에서 버전 정보 추출
try:
r = requests.get(
f"https://{host}/remote/login",
headers=headers,
verify=False,
timeout=10
)
# FortiOS 버전은 응답 헤더, HTML, 또는 JS 파일에 노출되기도 함
version_patterns = [
r'FortiOS[\s/]+([\d.]+)',
r'"version":\s*"([\d.]+)"',
r'var\s+fgt_ver\s*=\s*["\']?([\d.]+)'
]
for pattern in version_patterns:
match = re.search(pattern, r.text + str(r.headers))
if match:
return match.group(1)
except Exception as e:
pass
return None
완화 방법
# FortiOS 관리 인터페이스에서:
# 방법 1: SSL VPN 완전 비활성화 (대안 접근 수단 있을 때)
config vpn ssl settings
set status disable
end
# 방법 2: 신뢰된 IP만 SSL VPN 접근 허용
config vpn ssl settings
set source-address "trusted_ips" # 사전 정의한 주소 그룹
end
# 방법 3: SSL VPN 포털 관리 포트 변경 + 외부 노출 최소화
config vpn ssl settings
set port 4443 # 기본 443에서 변경
end
근본 해결책:
즉시 패치 적용:
FortiOS 7.4.3+
FortiOS 7.2.7+
FortiOS 7.0.14+
FortiOS 6.4.15+
FortiOS 6.2.16+
패치 후 필수 조치:
1. 관리자 계정 전수 감사 및 알 수 없는 계정 제거
2. VPN 사용자 비밀번호 전면 재설정
3. 세션 토큰/키 무효화 (장비 재시작)
4. 내부망 IoC 스캔 (BOLDMOVE 파일 해시로)
5. 침해 여부 불확실 시 공장 초기화 권고
IoC (침해지표)
파일 기반 IoC:
BOLDMOVE:
경로: /bin/smartctl (정상 크기: ~100KB, 백도어: ~800KB)
경로: /lib/libav.so.1
→ ls -la /bin/smartctl 으로 비정상 크기 확인
COATHANGER:
경로: /data/lib/libips.bak
→ FortiOS 정상 파일 목록과 비교
네트워크 IoC:
- SSL VPN에서 비정상 외부 연결 (특히 비표준 포트)
- 새벽 시간대 admin 로그인
- 알 수 없는 IP 대역에서 VPN 접속
행동 기반 IoC:
- get system admin에 모르는 계정 등장
- diagnose sys top에 알 수 없는 프로세스
- 로그인 없이 설정 변경 이벤트
타임라인
2024-01월 — 야생에서 제로데이 악용 시작 (패치 전)
2024-02-08 — Fortinet 공식 공개 및 패치 배포
2024-02-09 — CISA KEV 등재 (Known Exploited Vulnerabilities)
2024-02-16 — CISA 연방기관 패치 의무 기한
2024-02월 — Mandiant가 UNC5325 공격 보고서 발표
2024-03월 — PoC 코드 일부 보안 연구자에 의해 공개
VPN 장비 보안 원칙
VPN 장비는 인터넷 경계의 "열쇠"다:
- 모든 원격 접속이 통과하는 관문
- 내부망에 신뢰된 접근 보유
- 침해 시 내부망 전체 노출 위험
방어 원칙:
1. 펌웨어 업데이트 우선순위 1위 (Critical = 24~48시간 내 패치)
2. 관리 인터페이스를 별도 관리망으로 분리 (인터넷 직접 노출 금지)
3. MFA(다중 인증) 강제 적용
4. VPN 로그를 SIEM으로 전송해 실시간 이상 탐지
5. 연 2회 이상 VPN 장비 대상 침투 테스트
6. Assume Breach: VPN 장비 침해 시나리오 대응 훈련
CISA는 연방 기관에 2024-02-16까지 패치 적용을 의무화했다. 기업 환경에서도 즉각 적용이 필요하다.