CVE-2021-44228 和 CVE-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.type
、resource.labels
或 logName
等索引欄位,將查詢範圍縮小到特定服務或記錄串流。
偵測到相符的記錄項目「並不」表示系統已成功遭到入侵。如果系統偵測到異常情況,建議您按照貴機構的事件回應程序處理。相符項目可能表示有人正在試圖利用專案或工作負載中的安全漏洞。或者,如果應用程式在 HTTP 要求欄位中使用 ${jndi:
等模式,也可能會出現誤判。查看記錄,確認這類模式並非正常應用程式行為。請調整查詢,讓查詢符合您的環境。
搜尋違規 IP 位址
如果您發現符合條件的結果,且想要匯總傳送這類要求的遠端 IP 位址,請將 remoteIp
欄位新增至 Logs Explorer 的「Log fields」窗格。如要新增 remoteIp
欄位,請按一下相符記錄項目中的欄位值,然後選取「Add field to Logs fields pane」(將欄位新增至「Logs fields」窗格),如以下螢幕截圖所示:
您現在可以在「記錄欄位」窗格中,查看傳送相符要求的頂尖遠端 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) 或適當的事件回應團隊。
如要瞭解如何建立記錄式快訊,請參閱「建立記錄式快訊 (記錄檔探索工具)」一文。建立警示時,請務必使用漏洞字串的查詢,而非範例中指定的查詢。
為記錄式指標建立警告政策
如要監控哪些端點或服務記錄可能的漏洞攻擊嘗試,請針對記錄指標建立警告政策:
建立記錄指標,以便計算記錄中可能的漏洞字串出現次數。例如,您可以使用 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)"'
如要進一步瞭解如何建立記錄指標,請參閱「設定計數器指標」。
建立快訊政策,以便在達到所選事件次數時通知您。如要瞭解如何設定快訊政策,請參閱「在計數器指標上建立快訊政策」。
後續步驟
我們會在本文件中提供最新消息,敬請密切留意。
如要進一步瞭解 Log4j 2 安全漏洞和您的Google Cloud 服務,請參閱以下文章: