ล่าสุดมีข่าวดังกล่าว พบช่องโหว่ในเคอร์เนลลินุกซ์ และได้จัดหมวดหมู่ไว้แล้วภายใต้ CVE-2022-0847 และได้ชื่อว่า "ท่อสกปรก".
ช่องโหว่นี้ขนานนามว่า "Dirty Pipe"อนุญาตให้เขียนทับเนื้อหาของแคช ของหน้าสำหรับไฟล์ใดๆ รวมถึงที่ตั้งค่าเป็นแบบอ่านอย่างเดียว เปิดด้วยแฟล็ก O_RDONLY หรืออยู่บนระบบไฟล์ที่เมาท์เป็นแบบอ่านอย่างเดียว
ด้านการปฏิบัติ จุดอ่อน สามารถใช้เพื่อฉีดโค้ดลงในกระบวนการโดยพลการได้ หรือข้อมูลเสียหายในไฟล์ที่เปิดอยู่ ตัวอย่างเช่น คุณสามารถเปลี่ยนเนื้อหาของไฟล์ Author_keys สำหรับกระบวนการ sshd
เกี่ยวกับ Dirty Pipe
คล้ายกับช่องโหว่ที่สำคัญ Dirty COW ระบุในปี 2016 และ Dirty Pipe ระบุว่าอยู่ในระดับเดียวกับ Dirty COW ในแง่ของอันตราย แต่อันนี้ใช้งานง่ายกว่ามาก
Dirty Pipe ถูกระบุในระหว่างการวิเคราะห์ข้อร้องเรียนเกี่ยวกับความเสียหายเป็นระยะต่อเอกสารสำคัญ ดาวน์โหลดผ่านเครือข่ายบนระบบที่ดาวน์โหลดไฟล์บีบอัดจากเซิร์ฟเวอร์การบันทึก (37 เสียหายใน 3 เดือนบนระบบที่โหลด) ซึ่งเตรียมโดยใช้การดำเนินการ splice() และไพพ์ที่ไม่มีชื่อ
ช่องโหว่ ได้รับการแสดงตั้งแต่เคอร์เนลลินุกซ์รุ่น 5.8วางจำหน่ายในเดือนสิงหาคม 2020
เห็นอีกวิธีหนึ่งที่เราสามารถพูดได้ว่ามีอยู่ใน Debian 11 แต่ไม่ส่งผลต่อเคอร์เนลพื้นฐานใน Ubuntu 20.04 LTS ในขณะที่สำหรับ RHEL 8.x และ openSUSE/SUSE 15 เคอร์เนลที่เดิมมีพื้นฐานมาจากสาขาเก่า แต่เป็นไปได้ ว่าการเปลี่ยนแปลงที่ทำให้เกิดปัญหาได้ถูกโอนไป (ยังไม่มีข้อมูลที่แน่ชัด)
ช่องโหว่นี้เกิดจากการไม่มีการกำหนดค่าเริ่มต้นของค่า "buf->flags" ในโค้ดของฟังก์ชัน copy_page_to_iter_pipe() และ push_pipe() แม้ว่าหน่วยความจำจะไม่ถูกล้างเมื่อมีการจัดสรรโครงสร้าง และด้วยการปรับแต่งบางอย่างที่ไม่มีชื่อ ไปป์ "buf->flags" อาจมีค่าจากการดำเนินการอื่น ด้วยคุณลักษณะนี้ ผู้ใช้ในพื้นที่ที่ไม่มีสิทธิพิเศษสามารถบรรลุลักษณะที่ปรากฏของค่า PIPE_BUF_FLAG_CAN_MERGE ในแฟล็ก ทำให้สามารถเขียนทับข้อมูลในแคชของเพจได้ง่ายๆ โดยการเขียนข้อมูลใหม่ไปยังไพพ์ที่ไม่มีชื่อที่เตรียมไว้เป็นพิเศษ
สำหรับการโจมตี สามารถทำได้ คุณต้องมีไฟล์เป้าหมายที่ต้องอ่านได้ และเนื่องจากไม่มีการตรวจสอบสิทธิ์การเข้าถึงเมื่อเขียนไปยังไพพ์ การแทนที่สามารถทำได้บนแคชของเพจ แม้แต่ไฟล์ที่อยู่ในพาร์ติชั่นแบบอ่านอย่างเดียว (เช่น สำหรับไฟล์ซีดีรอม c)
ด้วยเหตุนี้ หลังจากแทนที่ข้อมูลในแคชของเพจ กระบวนการเมื่ออ่านข้อมูลจากไฟล์จะไม่ได้รับข้อมูลจริง แต่จะไม่ได้รับข้อมูลที่ถูกแทนที่
เป็นที่กล่าวขวัญกันว่า การดำเนินการ Dirty Pipe ทำให้เกิดการสร้างไปป์ที่ไม่มีชื่อและเติมข้อมูลโดยพลการ เพื่อให้บรรลุการตั้งค่าสถานะ PIPE_BUF_FLAG_CAN_MERGE บนโครงสร้างวงแหวนทั้งหมดที่เกี่ยวข้อง
จากนั้น ข้อมูลจะถูกอ่านจากไพพ์ แต่แฟล็กยังคงถูกตั้งค่าบนอินสแตนซ์ทั้งหมดของโครงสร้าง pipe_buffer ในโครงสร้างวงแหวน pipe_inode_info จากนั้นจะมีการเรียก splice() เพื่ออ่านข้อมูลจากไฟล์ปลายทางไปยังไพพ์ที่ไม่มีชื่อ โดยเริ่มต้นที่ออฟเซ็ตที่ต้องการ เมื่อเขียนข้อมูลไปยังไพพ์ที่ไม่มีชื่อนี้ แฟล็ก PIPE_BUF_FLAG_CAN_MERGE จะเขียนทับข้อมูลในแคชของเพจ แทนที่จะสร้างอินสแตนซ์ใหม่ของโครงสร้าง pipe_buffer
ในที่สุด หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติม สามารถตรวจสอบรายละเอียดได้ในบันทึกต้นฉบับ ในลิงค์ต่อไปนี้.
นอกจากนี้หากคุณสนใจ สามารถติดตามหรือทราบเกี่ยวกับการเผยแพร่การอัพเดท ของแพ็คเกจในการแจกแจงหลัก คุณสามารถทำได้จากหน้าเหล่านี้: debian, SUSE, อูบุนตู, RHEL, Fedora, Gentoo, Arch Linux
มีการกล่าวถึงการแก้ไขช่องโหว่ที่เสนอใน Linux Kernel เวอร์ชัน 5.16.11, 5.15.25 และ 5.10.102 และการแก้ไขจะรวมอยู่ในเคอร์เนลที่ใช้บนแพลตฟอร์ม Android ด้วย