Почему программа с именем «C: \ Program» может влиять на другие программы?

16

Сегодня совершенно неожиданно в Programкорне появился файл с именем C:\, и при входе в систему всплывающее окно показывает сообщение:

Имя файла Предупреждение

На вашем компьютере есть файл или папка с именем «C: \ Program», что может привести к некорректной работе некоторых приложений. Переименование его в «C: \ Program1» решило бы проблему. Хотите переименовать его сейчас?

Хотя сообщение самоочевидно, мне интересно, почему этот файл может иметь такое большое влияние? Действительно, некоторые программы (может быть, все, которые я не проверял), расположенные в, C:\Program Files...не запускались вообще. Я могу понять, как можно создать такой файл (например, при попытке записи в папку, C:\Program Files\Something...но без кавычек), но я не понимаю, как он может повлиять на другие программы.

Конрад Кокоса
источник
1
Вы уверены, что это сообщение было сгенерировано Windows?
Ramhound
1
Да, дважды проверил из Process Explorer, это был диалог от explorer.exe
Конрад Кокоса,
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с помощью команды tail 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и выдает предупреждение, которое вы видите.

И, как вы можете видеть, в документе Microsoft Win32 есть серьезное предупреждение «Безопасность», в котором говорится, что разработчики не должны писать программы с использованием подхода One Big String, который существует уже несколько лет.

дальнейшее чтение

JdeBP
источник
6
Отличный ответ! Поскольку я являюсь разработчиком, следующее, что я сделаю, - это, очевидно, создание фиктивного файла, в C:\Program.exeкотором будут записываться все параметры командной строки. Посмотрим, кто его использует!
Конрад Кокоса
1
Так это почему настройки безопасности по умолчанию начиная с XP не позволяют создавать файлы в корне , не являющимися администраторами.
kinokijuf