วิเคราะห์ช่องโหว่ Zip Slip: แตกไฟล์บีบอัดแล้วถูกแฮ็กได้โดยไม่รู้ตัว

สรุปย่อ

ทีมนักวิจัยด้านความปลอดภัยจากบริษัท Snyk ได้ออกมาเปิดเผยช่องโหว่ใหม่ภายใต้ชื่อ Zip Slip โดยการโจมตีช่องโหว่ดังกล่าวนั้นอาจทำให้เหยื่อทำการรันโค้ดอันตรายโดยไม่รู้ตัวเมื่อทำการคลายการบีบอัดหรือแตกไฟล์บีบอัดซึ่งถูกสร้างมาอย่างเฉพาะเจาะจง และนำไปสู่ความเสี่ยงต่อคุณสมบัติด้านความปลอดภัยในระบบได้

รายละเอียดช่องโหว่

ช่องโหว่ Zip Slip มีที่มาจากปัญหาของการไม่ตรวจสอบค่านำเข้าของไลบรารีที่ทำหน้าที่ในการคลายการบีบอัดของไฟล์อย่างถี่ถ้วน อีกทั้งไม่มีการทำไลบรารีกลางซึ่งมีความปลอดภัยมากพอในการจัดการกับไฟล์บีบอัด ส่งผลให้เกิดการพัฒนาซอฟต์แวร์หรือการเผยแพร่โค้ดต่างๆ ที่ทำงานได้แต่ไม่มีความปลอดภัย ซึ่งทำให้ผู้โจมตีสามารถใช้ช่องโหว่ดังกล่าวในการทำให้เกิดการลักษณะการโจมตีที่เรียกว่า Directory Traversal ซึ่งอาจนำไปสู่การรันโค้ดที่เป็นอันตรายจากระยะไกลได้ (Remote Code Execution)

ช่องโหว่ Zip Slip นั้นถูกตรวจพบในไลบารีในภาษาโปรแกรมมิ่งหลายภาษา อาทิ JavaScript, Ruby, .NET และ Go รวมไปถึง Java ซึ่งมีการใช้โค้ดที่มีช่องโหว่เป็นจำนวนมาก ตัวอย่างหนึ่งของโค้ดที่มีช่องโหว่ในภาษา Java มีตามตัวอย่างด้านล่าง

Enumeration<ZipEntry> entries = zip.getEntries();
while (entries.hasMoreElements()) {
    ZipEntry e = entries.nextElement();
    File f = new File(destinationDir, e.getName());
    InputStream input = zip.getInputStream(e);
    IOUtils.copy(input, write(f));
}

จากตัวอย่างของโค้ดที่มีช่องโหว่ Zip Slip ในภาษา Java ด้านบนซึ่งจะสังเกตเห็นได้ว่าในบรรทัดที่ถูกเน้นตัวเข้มนั้น ออบเจ็กต์ f ซึ่งถูกสร้างจากคลาส File จะทำหน้าที่ในการรอรับการอ่าน/เขียนข้อมูลลงไปในไฟล์ซึ่งจะมีชื่อตามชื่อไฟล์ที่ถูกบีบอัดจาก e.getName() ซึ่งอยู่ในพาธตามที่ระบุไว้ในตัวแปร destinationDir

หาก destinationDir ถูกกำหนดไว้เป็นพาธ /var/www/website/files/ และไฟล์ที่ถูกบีบอัดนั้นมีชื่อเป็น Image.png โค้ดชุดดังกล่าวจะทำการคลายการบีบอัดของไฟล์และนำไฟล์ Image.png ไปวางไว้ที่ตำแหน่ง /var/www/website/files/

ช่องโหว่ Zip Slip จะถูกโจมตีเมื่อชื่อไฟล์ที่โค้ดชุดด้านบนทำการเขียนข้อมูลหลังจากคลายการบีบอัดไฟล์ทำให้เกิดการเขียนไฟล์ที่อยู่นอกเหนือขอบเขตที่กำหนด ไฟล์บีบอัดที่สามารถใช้ในการโจมตีช่องโหว่ได้จะต้องประกอบด้วยไฟล์ภายในตามตัวอย่างด้านล่าง

5 Tue Jun 5 11:04:29 BST 2018 good.sh
20 Tue Jun 5 11:04:42 BST 2018 ../../../../tmp/evil.sh

จะสังเกตได้ว่าเมื่อโค้ดที่มีช่องโหว่นั้นทำการคลายการบีบอัดไฟล์ evil.sh โค้ดจะทำการเขียนไฟล์ใหม่ที่ตำแหน่ง destinationDir (ในกรณีนี้คือ /var/www/website/files) โดยใช้ชื่อไฟล์เป็น ../../../../tmp/evil.sh ซึ่งส่งผลให้เกิดการเขียนไฟล์ที่แท้จริงไว้ที่ตำแหน่ง /var/www/website/files/../../../../tmp/evil.sh หรือ /tmp/evil.sh เนื่องจาก ../ หมายถึงการถอยกลับไดเรกทอรีไปหนึ่งขั้น

ผลจากการเขียนไฟล์นอกเหนือขอบเขตที่กำหนดส่งผลให้ผู้โจมตีสามารถเขียนทับไฟล์ที่มีอยู่ในระบบหรือบังคับให้ระบบรันโค้ดที่เป็นอันตรายได้

ไลบรารีและซอฟต์แวร์ที่ได้รับผลกระทบ

คำแนะนำ

  • สำหรับนักพัฒนาแอปพลิเคชัน ให้ดำเนินการค้นหาส่วนของโค้ดที่มีช่องโหว่จากตัวอย่างดังต่อไปนี้ และดำเนินการเพิ่มส่วนในการตรวจสอบข้อมูลนำเข้าหรือทำการอัปเดตแพตช์หากเป็นไลบรารีของโครงการซอฟต์แวร์ใดๆ