เหตุใดโปรแกรมชื่อ“ C: \ Program” จึงมีผลต่อโปรแกรมอื่น ๆ


16

ทุกวันนี้ไฟล์ที่เรียกว่าสีน้ำเงินProgramปรากฏขึ้นที่รากของC:\และเมื่อเข้าสู่ระบบป๊อปอัพจะแสดงข้อความ:

คำเตือนชื่อไฟล์

มีไฟล์หรือโฟลเดอร์ในคอมพิวเตอร์ของคุณชื่อ "C: \ Program" ซึ่งอาจทำให้แอปพลิเคชันบางอย่างทำงานไม่ถูกต้อง การเปลี่ยนชื่อเป็น "C: \ Program1" จะช่วยแก้ปัญหาได้ คุณต้องการเปลี่ยนชื่อตอนนี้หรือไม่

ในขณะที่ข้อความอธิบายตนเองฉันสงสัยว่าทำไมไฟล์นี้ถึงมีอิทธิพลอย่างมาก แน่นอนบางโปรแกรม (อาจจะทั้งหมดฉันไม่ได้ตรวจสอบ) ตั้งอยู่ในC:\Program Files...ก็ไม่ได้เริ่มเลย ฉันสามารถเข้าใจวิธีการสร้างไฟล์ดังกล่าว (ตัวอย่างเช่นพยายามเขียนไปยังโฟลเดอร์C:\Program Files\Something...แต่ไม่มีเครื่องหมายคำพูด) แต่ฉันแทบจะไม่เข้าใจว่าจะมีผลกับโปรแกรมอื่นอย่างไร


1
คุณแน่ใจหรือว่านี่เป็นข้อความที่สร้างโดย Windows?
Ramhound

1
ใช่ตรวจสอบซ้ำจาก Process Exploer เป็นไดอะล็อกจาก explorer.exe
Konrad Kokosa

2
ฟังดูร่างไม่ควรติดตั้งโปรแกรม (นอกจำนวนที่เลือก) จากที่อื่นProgram Files* สำหรับผู้ใช้ทั่วไป Program Filesแต่ฉันคิดว่ามันเป็นเพราะการจับคู่ที่ไม่ดีสำหรับการค้นหาอาจพบว่าแทน
nerdwaller

คำตอบ:


27

มันมีอิทธิพลอย่างมากเนื่องจากจุดอ่อนที่รู้จักกันมานานใน 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 ซึ่งมีมานานหลายปีแล้ว

อ่านเพิ่มเติม


6
คำตอบที่ยอดเยี่ยม! ในฐานะที่ฉันเป็นนักพัฒนาสิ่งต่อไปที่ฉันจะทำคือการสร้างหุ่นจำลองC:\Program.exeที่บันทึกพารามิเตอร์บรรทัดคำสั่งทั้งหมด เราจะดูว่าใครใช้มัน!
Konrad Kokosa

1
ดังนั้นนี่คือสาเหตุที่การตั้งค่าความปลอดภัยเริ่มต้นตั้งแต่ XP ไม่อนุญาตให้สร้างไฟล์ในรูทโดยผู้ดูแลระบบ
kinokijuf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.