Dirty Pipe: ช่องโหว่ที่อนุญาตให้เขียนทับข้อมูล

ล่าสุดมีข่าวดังกล่าว พบช่องโหว่ในเคอร์เนลลินุกซ์ และได้จัดหมวดหมู่ไว้แล้วภายใต้ 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

ในที่สุด หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติม สามารถตรวจสอบรายละเอียดได้ในบันทึกต้นฉบับ ในลิงค์ต่อไปนี้.

นอกจากนี้หากคุณสนใจ สามารถติดตามหรือทราบเกี่ยวกับการเผยแพร่การอัพเดท ของแพ็คเกจในการแจกแจงหลัก คุณสามารถทำได้จากหน้าเหล่านี้: debianSUSEอูบุนตูRHELFedoraGentooArch Linux

มีการกล่าวถึงการแก้ไขช่องโหว่ที่เสนอใน Linux Kernel เวอร์ชัน 5.16.11, 5.15.25 และ 5.10.102 และการแก้ไขจะรวมอยู่ในเคอร์เนลที่ใช้บนแพลตฟอร์ม Android ด้วย


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. รับผิดชอบข้อมูล: AB Internet Networks 2008 SL
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา