มันมีอิทธิพลอย่างมากเนื่องจากจุดอ่อนที่รู้จักกันมานานใน Win32 API
โปรแกรมจะเกิดใน Win32 ผ่านการCreateProcess()
เรียกระบบ สามารถใช้งานได้หลายวิธี คนที่มาจากพื้นหลัง Unix, Linux หรือ OS / 2 มักจะคิดว่ามันเป็นสองข้อโต้แย้งที่แยกต่างหากสำหรับโปรแกรม (ไฟล์ภาพ) เพื่อวางไข่และหางคำสั่งที่จะผ่านไปยังกระบวนการใหม่เพราะชื่อไฟล์และอาร์กิวเมนต์เวกเตอร์ / คำสั่งหาง เป็นสองสิ่งที่แยกกันใน API ของระบบปฏิบัติการเหล่านั้น แต่ในความเป็นจริงการเรียกของระบบสามารถถูกเรียกใช้ในรูปแบบทางเลือกที่มีชื่อโปรแกรมและการขัดแย้งกันในสตริงขนาดใหญ่ CreateProcess()
จะพยายามแยกชื่อไฟล์ของโปรแกรมออกจากหางคำสั่ง
ปัญหาคือการทำเช่นนี้โดยการแบ่งสตริงออกเป็นสองส่วนอย่างต่อเนื่องที่อักขระแต่ละตัวที่ต่อเนื่องกันจนกระทั่งส่วนทางซ้ายตรงกับไฟล์หรือไดเรกทอรี โปรแกรม Win32 หลายตัวจะพยายามส่งผ่านสตริงเช่นเดียวC:\Program Files\Contoso\TakeOver.exe StackExchange.com
กับการเรียกระบบ สิ่งนี้จะรันโปรแกรมที่ถูกต้อง - C:\Program Files\Contoso\TakeOver.exe
- ด้วยหางคำสั่งที่ถูกต้อง - StackExchange.com
- จนถึงจุดที่บางคนที่อันตรายเห็นได้ชัดมาพร้อมและสร้างC:\Program
ไฟล์เหมือนที่คุณทำ
ณ จุดที่เรียกระบบลงท้ายพยายามที่จะเรียกใช้ไฟล์ภาพโปรแกรมกับหางคำสั่งC:\Program
Files\Contoso\TakeOver.exe StackExchange.com
สวรรค์ช่วยคุณถ้าC:\Program
ในความเป็นจริงเป็นรูปโปรแกรมที่ปฏิบัติการได้
นี่เป็นจุดอ่อนทั่วไปและจะใช้กับชื่อไฟล์โปรแกรมใด ๆ ที่มีช่องว่างร่วมกับโปรแกรมใด ๆ ที่ใช้ One Big String เพื่อวางไข่โปรแกรมอื่น ๆ แต่กรณีที่พบบ่อยที่สุดที่ถูกโจมตีโดยสิ่งนี้คือโปรแกรมทั้งหมดที่อยู่ภายใต้C:\Program Files\
และโปรแกรม Win32 จำนวนมากที่ใช้วิธี One Big String
มันสายเกินไปที่จะเปลี่ยน Win32 API มันสายเกินไปเมื่อสิบปีก่อน และ Microsoft ไม่สามารถเปลี่ยนโปรแกรมทั้งหมดที่เขียนโดยบุคคลอื่นที่ส่งผ่านสตริงขนาดใหญ่หนึ่งรายการแทนที่จะเป็นสองCreateProcess()
รายการเป็น ดังนั้น Microsoft จะทำการตรวจสอบ Windows เมื่อเข้าสู่ระบบของผู้ใช้สำหรับการมีอยู่C:\Program
และแสดงคำเตือนที่คุณเห็น
และอย่างที่คุณเห็นมีคำเตือน "ความปลอดภัย" ขนาดใหญ่ใน Win32 doco ของไมโครซอฟท์บอกนักพัฒนาว่าอย่าเขียนโปรแกรมโดยใช้วิธี One Big String ซึ่งมีมานานหลายปีแล้ว
อ่านเพิ่มเติม