CVE-2021-4034 — PwnKit
Vulnerability
CVE-2021-4034 เป็นช่องโหว่ซึ่งเกิดจากพฤติกรรมการอ่านค่าและการเรียกใช้ข้อมูลที่อยู่นอกเหนือขอบเขตที่ควรจะเป็น (out-of-bounds) ของโปรแกรม pkexec ซึ่งทำให้ช่องโหว่สามารถถูกนำมาใช้เพื่อยกระดับสิทธิ์ได้อันเนื่องจากสิทธิ์ของการมีบิต SUID ของ pkexec
การพัฒนาโค้ดเพื่อโจมตีช่องโหว่ CVE-2021-4034 มีองค์ประกอบอยู่ 2 ส่วน โดยทั้ง 2 ส่วนนี้ได้ถูกพูดถึงไปแล้วโดย Qualys ซึ่งเป็นผู้ค้นพบช่องโหว่เอง ส่วนหนึ่งขององค์ประกอบคือ exploit primitive ที่พูดถึงปัญหาของการเรียกใช้อากิวเมนต์ argv[1]
ซึ่งไม่มีอยู่จริงหากมีการระบุอากิวเมนต์ให้กับ pkexec เพียงอากิวเมนต์เดียว และทำให้เกิดเงื่อนไขการเรียกใช้ (ทั้งอ่านและเขียน) แบบ out-of-bonds
องค์ประกอบอีกส่วนหนึ่งคือ exploit technique โดยถูกระบุผ่านการเรียกใช้โปรแกรมด้วยฟังก์ชันของระบบอย่าง execve()
หรือ execvep()
ในกรณีที่ไบนารี pkexec ไม่อยู่ในพาธภายใต้ environment variables การเรียกใช้ pkexec ด้วยฟังก์ชันทั้งสองทำให้เมื่อโปรแกรม pkexec ถูกเรียกใช้งาน ตำแหน่ง out-of-bounds ของ argv[1]
ในกรณีที่ไม่มีอากิวเมนต์นั้นจะกลายเป็นตำแหน่งของ envp[0]
แทน จากนั้นจึงอาศัยการเพิ่มตัวแปร environment variables ที่ไม่ปลอดภัยที่ปกติจะถูกนำออกเมื่อมีการเรียกใช้ไบนารีที่มีบิต SUID กลับเข้าไปใหม่แล้วใช้เงื่อนไขนี้ในการโจมตีช่องโหว่เมื่อโปรแกรมนำค่า envp[0]
ไปใช้จากการอ้างอิง argv[1]
Exploitation
แนวทางในการโจมตีช่องโหว่ที่ปรากฎในโค้ด PoC โดยส่วนใหญ่แล้วมีอยู่ 2 แนวทาง แนวทางทั้งหมดอาศัยการทำงานของฟังก์ชัน g_printerr()
ภายใต้เงื่อนไของการแปลง charset เมื่อต้องแสดงข้อความที่ไม่ใช่ UTF-8 และการเตรียมค่า GCONV_PATH
ที่เกี่ยวข้องกับกำหนดไฟล์การตั้งค่าให้กับฟังก์ชัน iconv_open()
ที่จะถูกเรียกใช้เพื่อแปลง charset ให้เหมาะสม ดังนี้
- เป็นแนวทางที่ถูกพูดถึงโดย Qualys ไว้ใน Security advisory โดยอาศัยการทำงานของฟังก์ชัน
g_printerr()
ภายใต้ฟังก์ชันvalidate_environment_variable()
การใช้ฟังก์ชันนี้เพื่อโจมตีช่องโหว่จะต้องมีการกำหนดค่าในตัวแปร environment variablesSHELL
หรือXAUTHORITY
เพื่อให้เป็นไปตามเงื่อนไขที่เหมาะสม อย่างไรก็ตามแนวทางนี้จะทำให้เกิด log ปรากฎอยู่ใน syslog ตัวอย่างของแนวทางนี้ อาทิ dzonerzy/poc-cve-2021-4034, ly4k/PwnKit และ arthepsy/CVE-2021-4034 - แนวทางที่สองเป็นแนวทางที่ Qualys บอกใบ้เอาไว้ว่าสามารถทำได้และไม่ทำให้เกิด log แนวทางนี้ปรากฎอยู่ในโค้ด PoC ของ Ayrx ซึ่งอาศัยอีกเงื่อนไขหนึ่งเพื่อเรียกใช้ฟังก์ชัน
g_printerr()
ภายใต้เงื่อนไขนี้ โค้ดสำหรับโจมตีช่องโหว่จะต้องมีการทำ race condition ด้วยเพื่อให้ค่าที่ผู้โจมตีกำหนดไว้ในGCONV_PATH
ถูกนำไปใช้ได้อย่างถูกต้อง
Detections
แนวทางในการตรวจจับการโจมตีช่องโหว่ CVE-2021-4034 ในปัจจุบันอาศัยการผสมกันของเงื่อนไขและปัจจัยที่จำเป็นต่อการโจมตี ณ ขณะที่เกิดข้นดังนี้
- มีพฤติกรรมการเกิดขึ้นใหม่ของโปรเซส pkexec จากบัญชีผู้ใช้งานที่ไม่ได้เป็น root
- ไม่มีการระบุอากิวเมนต์ให้กับการเรียกใช้ pkexec
- มีการปรากฎของตัวแปร
GCONV_PATH
ใน environment variables
ในกรณีที่มีการตรวจจับเกิดขึ้นในลักษณะเพื่อระบุหาการโจมตีช่องโหว่ที่อาจเกิดขึ้นไปแล้ว การระบุหาข้อความ The value for environment variable %s contains suscipious content
ตามตัวอย่างด้านล่างใน syslog ก็สามารถช่วยในการระบุหาการโจมตีช่องโหวในแนวทางแรกได้ (อ้างอิง CrowdSec)
Jan 27 13:03:43 ip-172-31-32-108 pkexec[25573]: centos: The value for the SHELL variable was not found the /etc/shells file [USER=root] [TTY=/dev/pts/1] [CWD=/home/centos/poc-cve-2021-4034-main] [COMMAND=GCONV_PATH=./gconv PATH=GCONV_PATH=. SHELL=/fake/shell CHARSET=payload]
แม้ว่าแนวทางในการโจมตีที่ถูกพูดถึงโดย Qualys จะทำให้เกิด log และสามารถถูกนำมาระบุหาการโจมตีช่องโหว่ได้หากการโจมตีได้เกิดขึ้นไปแล้ว แต่หากการโจมตีช่องโหว่เกิดขึ้นในเงื่อนไขที่ต้องทำ race condition หรือมีการใช้โค้ด PoC ในแนวทางที่สอง การตรวจจับการโจมตีช่องโหว่หากเกิดขึ้นไปแล้วอาจต้องอาศัยข้อมูลบ่งชี้อื่นๆ เพื่อเข้ามาช่วยระบุหาแทน