¿Por qué un programa llamado "C: \ Program" puede influir en otros programas?

16

Hoy, de la nada, Programapareció un archivo llamado en la raíz de C:\, y al iniciar sesión en el sistema, una ventana emergente muestra un mensaje:

Advertencia de nombre de archivo

Hay un archivo o carpeta en su computadora llamado "C: \ Program" que podría causar que ciertas aplicaciones no funcionen correctamente. Cambiarle el nombre a "C: \ Program1" resolvería el problema. ¿Quieres cambiarle el nombre ahora?

Si bien el mensaje se explica por sí mismo, me pregunto por qué este archivo podría tener una influencia tan grande. De hecho, algunos de los programas (tal vez todos, no verifiqué) ubicados en C:\Program Files...no comenzaron en absoluto. Puedo entender cómo se puede crear dicho archivo (por ejemplo, tratando de escribir en la carpeta C:\Program Files\Something...pero sin comillas), pero apenas entiendo cómo puede afectar a otros programas.

Konrad Kokosa
fuente
1
¿Estás seguro de que este fue un mensaje generado por Windows?
Ramhound
1
Yeap, comprobado dos veces desde Process Exploer, fue un diálogo de explorer.exe
Konrad Kokosa
2
Suena incompleto, ningún programa (fuera de unos pocos seleccionados) debe instalarse en otro lugar que no sea Program Files* para el consumidor típico. Pero creo que es porque una mala coincidencia para una búsqueda podría encontrar eso en lugar de Program Files.
nerdwaller

Respuestas:

27

Tiene una gran influencia debido a una debilidad conocida en la API de Win32.

Los programas se generan en Win32 a través de la CreateProcess()llamada al sistema. Se puede usar de varias maneras. Las personas que provienen de entornos Unix, Linux u OS / 2 generalmente pensarán que toma dos argumentos separados para que el programa (archivo de imagen) se reproduzca y la cola del comando pase al nuevo proceso, porque los nombres de archivo y los vectores de argumentos / colas de comando son dos cosas separadas en las API de esos sistemas operativos. Pero, de hecho, la llamada al sistema puede invocarse en una forma alternativa con el nombre del programa y los argumentos combinados en una gran cadena. CreateProcess()intentará separar el nombre del archivo del programa de la cola del comando.

El problema es que hace esto dividiendo progresivamente la cadena en dos en cada carácter de espacio sucesivo, hasta que la porción de la izquierda coincida con un archivo o un directorio. Muchos programas Win32 intentarán pasar cadenas como C:\Program Files\Contoso\TakeOver.exe StackExchange.comla llamada al sistema. Esto ejecutará el programa correcto C:\Program Files\Contoso\TakeOver.exe- con la cola de comando correcta StackExchange.com- hasta el punto en que aparezca una persona obviamente peligrosa y cree un C:\Programarchivo tal como lo hizo usted.

En ese punto, la llamada al sistema termina intentando ejecutar el archivo de imagen del programa C:\Programcon la cola del comando Files\Contoso\TakeOver.exe StackExchange.com. El cielo te ayudará si C:\Programde hecho es una imagen de programa ejecutable.

Esta es una debilidad general, y se aplica a cualquier nombre de archivo de programa que contenga espacios en combinación con cualquier programa que use One Big String para generar otros programas. Pero el caso más común que se ve afectado por esto son todos los programas que viven C:\Program Files\y una gran cantidad de programas Win32 que utilizan el enfoque One Big String.

Es demasiado tarde para cambiar la API de Win32. Era demasiado tarde hace una década. Y Microsoft no puede cambiar todos los programas escritos por otras personas que pasan una cadena grande en lugar de dos CreateProcess(). Por lo tanto, Microsoft hace que Windows verifique, al inicio de sesión del usuario, la existencia C:\Programy muestra la advertencia que ve.

Y, como puede ver, hay una gran advertencia de "Seguridad" en el documento de Win32 de Microsoft que le dice a los desarrolladores que no escriban programas utilizando el enfoque One Big String, que ha estado allí durante algunos años.

Otras lecturas

JdeBP
fuente
66
Excelente respuesta! Como soy desarrollador, lo siguiente que haré es obviamente crear un ficticio C:\Program.exeque registre todos sus parámetros de línea de comandos. ¡Veremos quién lo usa!
Konrad Kokosa
1
Así que esta es la razón por la configuración de seguridad predeterminada desde XP no permiten la creación de archivos en la raíz de los no administradores.
kinokijuf