สรุป
ช่องโหว่การเปิดเผยข้อมูลที่มีอยู่ในโพรโทคอลในการรักษาความปลอดภัยของเลเยอร์ขนส่งและโพรโทคอล การรักษาความปลอดภัย Secure Sockets Layer (TLS/SSL) ตามที่นำมาใช้ในคอมโพเนนต์การเข้ารหัสลับของ Microsoft .NET Framework โจมตีที่สามารถช่องโหว่นี้ไม่สามารถถอดรหัสลับปริมาณการใช้งาน TLS/SSL เข้ารหัสลับ
เพื่อทำลายช่องโหว่ที่ โจมตีจะแรกได้ใส่ข้อมูลที่ไม่ได้เข้ารหัสลงในช่องทางปลอดภัย และทำการโจมตี (MiTM) ผู้ชายในตัวตรงกลางระหว่างเป้าหมายไคลเอนต์และเซิร์ฟเวอร์ที่ถูกต้องตามกฎหมาย โปรแกรมปรับปรุงนี้เน้นช่องโหว่ที่ โดยการปรับเปลี่ยนวิธีที่คอมโพเนนต์การเข้ารหัสลับ.NET ส่ง และรับแพคเก็ตเครือข่ายที่เข้ารหัสลับ
ช่องโหว่นี้ได้รับการแก้ไขเป็นส่วนหนึ่งของMicrosoft Security บูเลทีนรักษา MS16-065 โปรแกรมปรับปรุงนี้เปลี่ยนวิธีคอมโพเนนต์การเข้ารหัสลับของ.NET Framework ส่ง และรับแพคเก็ตเครือข่ายที่เข้ารหัสลับ
ตารางต่อไปนี้ประกอบด้วยการเชื่อมโยงไปยังรายการมาตรฐานสำหรับแต่ละช่องโหว่ในรายการช่องโหว่ทั่วไปและ Exposures
ชื่อเรื่องช่องโหว่ |
หมายเลข CVE |
เปิดเผยอย่างเปิดเผย |
สามารถ |
---|---|---|---|
ช่องโหว่ลวง TLS/SSL |
ใช่ |
ไม่ใช่ |
ความละเอียดของช่องโหว่
การเปลี่ยนแปลงที่นำมาใช้ในMicrosoft Security บูเลทีนรักษา MS16-065ทำให้ระเบียนแรกที่ TLS หลังจาก handshake ที่จะแบ่ง ทำให้ SslStream, WebRequest (HttpWebRequest, FtpWebRequest), SmtpClient และ HttpClient (ถ้าตาม HttpWebRequest) กระแสข้อมูลจะส่งกลับไบต์เดียวสำหรับอ่านแรก ทันทีตาม ด้วยไบต์ที่เหลือ (n-1) ในการอ่านต่อเนื่องกัน การเปลี่ยนแปลงลักษณะการทำงานนี้เกิดขึ้นเฉพาะสำหรับโปรแกรมประยุกต์ที่ใช้ TLS 1.0 + การกำหนดสายงานในการเข้ารหัสบล็อก แต่เมื่อพวกเขาใช้ TLS 1.1 หรือ TLS 1.2
หมายเหตุ เป็นช่วง คุณต้องติดตั้งMicrosoft Security นการ MS12-006เมื่อต้องการเปิดใช้งานการปรับปรุงนี้
การเปลี่ยนแปลงนี้อาจทำให้โปรแกรมประยุกต์บางโปรแกรมที่ใช้.NET Framework ให้แบ่ง บทความนี้อธิบายถึงกันสองวิธีที่คุณสามารถใช้เพื่อปรับปรุงโปรแกรมประยุกต์ของคุณทำงานได้อย่างถูกต้องหลังจากที่คุณใช้Microsoft Security บูเลทีนรักษา MS16-065
Mitigations หาปัญหาความเข้ากันได้
ตัวเลือกที่ 1: การสลับไปยังโพรโทคอล TLS 1.2
ตัวเลือกนี้ทำให้แอพลิเคชันที่ใช้โพรโทคอล TLS 1.2 โดยการปรับเปลี่ยนรีจิสทรี หรือโดยทางโปรแกรมกำหนดค่าโพรโทคอลรุ่น
-
ปรับเปลี่ยนรีจิสทรี
สิ่งสำคัญ
ทำตามขั้นตอนในส่วนนี้อย่างระมัดระวัง ปัญหาร้ายแรงอาจเกิดขึ้นหากคุณปรับเปลี่ยนรีจิสทรีอย่างไม่ถูกต้อง ก่อนจะปรับเปลี่ยนสำรองรีจิสทรีสำหรับการคืนค่าในกรณีที่เกิดปัญหาขึ้น
ใน 4.0 กรอบงาน.NET และโปรแกรมประยุกต์ 4.5.x .NET Framework ที่กำลังทำงานบน.NET Framework 4.5 และรุ่นที่ใหม่กว่า สามารถสลับโพรโทคอลเริ่มต้น กับ TLS 1.2, TLS 1.1, TLS 1.0 โดยการเปิดใช้งานคีย์รีจิสทรีSchUseStrongCrypto คีย์รีจิสทรีนี้จะกล่าวถึงในส่วนการแนะนำการดำเนินการของหัวข้อ2960358 คำแนะนำด้านความปลอดภัยของ Microsoftบนเว็บไซต์ Microsoft TechNet
สิ่งสำคัญ การเปลี่ยนแปลงรีจิสทรีนี้จะทำงานเท่านั้นถ้ามีเงื่อนไขต่อไปนี้:-
โปรแกรมประยุกต์ที่ใช้ Api ที่ใช้ ServicePointManagerกำลังตั้งค่าServicePointManager.SecurityProtocolอย่างชัดเจน ตัวอย่างเช่นคลาสของรวมSystem.Net.Http.HttpClient, System.Net.FtpWebRequest, System.Net.HttpWebRequestและSystem.Net.Mail.SmtpClient การตั้งค่าServicePointManager.SecurityProtocolในรหัสจะมีความสำคัญเหนือรีจิสทรี
-
โปรแกรมประยุกต์ที่กำลังใช้การโอเวอร์โหลด SslStream AuthenticateAsClient(String)
-
-
กำหนดค่าโพรโทคอลรุ่นโดยทางโปรแกรม
ใน 4.0 กรอบงาน.NET และโปรแกรมประยุกต์ 4.5 ที่กำลังทำงานบน.NET Framework 4.5 และรุ่นที่ใหม่กว่า และที่ใช้มากเกินที่SslStream AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean)ต้องเป็น recompiled ระบุSslProtocols.Tls12, SslProtocols.Tls11และSslProtocols.Tlsเป็นพารามิเตอร์สาม สำหรับคำอธิบายที่สมบูรณ์ของวิธีการใช้คลาส SslStream ดูหัวข้อคลาส SslStreamบนเว็บไซต์ Microsoft สำหรับนักพัฒนา (MSDN)
หมายเหตุ .NET Framework 4.6 และรุ่นที่ใหม่กว่าใช้ TLS 1.2, TLS 1.1 และ TLS 1.0 เป็นค่าเริ่มต้นโพรโทคอล นี้จะกล่าวถึงในหัวข้อ2960358 คำแนะนำด้านความปลอดภัยของ Microsoftบนเว็บไซต์ Microsoft TechNet
ตัวเลือกที่ 2: หมายเลขอ้างอิงแบ่งแพ็คเก็ต
โปรแกรมปรับปรุงนี้ทำให้ระเบียนเดียวจะแบ่งเป็นหลายเรกคอร์ด ดังนั้น ถ้าโปรแกรมประยุกต์ต้องการระเบียนสมบูรณ์พร้อมใช้งานในการเรียกอ่านเดียว โปรแกรมประยุกต์ดังกล่าวอาจแบ่ง เพื่อให้แน่ใจว่า โปรแกรมประยุกต์ทำงานได้อย่างถูกต้อง ตรวจสอบแอพลิเคชันการจัดการกับแพคเก็ตแยก โดยดำเนินการโทรStream.Readอย่างถูกต้อง คุณสามารถใช้ตัวอย่างรหัสมีอยู่ที่นี่เป็นการอ้างอิงสำหรับวิธีการแก้ไขแอพลิเคชันเพื่อดำเนินการเรียกเลขหมายแบบอ่านได้อย่างถูกต้อง
สำหรับการร้องขอ HTTP ตัวอย่าง ที่แสดงความแตกต่างในลักษณะการทำงานก่อน (พร้อมกับลด) และหลัง (โดยไม่ลด) ปรับปรุง3147461และ3147458ถูกติดตั้ง ให้ดูส่วน "ข้อมูลเพิ่มเติม"
ตัวอย่างของวิธีการStream.Readที่สมบูรณ์ ดูหัวข้อวิธีการ Stream.Read (ไบต์[ Int32, Int32)บนเว็บไซต์ Microsoft สำหรับนักพัฒนา (MSDN)
วิธีแก้ไขปัญหากับปัญหาความเข้ากันได้ของโปรแกรมประยุกต์
คำเตือน วิธีการแก้ไขปัญหาเหล่านี้อาจทำให้คอมพิวเตอร์หรือเครือข่ายที่มีความเสี่ยงที่จะถูกโจมตี จากผู้ใช้ที่เป็นอันตราย หรือซอฟต์แวร์ที่เป็นอันตรายเช่นไวรัส เราไม่แนะนำให้แก้ไขปัญหาเหล่านี้ แต่เสนอข้อมูลนี้เพื่อให้คุณสามารถใช้การแก้ไขปัญหาเหล่านี้ดุลยพินิจของคุณเอง ใช้วิธีการเหล่านี้คุณต้องเสี่ยง
วิธีที่ 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 ขึ้นอยู่กับรุ่น
สำหรับโปรแกรมประยุกต์ 32 บิตที่เรียกใช้บนคอมพิวเตอร์ 64 บิต เพิ่มคีย์ย่อยของรีจิสทรีต่อไปนี้:
ตำแหน่งที่ตั้งของรีจิสทรี: HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\ NETFramework\ < version_number >
ชื่อ DWORD: SchSendAuxRecord
ข้อมูลค่า: 0
หมายเหตุ ตัวยึดตำแหน่ง < version_number > เป็น v4.0.30319 หรือ v2.0.50727 ขึ้นอยู่กับรุ่น
วิธีแก้ปัญหา
เมื่อต้องการปิดใช้งานโหมดการรักษาความปลอดภัยที่อธิบายไว้ในบทความนี้เป็นการชั่วคราว คลิกการเชื่อมโยงที่เหมาะสมเพื่อดาวน์โหลดแฟ้ม.reg และจากนั้น คลิกสองครั้งที่แฟ้ม.reg ที่ดาวน์โหลดมาเพื่อทำการเปลี่ยนแปลงรีจิสทรี
สำหรับโปรแกรมประยุกต์ Microsoft .NET Framework 3.5 กำหนดเป้าหมาย:
ดาวน์โหลดแฟ้ม ManualOptOutSchSendAuxRecord20.reg เดี๋ยวนี้
สำหรับโปรแกรมประยุกต์เป้าหมาย Microsoft .NET Framework 4.0 และรุ่นที่ใหม่กว่า:
ดาวน์โหลดแฟ้ม ManualOptOutSchSendAuxRecord40.reg เดี๋ยวนี้
เมื่อต้องการเปิดใช้งานโหมดการรักษาความปลอดภัยที่อธิบายไว้ในบทความนี้ คลิกการเชื่อมโยงที่เหมาะสมเพื่อดาวน์โหลดแฟ้ม.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\ \System.Net.ServicePointManager.SchSendAuxRecord NETFramework\ < version_number >
ชื่อ DWORD: เส้นทางครบถ้วนสำหรับ.exe แอพลิเคชัน (ตัวอย่างเช่น C:\MyApp\MyApp.exe)
ข้อมูลค่า: 0
หมายเหตุ ตัวยึดตำแหน่ง < version_number > เป็น v4.0.30319 หรือ v2.0.50727 ขึ้นอยู่กับรุ่น
สำหรับโปรแกรมประยุกต์ 32 บิตที่เรียกใช้บนคอมพิวเตอร์ 64 บิต เพิ่มคีย์ย่อยของรีจิสทรีต่อไปนี้:
ตำแหน่งที่ตั้งของรีจิสทรี: HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\ \System.Net.ServicePointManager.SchSendAuxRecord NETFramework\ < version_number >
ชื่อ DWORD: เส้นทางครบถ้วนสำหรับ.exe แอพลิเคชัน (ตัวอย่างเช่น C:\MyApp\MyApp.exe)
ข้อมูลค่า: 0 (ค่าถูกต้องเท่านั้นคือ0 ค่าใด ๆ จะถูกละเว้น)
หมายเหตุ ตัวยึดตำแหน่ง < version_number > เป็น v4.0.30319 หรือ v2.0.50727 ขึ้นอยู่กับรุ่น
วิธีที่ 2: เปลี่ยนแปลงการตั้งค่าคอนฟิกในระดับแอพลิเคชัน (ที่พร้อมใช้งานเฉพาะสำหรับ.NET Framework รุ่น 4.6 และรุ่นที่ใหม่กว่า)
เริ่มต้น ด้วย 4.6 กรอบงาน.NET คุณสามารถเปลี่ยนการตั้งค่าคอนฟิกที่ระดับโปรแกรมประยุกต์ผ่านรหัสหรือแอพลิเคชันรีจิสทรีหรือการตั้งค่าคอนฟิกการเปลี่ยนแปลง
ใน 4.6 กรอบงาน.NET คุณสามารถตั้งค่าสวิตช์ โดยใช้หนึ่งในวิธีต่อไปนี้ ตัวอย่างเหล่านี้ปิดใช้งานคุณลักษณะการรักษาความปลอดภัย
-
โดยทางโปรแกรม
สิ่งแรกที่ควรทำแอพลิเคชันจะรันรหัสต่อไปนี้ เป็นเช่นนี้ เพราะผู้จัดการจุดบริการจะเตรียมใช้งานเพียงครั้งเดียวprivate const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching"; private const string DontEnableSchSendAuxRecordName = @"Switch.System.Net.DontEnableSchSendAuxRecord";
AppContext.SetSwitch(DisableCachingName, true);
AppContext.SetSwitch(DontEnableSchSendAuxRecordName , true); -
การตั้งค่าคอนฟิกแอพลิเคชัน
เมื่อต้องการเปลี่ยนการตั้งค่าคอนฟิกแอพลิเคชัน เพิ่มรายการต่อไปนี้:<runtime><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
ชนิด: สายอักขระ
ค่า: เป็นจริง
หมายเหตุ Switch.System.Net.DontEnableSchSendAuxRecord = False สำหรับโปรแกรมประยุกต์ทั้งหมด
ข้อมูลเพิ่มเติม
ต่อไปนี้คือ รูปแบบการสื่อสารไคลเอนต์/เซิร์ฟเวอร์ตัวอย่างก่อน และหลัง จากที่มีการติดตั้งโปรแกรมปรับปรุงนี้ ข้อมูลนี้มีให้สำหรับภาพประกอบสำหรับการระบุแอพลิเคชัน breakage ใด ๆ ได้เนื่องจากมีการติดตั้งของโปรแกรมแก้ไขนี้
โดยไม่มีการลด |
มีการลด |
---|---|
[Server] กำลังรอสำหรับการเชื่อมต่อ (127.0.0.1:4431) |
[Server] กำลังรอสำหรับการเชื่อมต่อ (127.0.0.1:4431) |