Kees Cook เปิดตัวแพตช์ใหม่เพื่อปรับปรุงความปลอดภัยของ Linux Kernel Stack

ลินุกซ์

Kees Cook อดีตหัวหน้าผู้ดูแลระบบที่ kernel.org และหัวหน้าทีมรักษาความปลอดภัยของ Ubuntu ตอนนี้ทำงานที่ Google เพื่อปกป้อง Android และ ChromeOS ได้เปิดตัวชุดของแพตช์ที่สุ่มค่าออฟเซ็ตของสแต็กเคอร์เนล เมื่อจัดการการโทรของระบบ โปรแกรมแก้ไขปรับปรุงความปลอดภัยของเคอร์เนลโดยการเปลี่ยนตำแหน่งสแต็ก lหรือทำให้การโจมตีแบบสแต็กยากขึ้นมากและประสบความสำเร็จน้อยลง

แนวคิดดั้งเดิมสำหรับแพตช์เป็นของโครงการ PaX RANDKSTACK ในปี 2019 Elena Reshetova วิศวกรของ Intel ได้พยายามสร้างการนำแนวคิดนี้ไปใช้งานซึ่งเหมาะสำหรับการรวมไว้ในองค์ประกอบหลักของเคอร์เนล Linux

ต่อจากนั้น Kees Cook ได้ริเริ่มโครงการนี้ ผู้ซึ่งนำเสนอการใช้งานที่เหมาะสมสำหรับเคอร์เนลเวอร์ชันหลักและมีการวางแผนแพตช์สำหรับ Linux เวอร์ชัน 5.13

โหมดจะถูกปิดใช้งานโดยค่าเริ่มต้นและหากต้องการเปิดใช้งานจะมีการนำเสนอพารามิเตอร์บรรทัดคำสั่งเคอร์เนล "Randomize_kstack_offset = เปิด / ปิด»และการตั้งค่า CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT นอกจากนี้ค่าใช้จ่ายในการเปิดใช้งานโหมดนี้คาดว่าจะสูญเสียประสิทธิภาพโดยประมาณ 1%

สาระสำคัญของการป้องกันที่เสนอคือการเลือกออฟเซ็ตสแต็กแบบสุ่มสำหรับการเรียกระบบแต่ละครั้งซึ่งทำให้การกำหนดเลย์เอาต์สแต็กในหน่วยความจำมีความซับซ้อนแม้ว่าจะได้รับข้อมูลแอดเดรสเนื่องจากแอดเดรสฐานของสแต็กจะเปลี่ยนไปในการเรียกครั้งถัดไป

ซึ่งแตกต่างจากการใช้งาน PaX RANDK STACKในแพตช์ที่เสนอให้รวมไว้ในเคอร์เนล การสุ่มไม่ได้ทำในระยะเริ่มต้น, แต่หลังจากตั้งค่าโครงสร้าง pt_regsซึ่งทำให้ไม่สามารถใช้วิธีที่ใช้ ptrace เพื่อกำหนดค่าชดเชยแบบสุ่มระหว่างการเรียกระบบที่ใช้เวลานาน

เนื่องจากการป้องกันสแต็กเคอร์เนลของลินุกซ์ได้รับการปรับปรุงอย่างต่อเนื่อง (การทำแผนที่สแต็กตาม vmap พร้อมหน้าการป้องกันการลบ thread_info STACKLEAK) ผู้โจมตีจึงต้องหาวิธีใหม่ในการใช้ประโยชน์

พวกเขามีและยังคงพึ่งพาปัจจัยการสร้างสแต็กของเคอร์เนลในสถานการณ์ที่ VMAP_STACK และ THREAD_INFO_IN_TASK_STRUCT พวกเขาไม่เกี่ยวข้อง ตัวอย่างเช่นการโจมตีล่าสุดต่อไปนี้จะถูกขัดขวางหากไม่ได้กำหนดสแต็กออฟเซ็ตระหว่างการเรียกระบบ

วัตถุประสงค์ของฟังก์ชัน randomize_kstack_offset คือการเพิ่มออฟเซ็ตแบบสุ่ม หลังจากที่ pt_regs ถูกผลักลงบนสแต็กและก่อนที่เธรดสแต็กที่เหลือจะถูกใช้ในระหว่างการประมวลผลการเรียกระบบและเปลี่ยนทุกครั้งที่กระบวนการเรียกใช้ระบบ ปัจจุบันแหล่งที่มาของการสุ่มถูกกำหนดโดยสถาปัตยกรรม (แต่ x86 ใช้ไบต์ต่ำของ rdtsc ())

การปรับปรุงในอนาคตเป็นไปได้สำหรับแหล่งที่มาของเอนโทรปีที่แตกต่างกัน แต่อยู่นอกขอบเขตของโปรแกรมแก้ไขนี้ นอกจากนี้เพื่อเพิ่มความไม่สามารถคาดเดาได้มากขึ้นการชดเชยใหม่จะถูกเลือกเมื่อสิ้นสุดการเรียกระบบ (เวลาที่ควรวัดจากพื้นที่ผู้ใช้งานได้ง่ายกว่าเวลาที่เข้าสู่การเรียกระบบ) และจะถูกเก็บไว้ในตัวแปรเดียวต่อ CPU เพื่อให้อายุการใช้งานของค่าไม่ผูกติดกับงานเดียวอย่างชัดเจน

ไม่มีการเปลี่ยนแปลงที่มองเห็นได้สำหรับสิ่งนี้บน x86 เนื่องจากโปรแกรมรักษาสแต็กถูกปิดใช้งานโดยไม่มีเงื่อนไขสำหรับหน่วยคอมไพล์อยู่แล้ว แต่จำเป็นต้องมีการเปลี่ยนแปลงใน arm64 น่าเสียดายที่ไม่มีแอตทริบิวต์ที่สามารถใช้ปิดใช้งานโปรแกรมรักษาสแต็กสำหรับฟังก์ชันเฉพาะได้ การเปรียบเทียบกับฟังก์ชัน PaX RANDKSTACK: ฟังก์ชัน RANDKSTACK สุ่มตำแหน่งของจุดเริ่มต้นของสแต็ก (cpu_current_top_of_stack) นั่นคือรวมตำแหน่งของโครงสร้าง pt_regs บนสแต็ก

ในขั้นต้น แพทช์นี้ใช้แนวทางเดียวกัน แต่ในระหว่างการสนทนาเมื่อเร็ว ๆ นี้มีการพิจารณาว่ามีค่าเพียงเล็กน้อยราวกับว่าฟังก์ชัน ptrace พร้อมใช้งานสำหรับผู้โจมตีคุณสามารถใช้ PTRACE_PEEKUSR เพื่ออ่าน / เขียนออฟเซ็ตต่างๆของโครงสร้าง pt_regs สังเกตพฤติกรรมแคชของการเข้าถึง pt_regs และค้นหา การชดเชยสแต็กแบบสุ่ม

ในที่สุดก็มีการกล่าวถึงว่า การใช้งานเบื้องต้นรองรับโปรเซสเซอร์ ARM64 และ x86 / x86_64.


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

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

*

*

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