ช่องโหว่ที่สำคัญใน PolKit ทำให้สามารถเข้าถึงรูทบนลีนุกซ์ส่วนใหญ่ได้

Qualys ได้ระบุช่องโหว่ (CVE-2021-4034) ในส่วนประกอบระบบ Polkit (เดิมเรียกว่า PolicyKit) ที่ใช้ในการแจกจ่าย เพื่อให้ผู้ใช้ที่ไม่มีสิทธิพิเศษสามารถดำเนินการที่ต้องใช้สิทธิ์การเข้าถึงระดับสูง ช่องโหว่ดังกล่าวทำให้ผู้ใช้ภายในเครื่องที่ไม่มีสิทธิ์เพิ่มสิทธิ์ในการรูทและเข้าควบคุมระบบได้เต็มรูปแบบ ปัญหานี้มีชื่อรหัสว่า PwnKit และมีความโดดเด่นในการสร้างช่องโหว่ที่ทำงานในการกำหนดค่าเริ่มต้นบนลีนุกซ์ส่วนใหญ่

ปัญหานี้มีอยู่ในยูทิลิตี้ pkexec ของ PolKit ซึ่งมาพร้อมกับแฟล็กรูท SUID และได้รับการออกแบบให้รันคำสั่งด้วยสิทธิ์ของผู้ใช้รายอื่นตามกฎของ PolKit ที่ระบุ เนื่องจากการจัดการอาร์กิวเมนต์บรรทัดคำสั่งที่ส่งไปยัง pkexec ไม่ถูกต้อง ผู้ใช้ที่ไม่มีสิทธิ์สามารถข้ามการตรวจสอบสิทธิ์และเรียกใช้โค้ดในฐานะรูทได้ โดยไม่คำนึงถึงกฎการเข้าถึงที่ตั้งไว้ สำหรับการโจมตีไม่ว่าจะระบุการตั้งค่าและข้อ จำกัด ใดใน PolKit ก็เพียงพอแล้วที่แอตทริบิวต์รูท SUID จะถูกตั้งค่าสำหรับไฟล์ปฏิบัติการด้วยยูทิลิตี้ pkexec

Pkexec ไม่ตรวจสอบความถูกต้องของจำนวนอาร์กิวเมนต์บรรทัดคำสั่ง (argc) ที่ส่งผ่านเมื่อเริ่มต้นกระบวนการ นักพัฒนา pkexec สันนิษฐานว่ารายการแรกในอาร์เรย์ argv จะมีชื่อของกระบวนการ (pkexec) เสมอ และรายการที่สองอาจเป็นค่า NULL หรือชื่อของคำสั่งที่เรียกใช้ผ่าน pkexec เนื่องจากจำนวนอาร์กิวเมนต์ไม่ได้ตรวจสอบกับเนื้อหาจริงของอาร์เรย์ และถือว่ามากกว่า 1 เสมอ หากกระบวนการถูกส่งผ่านอาร์เรย์ argv ว่าง ตามที่ฟังก์ชัน execve ของ Linux อนุญาต pkexec จะถือว่า NULL เป็นอาร์กิวเมนต์แรก ( ชื่อกระบวนการ) และอันถัดไปที่อยู่นอกหน่วยความจำบัฟเฟอร์ เช่นเดียวกับเนื้อหาที่ตามมาของอาร์เรย์ |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "โปรแกรม" "-ตัวเลือก" NULL "ค่า" "PATH = ชื่อ" NULL

ปัญหาคือหลังจากอาร์เรย์ argv จะมีอาร์เรย์ envp ในหน่วยความจำที่มีตัวแปรสภาพแวดล้อม ดังนั้น หากอาร์เรย์ argv ว่างเปล่า pkexec จะแยกข้อมูลเกี่ยวกับคำสั่งที่รันด้วยสิทธิพิเศษระดับสูงจากองค์ประกอบแรกของอาร์เรย์ที่มีตัวแปรสภาพแวดล้อม (argv[1] กลายเป็นเหมือนกับ envp[0]) ซึ่งเนื้อหาสามารถควบคุมได้ โดยผู้โจมตี

เมื่อได้รับค่า argv[1] แล้ว pkexec จะพยายามโดยคำนึงถึงเส้นทางของไฟล์ใน PATH เพื่อกำหนดเส้นทางแบบเต็มไปยังไฟล์ปฏิบัติการและเขียนตัวชี้ไปยังสตริงด้วยเส้นทางแบบเต็มกลับไปที่ argv[1] ซึ่ง นำไปสู่การเขียนทับค่าของตัวแปรสภาพแวดล้อมแรก เนื่องจาก argv[ 1] เหมือนกับ envp[0] ด้วยการจัดการชื่อของตัวแปรสภาพแวดล้อมแรก ผู้โจมตีสามารถแทนที่ตัวแปรสภาพแวดล้อมอื่นใน pkexec ได้ เช่น แทนที่ตัวแปรสภาพแวดล้อม “LD_PRELOAD” ซึ่งไม่ได้รับอนุญาตในโปรแกรม suid และจัดเตรียมไลบรารีที่แชร์ของพวกเขาให้โหลดลงใน กระบวนการ.

ช่องโหว่การทำงานเกี่ยวข้องกับการแทนที่ตัวแปร GCONV_PATH ซึ่งใช้ในการกำหนดเส้นทางไปยังไลบรารีการแปลงรหัสสัญลักษณ์ ซึ่งจะโหลดแบบไดนามิกเมื่อเรียกใช้ฟังก์ชัน g_printerr() ซึ่งเป็นโค้ดที่ใช้ iconv_open() ด้วยการกำหนดเส้นทางใหม่ใน GCONV_PATH ผู้โจมตีสามารถมั่นใจได้ว่าไม่ใช่ไลบรารี iconv มาตรฐานที่โหลด แต่เป็นไลบรารีของตัวเอง ซึ่งเป็นตัวจัดการที่จะดำเนินการเมื่อมีข้อความแสดงข้อผิดพลาดปรากฏขึ้นในขั้นตอนที่ pkexec ยังคงทำงานอยู่ สิทธิ์รูทและก่อนที่จะตรวจสอบสิทธิ์การเปิดตัว

มีข้อสังเกตว่าแม้ว่าปัญหาจะเกิดจากความเสียหายของหน่วยความจำ แต่ก็สามารถถูกโจมตีได้อย่างน่าเชื่อถือและทำซ้ำได้โดยไม่คำนึงถึงสถาปัตยกรรมฮาร์ดแวร์ที่ใช้ การใช้ประโยชน์ที่เตรียมไว้ได้รับการทดสอบบน Ubuntu, Debian, Fedora และ CentOS เรียบร้อยแล้ว แต่ยังสามารถนำไปใช้กับการแจกแจงอื่น ๆ ได้อีกด้วย การใช้ประโยชน์ดั้งเดิมยังไม่เปิดเผยต่อสาธารณะ ซึ่งบ่งชี้ว่าเป็นเรื่องเล็กน้อยและนักวิจัยคนอื่น ๆ สามารถสร้างขึ้นใหม่ได้อย่างง่ายดาย ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องติดตั้งการอัปเดตแพตช์โดยเร็วที่สุดบนระบบที่มีผู้ใช้หลายคน Polkit พร้อมใช้งานสำหรับระบบ BSD และ Solaris แต่ยังไม่ได้รับการศึกษาเพื่อใช้กับระบบเหล่านี้ สิ่งที่ทราบก็คือ การโจมตีไม่สามารถทำได้บน OpenBSD เนื่องจากเคอร์เนล OpenBSD ไม่อนุญาตให้ส่งค่า argc ที่เป็นโมฆะเมื่อเรียกใช้ execve()

ปัญหาเกิดขึ้นตั้งแต่เดือนพฤษภาคม 2009 นับตั้งแต่มีการเพิ่มคำสั่ง pkexec ขณะนี้การแก้ไขช่องโหว่ PolKit มีให้บริการในรูปแบบแพตช์ (ยังไม่มีการเผยแพร่แพตช์) แต่เนื่องจากนักพัฒนาซอฟต์แวร์ได้รับแจ้งปัญหาล่วงหน้า การกระจายส่วนใหญ่จึงเผยแพร่การอัปเดตพร้อมกันกับการเปิดเผยข้อมูลเกี่ยวกับช่องโหว่ ปัญหานี้ได้รับการแก้ไขแล้วใน RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux และ Manjaro เพื่อเป็นมาตรการชั่วคราวเพื่อป้องกันช่องโหว่ คุณสามารถลบแฟล็กรูท SUID ออกจากโปรแกรม /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”)



ที่มา: opennet.ru

เพิ่มความคิดเห็น