範例:偵測 Log4Shell 安全性漏洞

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

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

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

  • 使用記錄檔探索工具查詢記錄檔,找出目前企圖利用 Log4j 2 安全漏洞的嘗試。
  • 請確認您已啟用 Google Cloud Armor 安全性政策和 Identity-Aware Proxy 存取權控管等緩解技術,並正確設定及運作,以便封鎖這些 Log4j 2 漏洞攻擊。
  • 建立快訊政策,在系統將可能的漏洞訊息寫入記錄檔時通知您。

請參閱 Google Cloud的 Log4j 2 安全性警示,瞭解我們目前的 Google Cloud 產品和服務評估。您可以參閱美國國家標準暨技術研究院 (National Institute of Standards and Technology,簡稱 NIST) 針對 CVE-2021-44228 所發布的安全漏洞報告,評估自身的風險。

Cloud Logging 偵測

Cloud Logging 查詢結果只會包含已儲存在記錄檔值區中,且符合使用者指定保留期限限制的記錄。雖然大多數 Google Cloud 服務預設為啟用記錄,但已停用或排除的記錄不會納入查詢。建議您在整個環境中啟用記錄檔,以便擴大對環境的瞭解程度。

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

您可以使用記錄檔探索工具,協助偵測服務遭到利用 Log4j 2 安全漏洞的潛在攻擊。如果您使用 Cloud Logging 記錄服務的要求,可以檢查含有使用者產生內容的 httpRequest 欄位,找出潛在的漏洞。

httpRequest 欄位中的值可能包含 ${jndi:ldap:// 等字串符記,但這類漏洞的攻擊方式有很多種。舉例來說,有許多方法可以使用轉義或萬國碼來避免偵測。以下字串顯示一些常見的例子,指出系統遭到利用的嘗試,但這並非詳盡無遺的變化版本集合:

${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」(將欄位新增至「Logs fields」窗格),如以下螢幕截圖所示:

將「remoteIp」欄位新增至「記錄欄位」窗格,判斷哪些 IP 位址傳送最相符的要求。

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

Logs Explorer 會顯示移除的 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 網路應用程式防火牆規則套用至 Google Cloud Armor 安全性政策,請參閱「Google Cloud Armor 網路應用程式防火牆規則有助於降低 Apache Log4j 安全漏洞的風險」。

如要篩選實際到達後端服務的任何允許要求,請在「記錄欄位」窗格中,選取「statusDetails」下方的「response_sent_by_backend」。建議您為這些後端服務啟用 IAP,並/或套用 Google Cloud Armor 安全性政策,其中包含預先設定的 cve-canary WAF 規則,以便封鎖這些漏洞利用嘗試。

建立記錄式警告

設計出可在服務中找出受影響記錄的查詢之後,您可以使用該查詢建立記錄式快訊,在新的記錄項目符合查詢時通知您。這則警示可轉送至貴機構的安全營運中心 (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. 建立快訊政策,以便在達到所選事件次數時通知您。如要瞭解如何設定快訊政策,請參閱「在計數器指標上建立快訊政策」。

後續步驟