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 ให้เหมาะสม ดังนี้

  1. เป็นแนวทางที่ถูกพูดถึงโดย Qualys ไว้ใน Security advisory โดยอาศัยการทำงานของฟังก์ชัน g_printerr() ภายใต้ฟังก์ชัน validate_environment_variable() การใช้ฟังก์ชันนี้เพื่อโจมตีช่องโหว่จะต้องมีการกำหนดค่าในตัวแปร environment variables SHELL หรือ XAUTHORITY เพื่อให้เป็นไปตามเงื่อนไขที่เหมาะสม อย่างไรก็ตามแนวทางนี้จะทำให้เกิด log ปรากฎอยู่ใน syslog ตัวอย่างของแนวทางนี้ อาทิ dzonerzy/poc-cve-2021-4034, ly4k/PwnKit และ arthepsy/CVE-2021-4034
  2. แนวทางที่สองเป็นแนวทางที่ 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 ในแนวทางที่สอง การตรวจจับการโจมตีช่องโหว่หากเกิดขึ้นไปแล้วอาจต้องอาศัยข้อมูลบ่งชี้อื่นๆ เพื่อเข้ามาช่วยระบุหาแทน