結論
在 Microsoft .NET Framework 的加密元件中實作的傳輸層安全性通訊協定和安全通訊端層通訊協定 (TLS/SSL) 內,存在了資訊洩漏弱點。成功利用此弱點的攻擊者,可將加密的 TLS/SSL 流量解密。Microsoft 資訊安全公告 MS16-065 中,這項弱點已獲得解決。此更新會改變 .NET Framework 加密元件傳送和接收加密網路封包的方式。
若要利用該弱點,攻擊者要先將未加密的資料插入安全性通道,並在目標用戶端與合法伺服器之間發動攔截式 (MiTM) 攻擊。此更新可藉由修改 .NET 加密元件傳送和接收加密網路封包的方式,來解決此弱點。 在下表包含「一般性弱點」清單中每個弱點的標準項目連結。
弱點標題 |
CVE 編號 |
已公開揭露 |
是否遭到利用 |
---|---|---|---|
TLS/SSL 偽造弱點 |
是 |
否 |
弱點解析
Microsoft 資訊安全公告 MS16-065 中所導入的變更,會造成交握之後的第一個 TLS 記錄進行分割。這會導致 SslStream、WebRequest (HttpWebRequest、FtpWebRequest)、SmtpClient 和 HttpClient (根據 HttpWebRequest) 資料流針對第一次讀取傳回單一位元組,緊接著則會傳回後續讀取中的其餘 (n-1) 位元組。只有使用 TLS 1.0 + 密碼區塊鏈結的應用程式才會發生此行為變更,當應用程式使用 TLS 1.1 或 TLS 1.2 時則不會發生。 注意 必要條件是您必須安裝Microsoft 資訊安全公告 MS12-006 以啟用此更新。 這項變更可能會造成某些以 .NET Framework 為基礎的應用程式作業中斷。本文說明在您套用 Microsoft 資訊安全公告 MS16-065 之後,可用來更新應用程式以使其正確運作的兩種方法。
相容性問題的安全防護功能
選項 1:切換到 TLS 1.2 通訊協定
此選項可藉由修改登錄,或以程式設計方式設定通訊協定版本,讓應用程式使用 TLS 1.2 通訊協定。
-
修改登錄備份登錄 再進行修改。如果發生問題,您就可以還原登錄。 在 .NET Framework 4.5 和更新版本上執行的 .NET Framework 4.0 和 .NET Framework 4.5.x 應用程式,可透過啟用 SchUseStrongCrypto 登錄機碼,將預設通訊協定切換為 TLS 1.2、TLS 1.1 和 TLS 1.0。您可在 Microsoft TechNet 網站上,於 Microsoft 資訊安全摘要報告 2960358 主題的<建議動作>一節中,找到關於此登錄機碼的討論。 重要 在符合下列條件時,此登錄變更才有作用︰
重要 請仔細依照本節中的步驟執行。如果您不當地修改登錄,可能會發生嚴重的問題。請先-
使用 ServicePointManager 型 API 的應用程式未明確設定 ServicePointManager.SecurityProtocol 值。這些類別的範例包括 System.Net.Http.HttpClient、System.Net.FtpWebRequest、System.Net.HttpWebRequest 和 System.Net.Mail.SmtpClient。在程式碼中設定 ServicePointManager.SecurityProtocol 的優先順序高於登錄。
-
應用程式正在使用 SslStream AuthenticateAsClient(String) 多載。
-
-
以程式設計方式設定通訊協定版本SslStream AuthenticateAsClient (字串、X509CertificateCollection、SslProtocols、布林值) 多載的應用程式必須重新編譯,將 SslProtocols.Tls12、SslProtocols.Tls11 和 SslProtocols.Tls 指定為第三個參數。如需如何使用 SslStream 類別的完整說明,請參閱 Microsoft Developer (MSDN) 網站上的 SslStream 類別主題。 注意 .NET Framework 4.6 和更新版本會使用 TLS 1.2、TLS 1.1 和 TLS 1.0 作為通訊協定預設值。您可在 Microsoft TechNet 網站上的 Microsoft 資訊安全摘要報告 2960358 主題中找到相關討論。
在 .NET Framework 4.5 和更新版本上執行的 .NET Framework 4.0 和 4.5 應用程式,以及使用
選項 2:處理分割封包
此更新會讓單一記錄分割成多筆記錄。因此,如果應用程式預期可在單一讀取呼叫中取得完整記錄,這類應用程式便會中斷。若要確保應用程式會有正確行為,請確認應用程式會藉由正確執行 Stream.Read 呼叫來處理分割封包。您可以使用這裡提供的範例程式碼作為參考,以了解如何修正應用程式,使其正確執行讀取呼叫。 如需顯示在安裝更新3147461 及3147458 之前 (具有安全防護功能) 和之後 (沒有安全防護功能) 之行為差異的範例 HTTP 要求,請參閱<其他相關資訊>一節。 如需 Stream.Read 方法的完整範例,請參閱 Microsoft Developer (MSDN) 網站上的 Stream.Read 方法 (Byte[]、Int32、Int32) 主題。
應用程式相容性問題的因應措施
警告 這些因應措施可能會讓電腦或網路更容易遭到惡意使用者或病毒之類的惡意軟體所攻擊。雖然不建議使用這些因應措施,但我們仍提供這項資訊,讓您可以自行選擇是否實作這些因應措施。請自行承擔使用這些因應措施的風險。
方法 1:更新登錄機碼 (適用於 .NET Framework 的所有版本)
(全域) 停用 SCH_SEND_AUX_RECORD 結構 停用個別應用程式的 SCH_SEND_AUX_RECORD 結構
(全域) 停用 SCH_SEND_AUX_RECORD 結構
對所有應用程式新增下列登錄子機碼︰
登錄位置:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>
DWORD 名稱:SchSendAuxRecord 數值資料: 0 注意 <version_number> 預留位置是 v4.0.30319 或 v2.0.50727,視版本而定。 針對在 64 位元電腦上執行的 32 位元應用程式,也新增下列登錄子機碼︰登錄位置:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>
DWORD 名稱:SchSendAuxRecord 數值資料: 0 注意 <version_number> 預留位置是 v4.0.30319 或 v2.0.50727,視版本而定。因應措施
若要暫時停用本文所述的安全模式,請按一下適用連結來下載 .reg 檔案,以進行登錄變更。
針對以 Microsoft .NET Framework 3.5 作為目標的應用程式︰立即下載 ManualOptOutSchSendAuxRecord20.reg 檔案。 針對以 Microsoft .NET Framework 4.0 和更新版本作為目標的應用程式︰
立即下載 ManualOptOutSchSendAuxRecord40.reg 檔案。 若要重新啟用本文所述的安全模式,請按一下適用連結來下載 .reg 檔案,以進行登錄變更。 針對以 Microsoft .NET Framework 3.5 作為目標的應用程式︰
立即下載 ManualOptInSchSendAuxRecord20.reg 檔案。 針對以 Microsoft .NET Framework 4.0 和更新版本作為目標的應用程式︰
立即下載 ManualOptInSchSendAuxRecord40.reg 檔案。 如需有關如何下載 Microsoft 支援檔案的詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
119591 如何從線上服務取得 Microsoft 支援檔案Microsoft 已對這個檔案做過病毒掃描。Microsoft 是利用發佈當日的最新病毒偵測軟體來掃描檔案。檔案會儲存在安全性強化伺服器上,以避免任何未經授權的變更。
停用個別應用程式的 SCH_SEND_AUX_RECORD 結構
對所有應用程式新增下列登錄子機碼︰
登錄位置:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecord
DWORD 名稱:應用程式 .exe 的完整路徑 (例如,C:\MyApp\MyApp.exe) 數值資料: 0 注意 <version_number> 預留位置是 v4.0.30319 或 v2.0.50727,視版本而定。 針對在 64 位元電腦上執行的 32 位元應用程式,也新增下列登錄子機碼︰登錄位置:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecord
DWORD 名稱:應用程式 .exe 的完整路徑 (例如,C:\MyApp\MyApp.exe) 數值資料:0 (唯一有效的值是 0。任何其他值將遭到忽略。) 注意 <version_number> 預留位置是 v4.0.30319 或 v2.0.50727,視版本而定。方法 2:變更應用程式層級的設定 (僅適用於 .NET Framework 4.6 版和更新版本)
從 .NET Framework 4.6 開始,您可以透過變更程式碼、應用程式設定或登錄,來變更應用程式層級的設定。
在 .NET Framework 4.6 中,您可以使用下列任何方法設定參數。這些範例會停用資訊安全功能。-
程式設計方式
應用程式應該做的第一件事就是執行下列程式碼。這是因為 Service Point Manager 只會初始化一次。private const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching";
private const string DontEnableSchSendAuxRecordName = @"Switch.System.Net.DontEnableSchSendAuxRecord"; AppContext.SetSwitch(DisableCachingName, true); AppContext.SetSwitch(DontEnableSchSendAuxRecordName , true); -
應用程式設定
若要變更應用程式設定,請新增下列項目︰<執行階段>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchSendAuxRecord=true"/> </runtime> -
登錄機碼 (全域的電腦)
登錄位置:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\AppContextHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContext
值:Switch.System.Net.DontEnableSchSendAuxRecord 類型:字串 值:True 注意 所有應用程式的 Switch.System.Net.DontEnableSchSendAuxRecord = False。
其他相關資訊
下列是安裝此更新之前和之後的範例用戶端/伺服器通訊模式。這項資訊是提供來說明如何識別任何因為安裝此修正程式所造成的應用程式中斷。
沒有安全防護功能 |
具有安全防護功能 |
---|---|
[伺服器] 正在等候連線 (127.0.0.1:4431) [用戶端] 正在連線到 localhost:4431 [伺服器] 用戶端已連線。 [用戶端] 已連線。正在驗證... [伺服器] 用戶端已驗證。 [用戶端] 正在傳送要求 (94 位元組) [用戶端] 正在等候回覆... [伺服器] 已接收 94 位元組︰<<<GET / HTTP/1.0 主機:contoso.com 使用者代理程式:正在測試應用程式 >>> [伺服器] 已回覆 476 位元組。 [用戶端 1:476 位元組] 回應︰<<<<<HTTP/1.1 200 OK … >>>>> |
[伺服器] 正在等候連線 (127.0.0.1:4431) [用戶端] 正在連線到 localhost:4431 [伺服器] 用戶端已連線。 [用戶端] 已連線。正在驗證... [伺服器] 用戶端已驗證。 [用戶端] 正在傳送要求 (94 位元組) [用戶端] 正在等候回覆... [伺服器] 已接收 1 位元組︰<<<G>>> [伺服器] 已接收 93 位元組︰<<<ET / HTTP/1.0 主機:contoso.com 使用者代理程式:正在測試應用程式 >>> [伺服器] 已回覆 476 位元組。 [用戶端 1:1 位元組] 回應︰<<<<<H>>>>> [用戶端 2:475 位元組] 回應︰<<<<<TTP/1.1 200 OK … >>>>> |