Mozilla NSS 處理憑證時存在程式碼執行漏洞

Mozilla 開發的 NSS(網路安全服務)加密庫集中發現了一個嚴重漏洞 (CVE-2021-43527),該漏洞可能導致在處理使用指定的 DSA 或 RSA-PSS 數位簽章時執行攻擊者程式碼。DER 編碼方法(傑出編碼規則)。 此問題代號為 BigSig,已在 NSS 3.73 和 NSS ESR 3.68.1 中解決。 發行版中的軟體包更新適用於 Debian、RHEL、Ubuntu、SUSE、Arch Linux、Gentoo、FreeBSD。 Fedora 尚無可用更新。

此問題出現在使用 NSS 處理 CMS、S/MIME、PKCS #7 和 PKCS #12 數位簽章的應用程式中,或在驗證 TLS、X.509、OCSP 和 CRL 實作中的憑證時。 該漏洞可能出現在支援 TLS、DTLS 和 S/MIME 的各種用戶端和伺服器應用程式、使用 NSS CERT_VerifyCertificate() 呼叫來驗證數位簽章的電子郵件用戶端和 PDF 檢視器中。

LibreOffice、Evolution 和 Evince 是易受攻擊的應用程式的範例。 此問題也可能影響 Pidgin、Apache OpenOffice、Suricata、Curl、Chrony、Red Hat Directory Server、Red Hat 憑證系統、Apache http 伺服器的 mod_nss、Oracle Communications Messaging Server、Oracle Directory Server Enterprise Edition 等專案。 不過,該漏洞並未出現在 Firefox、Thunderbird 和 Tor 瀏覽器中,它們使用單獨的 mozilla::pkix 庫(也包含在 NSS 中)進行驗證。 基於 Chromium 的瀏覽器(除非專門使用 NSS 建置)在 2015 年之前一直使用 NSS,但後來改用 BoringSSL,也不受該問題的影響。

此漏洞是由 secvfy.c 檔案中 vfy_CreateContext 函數中的憑證驗證程式碼錯誤所引起的。 當客戶端從伺服器讀取憑證和伺服器處理客戶端憑證時都會發生該錯誤。 當驗證 DER 編碼的數位簽章時,NSS 將簽章解碼到固定大小的緩衝區中,並將該緩衝區傳遞給 PKCS #11 模組。 在進一步處理過程中,對 DSA 和 RSA-PSS 簽章的大小進行了錯誤檢查,如果數位簽章的大小超過 16384 位元(為緩衝區分配了 2048 字節,沒有檢查簽章是否可以更大))。

包含該漏洞的程式碼可以追溯到2003年,但直到2012年進行重構才構成威脅。 2017年,在實現RSA-PSS支援時也犯了同樣的錯誤。 為了進行攻擊,不需要資源密集型產生某些金鑰來獲取必要的數據,因為溢位發生在檢查數位簽章的正確性之前的階段。 超出邊界的資料部分被寫入包含函數指標的記憶體區域,這簡化了工作漏洞的建立。

該漏洞是由Google 零號專案的研究人員在嘗試新的模糊測試方法時發現的,很好地演示了在經過廣泛測試的知名專案中,微不足道的漏洞如何能夠在很長一段時間內未被檢測到:

  • NSS 程式碼由經驗豐富的安全團隊使用最先進的測試和錯誤分析技術進行維護。 有多個計劃為識別 NSS 中的漏洞提供巨額獎勵。
  • NSS 是最早加入 Google oss-fuzz 計畫的項目之一,也在 Mozilla 基於 libFuzzer 的模糊測試系統中進行了測試。
  • 該程式庫程式碼已在各種靜態分析器中進行了多次檢查,包括自 2008 年以來一直由 Coverity 服務進行監控。
  • 直到 2015 年,NSS 一直在 Google Chrome 中使用,並由 Google 團隊獨立於 Mozilla 進行獨立驗證(自 2015 年起,Chrome 改用 BoringSSL,但仍支援基於 NSS 的連接埠)。

導致該問題長期未被發現的主要問題:

  • NSS 模組化庫和模糊測試不是作為一個整體進行的,而是在單一組件的層面上進行的。 例如,解碼DER和處理證書的程式碼是分開檢查的——在模糊測試期間,可能已經獲得了導致問題漏洞顯現的證書,但其檢查沒有到達驗證碼,問題也沒有出現。顯露出來。
  • 在模糊測試過程中,對輸出大小(10000 位元組)設定了嚴格的限制,而NSS 中沒有類似的限制(正常模式下的許多結構體的大小可能超過10000 字節,因此需要更多的輸入數據來識別問題) 。 對於完整驗證,限制應為 224-1 位元組 (16 MB),這對應於 TLS 允許的最大憑證大小。
  • 關於模糊測試程式碼覆蓋率的誤解。 易受攻擊的程式碼已被積極測試,但使用的模糊器無法產生必要的輸入資料。 例如,fuzzer tls_server_target 使用一組預先定義的現成證書,這將證書驗證程式碼檢查限制為僅 TLS 訊息和協定狀態變更。

來源: opennet.ru

添加評論