範例:偵測 Log4Shell 安全性漏洞

Apache Log4j 程式庫 2.0 至 2.15 版已揭露安全漏洞 CVE-2021-44228CVE-2021-45046。Apache Log4j 公用程式是記錄要求時常用的元件。這個安全漏洞又稱 Log4Shell,可能導致運行 Apache Log4j 2.0 至 2.15 版本的系統遭入侵,致使攻擊者能執行任何程式碼。

這項安全漏洞不會影響 Cloud Logging 或其提供的代理程式 (用於從第三方應用程式收集記錄),但如果您使用 Log4j 2,服務可能會受到影響。

您可以使用 Logging 找出可能的攻擊。本文說明如何執行下列操作:

  • 使用記錄檔探索工具查詢記錄檔,找出利用 Log4j 2 安全漏洞的現有嘗試。
  • 確認您啟用的緩解技術 (例如 Google Cloud Armor 安全性政策和 Identity-Aware Proxy 存取權控管) 設定正確無誤,且運作正常,可封鎖這些 Log4j 2 漏洞利用嘗試。
  • 建立快訊政策,以便在記錄檔中寫入可能的攻擊訊息時收到通知。

請參閱 Google CloudReview Google Cloud 的「Log4j 2 安全性諮詢」,瞭解我們目前對產品和服務的評估結果。您可以參閱美國國家標準暨技術研究院 (NIST) 針對 CVE-2021-44228 發布的安全漏洞報告,評估自己受到的影響。

記錄偵測

記錄查詢結果只會包含已儲存在記錄 bucket 中,且符合使用者指定保留期限的記錄。雖然大多數 Google Cloud 服務預設會啟用記錄,但如果記錄已停用或排除,就不會納入查詢。建議您在環境中啟用記錄檔,以便更全面掌握環境狀況。

如果您使用 HTTP(S) 負載平衡器,則必須啟用記錄功能,要求記錄才會顯示在 Logging 中。同樣地,如果您在 VM 上執行 Apache 或 NGINX 等網路伺服器,但未安裝 Ops AgentLogging Agent,則這些記錄檔將無法在 Cloud Logging 中存取。

您可以使用記錄檔探索工具,偵測服務是否遭到利用 Log4j 2 安全漏洞的潛在攻擊。如果您使用 Logging 記錄對服務的要求,可以檢查httpRequest欄位中的使用者自製內容,找出潛在的攻擊行為。

httpRequest 欄位中的值可能含有字串權杖,例如 ${jndi:ldap://,但這項安全漏洞的利用方式有很多種。舉例來說,您可以使用逸出或 Unicode 避免偵測。 以下字串顯示一些常見範例,指出有人嘗試對您的系統進行攻擊,但這並非詳盡無遺的變體組合:

${jndi:
$%7Bjndi:
%24%7Bjndi:
${jNdI:ldAp
${jndi:${lower:l}${lower:d}${lower:a}${lower:p}:
${${lower:j}${lower:n}${lower:d}i:
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}:
${${env:BARFOO:-j}ndi${env:BARFOO:-:}${env:BARFOO:-l}dap${env:BARFOO:-:}

您可以在 Logs Explorer 中建立查詢,掃描部分可能的攻擊字串。舉例來說,下列查詢會嘗試比對 HTTP(S) 負載平衡器要求記錄中 httpRequest 欄位內字串 ${jndi: 的各種模糊變體。請注意,查詢中使用的規則運算式不會偵測到所有變化版本,而且可能會導致誤判:

resource.type="http_load_balancer"
httpRequest.requestUrl=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)" OR
httpRequest.userAgent=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)" OR
httpRequest.referer=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)"

您可以變更 resource.type 的值,使用先前的查詢掃描其他服務的要求記錄。

掃描大量記錄時,先前的查詢可能需要很長時間才能完成。如要加快查詢速度,您可以利用索引欄位 (例如 resource.typeresource.labelslogName) 將查詢範圍縮小至特定服務或記錄串流。

偵測到相符的記錄項目「不代表」已成功遭到入侵。如果偵測到任何異常,建議您按照貴機構的事件應變程序處理。如果發現相符項目,可能表示有人正在探查,想利用專案或工作負載中的安全漏洞。如果應用程式在 HTTP 要求欄位中使用 ${jndi: 等模式,則可能是誤判。回顧記錄,確保這種模式不是應用程式的正常行為。根據您的環境調整查詢。

搜尋違規 IP 位址

如果找到相符結果,且想彙整傳送這類要求的遠端 IP 位址,請將 remoteIp 欄位新增至 Logs Explorer 的「Log fields」(記錄檔欄位) 窗格。如要新增 remoteIp 欄位,請按一下相符記錄項目中的欄位值,然後選取「Add field to Logs fields pane」(在記錄檔欄位窗格中新增欄位),如下列螢幕截圖所示:

在「記錄檔欄位」窗格中新增「remoteIp」欄位,判斷傳送最多相符要求的 IP 位址。

您現在可以在「記錄檔欄位」窗格中,查看傳送相符要求的熱門遠端 IP 位址:

記錄檔探索工具會顯示要移除的頂端 IP 位址。

您可藉此瞭解這些 Log4j 2 安全漏洞攻擊掃描的來源。其中有些可能是您設定的應用程式安全漏洞掃描工具 (例如 Web Security Scanner) 執行的合法掃描。如果您是透過 Security Command Center 使用 Web Security Scanner,請記下 Web Security Scanner 使用的靜態 IP 位址範圍

搜尋目標應用程式並驗證緩解技術

您也可以針對目標應用程式進行匯總,並判斷惡意要求是否確實已傳送至應用程式。如果您已透過 Google Cloud Armor 的安全性政策啟用緩解技術,或透過 Identity-Aware Proxy (IAP) 啟用存取權控管,也可以從 HTTP(S) 負載平衡器記錄檔中記錄的資訊,確認這些技術或控管機制是否正常運作。

首先,如要將目標應用程式新增至「Log fields」(記錄檔欄位) 窗格,請選取其中一個記錄項目結果,展開 resource.labels,按一下 resource.labels.backend_service_name 欄位值,然後選取「Add field to Logs fields pane」(在記錄檔欄位窗格中新增欄位)

您現在可以查看 Log4j 2 漏洞掃描鎖定的頂端應用程式或後端服務。如要判斷這些攻擊嘗試是否已送達後端服務,請使用 HTTP(S) 負載平衡器填入的 jsonPayload.statusDetails 欄位,瞭解要求是否已轉送至後端,或是否已由 IAP 或 Google Cloud Armor 等服務成功封鎖。按一下記錄項目結果中的 jsonPayload.statusDetails 欄位值,然後選取「Add field to Logs fields pane」(在記錄檔欄位窗格中新增欄位)

您現在可以在「記錄欄位」窗格中,查看要求處理方式的詳細資料:

記錄檔探索工具會顯示最常成為目標的後端服務

在本例中,大部分的要求都遭到 IAP 封鎖。啟用後端服務時,IAP 會先驗證使用者身分和使用情境,再允許存取。這些遭 IAP 封鎖的要求會將 statusDetails 設為 handled_by_identity_aware_proxy。此外 (或替代做法),如果使用 Google Cloud Armor,並在後端服務上附加正確的安全政策,所有遭 Google Cloud Armor 封鎖的要求都會將 statusDetails 設為 denied_by_security_policy。如要瞭解如何將新的預先設定 cve-canary WAF 規則套用至 Google Cloud Armor 安全性政策,請參閱「Google Cloud Armor WAF rule to help mitigate Apache Log4j vulnerability」(Google Cloud Armor 網路應用程式防火牆規則,有助於減少 Apache Log4j 安全漏洞)。

如要篩選實際抵達後端服務的任何允許要求,請在「Log fields」(記錄欄位) 窗格中,選取 statusDetails 下方的 response_sent_by_backend。建議您為這些後端服務啟用 IAP,並套用預先設定 cve-canary WAF 規則的 Google Cloud Armor 安全性政策,協助封鎖這些攻擊嘗試。

建立記錄型快訊政策

設計好查詢,找出服務中受影響的記錄後,您可以使用該查詢建立記錄式快訊政策,在有新的記錄項目符合查詢條件時收到通知。由快訊政策建立的事件可轉送至貴機構的安全營運中心 (SOC) 或適當的事件應變團隊。

如要瞭解如何建立記錄型快訊政策,請參閱建立記錄型快訊政策 (記錄檔探索工具)。建立快訊政策時,請務必使用您自己的查詢,而非範例中指定的查詢。

為記錄指標建立警告政策

如要監控哪些端點或服務記錄了可能的攻擊嘗試,請針對記錄指標建立快訊政策:

  1. 建立記錄指標,計算記錄中可能出現的攻擊字串。舉例來說,您可以使用 Google Cloud CLI 建立這類指標:

    gcloud logging metrics create log4j_exploits \
    --description="Detect log4j exploits" \
    --log-filter='httpRequest.requestUrl=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)" OR httpRequest.userAgent=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)" OR httpRequest.referer=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)"'
    

    如要進一步瞭解如何建立記錄指標,請參閱「設定計數器指標」。

  2. 建立快訊政策,以便在達到選定次數時收到通知。如要瞭解如何設定快訊政策,請參閱「在計數器指標上建立快訊政策」。

後續步驟