ผู้พัฒนาโครงการ Grsecurity
แพทช์ HKSP ได้รับการเผยแพร่โดยพนักงานของ Huawei รวมถึงการกล่าวถึง Huawei ในโปรไฟล์ GitHub และใช้คำว่า Huawei ในชื่อโครงการ (HKSP - Huawei Kernel Self Protection) ในเวลาเดียวกัน ตัวแทนของ Huawei ปฏิเสธความเชื่อมโยงของโครงการ HKSP กับบริษัท และระบุว่ารหัสดังกล่าวได้รับการพัฒนาตามความคิดริเริ่มส่วนบุคคลของพนักงาน ไม่ใช่โครงการอย่างเป็นทางการของ Huawei และไม่ได้ใช้ในผลิตภัณฑ์ของบริษัท บน
HKSP รวมถึงการเปลี่ยนแปลง เช่น การสุ่มออฟเซ็ตในโครงสร้างความน่าเชื่อถือ การป้องกันการโจมตีบนเนมสเปซตัวระบุผู้ใช้ (เนมสเปซ pid) การแยกสแต็กกระบวนการออกจากพื้นที่ mmap การตรวจจับการเรียกสองครั้งไปยังฟังก์ชัน kfree การบล็อกการรั่วไหลผ่านหลอก -FS /proc (/proc/ {โมดูล, คีย์, ผู้ใช้คีย์}, /proc/sys/kernel/* และ /proc/sys/vm/mmap_min_addr, /proc/kallsyms), ปรับปรุงการสุ่มที่อยู่พื้นที่ผู้ใช้, Ptrace เพิ่มเติม การป้องกัน, การป้องกัน smap และ smep ที่ได้รับการปรับปรุง ความสามารถในการห้ามการส่งข้อมูลผ่านซ็อกเก็ตดิบ การบล็อกที่อยู่ที่ไม่ถูกต้องในซ็อกเก็ต UDP และตรวจสอบความสมบูรณ์ของกระบวนการที่ทำงานอยู่ นอกจากนี้ยังมีโมดูลเคอร์เนล Ksguard ซึ่งมีวัตถุประสงค์เพื่อตรวจจับความพยายามที่จะแนะนำรูทคิททั่วไป
พัทจิ
การศึกษาแพตช์โดยนักพัฒนา Grsecurity เผยให้เห็นข้อผิดพลาดและจุดอ่อนมากมายในโค้ด และยังแสดงให้เห็นว่าไม่มีโมเดลภัยคุกคามที่จะช่วยให้พวกเขาสามารถตัดสินความสามารถของโปรเจ็กต์ได้อย่างเพียงพอ เพื่อแสดงให้เห็นอย่างชัดเจนว่าโค้ดถูกเขียนโดยไม่ใช้วิธีการเขียนโปรแกรมที่ปลอดภัย จึงมีการให้ตัวอย่างของช่องโหว่เล็กๆ น้อยๆ ในตัวจัดการ
ไฟล์ /proc/ksguard/state ซึ่งสร้างขึ้นด้วยสิทธิ์ 0777 หมายความว่าทุกคนมีสิทธิ์ในการเขียน ฟังก์ชัน ksg_state_write ใช้เพื่อแยกวิเคราะห์คำสั่งที่เขียนไปยัง /proc/ksguard/state จะสร้างบัฟเฟอร์ tmp[32] ซึ่งข้อมูลจะถูกเขียนตามขนาดของตัวถูกดำเนินการที่ส่งผ่าน โดยไม่คำนึงถึงขนาดของบัฟเฟอร์เป้าหมายและไม่มี ตรวจสอบพารามิเตอร์ด้วยขนาดสตริง เหล่านั้น. หากต้องการเขียนทับเคอร์เนลสแต็กบางส่วน ผู้โจมตีเพียงแค่ต้องเขียนบรรทัดที่มีรูปแบบพิเศษไปที่ /proc/ksguard/state
ssize_t แบบคงที่ ksg_state_write (ไฟล์ struct * ไฟล์, const char __user *buf,
size_t len, loff_t *ชดเชย)
{
ค่า u64;
ถ่าน tmp[32];
ขนาด_tn = 0;
ถ้า (copy_from_user(tmp, buf, len))
กลับ -1;
value = simple_strtoul(tmp, '\0', 10);
...
ใช้ประโยชน์จากต้นแบบ:
ถ่านบุฟ [4096] = { };
int fd = open("/proc/ksguard/state", O_WRONLY);
ถ้า (fd >= 0) {
เขียน (fd, buf, ขนาดของ (buf));
ปิด(fd);
}
ที่มา: opennet.ru