Asp.net

這個新的 ASP.NET 安全漏洞有多嚴重,我該如何解決?

  • September 15, 2010

我剛剛在網上閱讀了有關 ASP.NET 中新發現的安全漏洞的資訊。您可以在此處閱讀詳細資訊。

問題在於 ASP.NET 實現 AES 加密算法以保護這些應用程序在使用者會話期間儲存資訊而生成的 cookie 的完整性的方式。

這有點模糊,但這裡有一個更可怕的部分:

攻擊的第一階段需要幾千個請求,但一旦成功並且攻擊者獲得了密鑰,它就完全是隱秘的。所需的密碼知識非常基礎。

總而言之,我對安全/密碼學主題不夠熟悉,不知道這是否真的那麼嚴重。

那麼,所有 ASP.NET 開發人員是否應該害怕這種可以在幾秒鐘內擁有任何 ASP.NET 網站的技術呢?

這個問題對普通的 ASP.NET 開發人員有何影響?它對我們有影響嗎?在現實生活中,這個漏洞的後果是什麼?最後:是否有一些解決方法可以防止此漏洞?

感謝您的回答!


編輯:讓我總結一下我得到的回复

所以,這基本上是一種“填充預言”類型的攻擊。@Sri很好地解釋了這種攻擊的含義。這是一個關於這個問題的令人震驚的影片!

關於這個漏洞的嚴重性:是的,確實很嚴重。*它讓攻擊者能夠了解應用程序的機器密鑰。*因此,他可以做一些非常不受歡迎的事情。

  • 在擁有應用程序的機器密鑰後,攻擊者可以解密身份驗證 cookie。
  • 更糟糕的是,他可以使用任何使用者的名稱**生成身份驗證 cookie 。**因此,他可以在網站上以任何人的身份出現。該應用程序無法區分您還是為自己生成了帶有您的姓名的身份驗證 cookie 的黑客。
  • 它還允許他解密(並生成)會話 cookie,儘管這不像前一個那樣危險。
  • 沒那麼嚴重:他可以解密頁面的加密 ViewState。(如果您使用 ViewState 來儲存機密數據,則無論如何都不應該這樣做!)
  • 非常出乎意料:通過機器密鑰的知識,攻擊者可以從您的 Web 應用程序中下載任意文件,甚至是那些通常無法下載的文件!(包括Web.Config等)

這是我得到的一堆好的做法,它們並不能解決問題,但有助於提高 Web 應用程序的一般安全性。

現在,讓我們專注於這個問題。

解決方案

  • 啟用 customErrors 並創建一個將所有錯誤重定向到的錯誤頁面。是的,甚至是 404s。(ScottGu 說區分 404s 和 500s 對於這種攻擊是必不可少的。)另外,在你的Application_Error或者Error.aspx放入一些隨機延遲的程式碼。(生成一個隨機數,並使用 Thread.Sleep 休眠那麼久。)這將使攻擊者無法確定您的伺服器上究竟發生了什麼。
  • 有些人建議切換回 3DES。理論上,如果不使用 AES,就不會遇到 AES 實現中的安全漏洞。事實證明,這根本不推薦

其他一些想法

感謝所有回答我問題的人。我不僅學到了很多關於這個問題的知識,而且學到了很多關於網路安全的知識。我將@Mikael 的答案標記為已接受,但其他答案也非常有用。

我該怎麼做才能保護自己?

[2010-09-29更新]

微軟安全公告

參考修復的知識庫文章

ScottGu有下載連結

[2010-09-25更新]

在我們等待修復的同時,昨天ScottGu 發布了關於如何添加額外步驟以使用自定義 URLScan 規則保護您的站點的更新。


基本上確保您提供自定義錯誤頁面,以便攻擊者不會暴露於內部 .Net 錯誤,無論如何在發布/生產模式下您都應該這樣做。

此外,在錯誤頁面中添加隨機時間睡眠,以防止攻擊者對添加的攻擊資訊的響應進行計時。

在 web.config

<configuration>
<location allowOverride="false">
  <system.web>
    <customErrors mode="On" defaultRedirect="~/error.html" />
  </system.web>
</location>
</configuration>

這會將任何錯誤重定向到返回 200 狀態程式碼的自定義頁面。這樣,攻擊者就無法查看錯誤程式碼或錯誤資訊以獲取進一步攻擊所需的資訊。

設置 也是安全的customErrors mode="RemoteOnly",因為這將重定向“真實”客戶端。只有從 localhost 瀏覽才會顯示內部 .Net 錯誤。

重要的部分是確保所有錯誤都配置為返回相同的錯誤頁面。這要求您明確設置該部分的defaultRedirect屬性<customErrors>並確保未設置每個狀態程式碼。

有什麼風險?

如果攻擊者設法使用上述漏洞,他/她可以從您的 Web 應用程序中下載內部文件。通常 web.config 是一個目標,可能包含敏感資訊,如數據庫連接字元串中的登錄資訊,甚至連結到您不希望有人掌握的自動 sql-express 數據庫。但是,如果您遵循最佳實踐,您可以使用受保護的配置來加密 web.config 中的所有敏感數據。

參考文獻連結

在http://www.microsoft.com/technet/security/advisory/2416728.mspx上閱讀 Microsoft 關於該漏洞的官方評論。特別是有關此問題的實施細節的“解決方法”部分。

還有一些關於ScottGu部落格的資訊,包括在您的 Web 伺服器上查找易受攻擊的 ASP.Net 應用程序的腳本。

有關“了解填充 Oracle 攻擊”的解釋,請閱讀@sri 的回答


文章評論:

Rizzo 和 Duong 對 ASP.NET 應用程序實施的攻擊要求網站上的加密實施有一個預言機,當發送密文時,它不僅會解密文本,還會向發送者發送一條消息,說明密文中是否有填充是有效的

如果填充無效,發件人收到的錯誤消息將為他提供有關站點解密過程工作方式的一些資訊。

為了使攻擊起作用,必須滿足以下條件:

  • 您的應用程序必須給出有關填充無效的錯誤消息。
  • 必須有人篡改您的加密 cookie 或視圖狀態

因此,如果您在應用程序中返回人類可讀的錯誤消息,例如*“出現問題,請重試”,*那麼您應該是非常安全的。閱讀一些關於文章的評論也可以提供有價值的資訊。

  • 在加密的 cookie 中儲存會話 ID
  • 以會話狀態儲存真實數據(保存在數據庫中)
  • 使用者資訊錯誤時添加隨機等待返回錯誤,所以無法計時

這樣,被劫持的 cookie 只能用於檢索很可能不再存在或失效的會話。

看看 Ekoparty 會議上實際展示的內容會很有趣,但現在我不太擔心這個漏洞。

引用自:https://stackoverflow.com/questions/3720720