Recientemente เผยแพร่ข่าวเกี่ยวกับการระบุช่องโหว่ที่สำคัญหลายประการใน Linux TCP stacks และ FreeBSD นั้น อนุญาตให้ผู้โจมตีเริ่มต้นเคอร์เนลล้มเหลวจากระยะไกล หรือทำให้สิ้นเปลืองทรัพยากรมากเกินไปโดยการประมวลผลแพ็กเก็ต TCP ที่สร้างขึ้นเป็นพิเศษ (แพ็กเก็ตแห่งความตาย)
ปัญหาเกิดจากข้อผิดพลาดในส่วนจัดการของขนาดสูงสุดของบล็อกข้อมูล ในแพ็กเก็ต TCP (MSS, ขนาดเซ็กเมนต์สูงสุด) และกลไกสำหรับการจดจำการเชื่อมต่อแบบเลือก (SACK, Selective TCP recognition)
การจดจำแบบเลือกคืออะไร?
Selective TCP Recognition (SACK) เป็นกลไกที่ผู้รับข้อมูลสามารถแจ้งผู้ส่งเกี่ยวกับเซ็กเมนต์ทั้งหมดที่ยอมรับได้สำเร็จ
นี้ อนุญาตให้ผู้ส่งส่งส่วนสตรีมที่ขาดหายไปอีกครั้ง จากชุด 'ที่รู้จักกันดี' ของเขา เมื่อปิดใช้งาน TCP SACK จะต้องใช้ชุดการส่งข้อมูลซ้ำที่ใหญ่กว่ามากเพื่อส่งใหม่ทั้งลำดับ
ในเคอร์เนล Linux ปัญหาได้รับการแก้ไขในเวอร์ชัน 4.4.182, 4.9.182, 4.14.127, 4.19.52 และ 5.1.11 โซลูชันสำหรับ FreeBSD พร้อมใช้งานเป็นแพตช์
การอัปเดตแพคเกจเคอร์เนลจะเผยแพร่สำหรับ Debian, RHEL, SUSE / openSUSE, ALT, Ubuntu, Fedora และ Arch Linux
CVE-2019-11477 (กระสอบ Panic)
ปัญหา ปรากฏตัวในเคอร์เนลของลินุกซ์ ณ 2.6.29 และอนุญาตให้คุณหยุดเคอร์เนล (ตกใจ) เมื่อส่งชุดของแพ็กเก็ต SACK เนื่องจากจำนวนเต็มล้นในคอนโทรลเลอร์
สำหรับการโจมตีการตั้งค่า MSS เป็น 48 ไบต์สำหรับการเชื่อมต่อ TCP ก็เพียงพอแล้ว และส่งลำดับของแพ็คเก็ต SACK ที่จัดเรียงในลักษณะหนึ่ง
สาระสำคัญของปัญหาอยู่ที่โครงสร้าง tcp_skb_cb (ซ็อกเก็ตบัฟเฟอร์) ถูกออกแบบมาเพื่อจัดเก็บชิ้นส่วน 17 ชิ้น ("กำหนด MAX_SKB_FRAGS (65536 / PAGE_SIZE + 1) => 17")
ในกระบวนการส่งแพ็กเก็ตจะถูกวางไว้ในคิวการส่งและ tcp_skb_cb จะเก็บรายละเอียดเกี่ยวกับแพ็กเก็ตเช่นหมายเลขลำดับแฟล็กรวมถึงฟิลด์ "tcp_gso_segs" และ "tcp_gso_size" ซึ่งใช้ในการส่ง ข้อมูลการแบ่งกลุ่มไปยังคอนโทรลเลอร์ (TSO, การดาวน์โหลดเซ็กเมนต์กลุ่ม) เพื่อประมวลผลเซ็กเมนต์ทางด้านการ์ดเครือข่าย
แฟรกเมนต์จะถูกบันทึกเมื่อแพ็กเก็ตสูญหายหรือความจำเป็นในการส่งแพ็กเก็ตแบบเลือกเกิดขึ้นหากเปิดใช้งาน SACK และไดรเวอร์รองรับ TSO
ในการป้องกันคุณสามารถปิดใช้งานการประมวลผล SACK หรือบล็อกการเชื่อมต่อด้วย MSS ขนาดเล็ก (ใช้ได้เฉพาะเมื่อคุณตั้งค่า sysctl net.ipv4.tcp_mtu_probing เป็น 0 และอาจทำให้ปกติบางส่วนเสียหาย) โดยใช้ MSS ต่ำ)
CVE-2019-11478 (SACK ช้า)
ความล้มเหลวนี้ ทำให้กลไก SACK หยุดชะงัก (เมื่อใช้เคอร์เนล Linux ใน 4.15) หรือใช้ทรัพยากรมากเกินไป
ปัญหาเกิดขึ้นเมื่อประมวลผลแพ็กเก็ต SACK ที่สร้างขึ้นเป็นพิเศษซึ่งสามารถใช้เพื่อแบ่งส่วนคิวการส่งข้อมูลซ้ำ (TCP retransmission) โซลูชันสำหรับการป้องกันจะคล้ายกับช่องโหว่ก่อนหน้านี้
CVE-2019-5599 (SACK ช้า)
อนุญาตให้ทำให้เกิดการแยกส่วนของแผนที่แพ็คเก็ตที่ส่งเมื่อประมวลผลลำดับ SACK ภายในการเชื่อมต่อ TCP เดียวและทำให้การดำเนินการค้นหารายการที่ใช้ทรัพยากรจำนวนมากทำงาน
ปัญหาปรากฏใน FreeBSD 12 พร้อมกับกลไกการตรวจจับการสูญหายของแพ็คเก็ต RACK เป็นวิธีแก้ปัญหาชั่วคราวคุณสามารถปิดใช้งานโมดูล RACK (ไม่ได้โหลดโดยค่าเริ่มต้นปิดใช้งานโดยระบุ sysctl net.inet.tcp.functions_default = freebsd)
CVE-2019-11479
ข้อบกพร่องช่วยให้ผู้โจมตีสามารถทำให้เคอร์เนล Linux แบ่งการตอบสนองออกเป็นส่วน TCP หลาย ๆ ส่วน ซึ่งแต่ละรายการมีข้อมูลเพียง 8 ไบต์ซึ่งอาจนำไปสู่การรับส่งข้อมูลเพิ่มขึ้นอย่างมากภาระ CPU ที่เพิ่มขึ้นและช่องทางการสื่อสารที่อุดตัน
นอกจากนี้ยังสิ้นเปลืองทรัพยากรเพิ่มเติม (กำลังประมวลผลและการ์ดเครือข่าย)
การโจมตีนี้ต้องใช้ความพยายามอย่างต่อเนื่องในส่วนของผู้โจมตีและการโจมตีจะสิ้นสุดลงในไม่ช้าหลังจากผู้โจมตีหยุดส่งการเข้าชม
ในขณะที่การโจมตีนี้กำลังดำเนินอยู่ระบบจะทำงานด้วยความสามารถที่ลดลงทำให้ผู้ใช้บางรายปฏิเสธการให้บริการ
ผู้ใช้ระยะไกลสามารถทริกเกอร์ปัญหานี้ได้โดยตั้งค่าขนาดเซ็กเมนต์สูงสุด (MSS) ของการเชื่อมต่อ TCP ที่ขีด จำกัด ต่ำสุด (48 ไบต์) และส่งลำดับของแพ็กเก็ต SACK ที่สร้างขึ้นเป็นพิเศษ
เพื่อเป็นการแก้ปัญหาเบื้องต้นขอแนะนำให้บล็อกการเชื่อมต่อที่มี MSS ต่ำ