Apache Log4j 程式庫 2.0 至 2.15 版已揭露安全漏洞 CVE-2021-44228 和 CVE-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 Agent 或 Logging 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.type
、resource.labels
或 logName
) 將查詢範圍縮小至特定服務或記錄串流。
偵測到相符的記錄項目「不代表」已成功遭到入侵。如果偵測到任何異常,建議您按照貴機構的事件應變程序處理。如果發現相符項目,可能表示有人正在探查,想利用專案或工作負載中的安全漏洞。如果應用程式在 HTTP 要求欄位中使用 ${jndi:
等模式,則可能是誤判。回顧記錄,確保這種模式不是應用程式的正常行為。根據您的環境調整查詢。
搜尋違規 IP 位址
如果找到相符結果,且想彙整傳送這類要求的遠端 IP 位址,請將 remoteIp
欄位新增至 Logs Explorer 的「Log fields」(記錄檔欄位) 窗格。如要新增 remoteIp
欄位,請按一下相符記錄項目中的欄位值,然後選取「Add field to Logs fields pane」(在記錄檔欄位窗格中新增欄位),如下列螢幕截圖所示:
您現在可以在「記錄檔欄位」窗格中,查看傳送相符要求的熱門遠端 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) 或適當的事件應變團隊。
如要瞭解如何建立記錄型快訊政策,請參閱建立記錄型快訊政策 (記錄檔探索工具)。建立快訊政策時,請務必使用您自己的查詢,而非範例中指定的查詢。
為記錄指標建立警告政策
如要監控哪些端點或服務記錄了可能的攻擊嘗試,請針對記錄指標建立快訊政策:
建立記錄指標,計算記錄中可能出現的攻擊字串。舉例來說,您可以使用 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 服務,請參閱下列文章: