Por que um programa chamado “C: \ Program” influencia outros programas?

14

Hoje, fora do azul, um arquivo chamado Program apareceu na raiz de C:\ e, ao fazer login no sistema, um pop-up mostra uma mensagem:

File Name Warning

There is a file or folder on your computer called "C:\Program" which could cause certain applications to not function correctly. Renaming it to "C:\Program1" would solve the problem. Would you like to rename it now?

Enquanto a mensagem é auto-explicativa, eu me pergunto por que esse arquivo pode ter uma influência tão grande? De fato, alguns dos programas (talvez todos, não chequei) localizados em C:\Program Files... não estavam sendo iniciados. Eu posso entender como esse arquivo pode ser criado (por exemplo, tentando gravar na pasta C:\Program Files\Something... , mas sem aspas), mas eu mal entendo como isso pode impactar outros programas.

    
por Konrad Kokosa 24.01.2014 / 15:48

1 resposta

25

Tem uma influência tão grande devido a uma fraqueza conhecida há muito tempo na API do Win32.

Os programas são gerados no Win32 por meio da chamada do sistema CreateProcess() . Pode ser usado de várias maneiras. As pessoas que vêm de origens Unix, Linux ou OS / 2 normalmente pensarão nele como tendo dois argumentos separados para o programa (arquivo de imagem) para gerar e o comando tail para passar para o novo processo, porque nomes de arquivos e argumentos vetores / caudas de comando são duas coisas separadas nas APIs desses sistemas operacionais. Mas, na verdade, a chamada do sistema pode ser invocada de uma forma alternativa, com o nome do programa e os argumentos unidos em uma grande cadeia. CreateProcess() tentará separar o nome do arquivo do programa da cauda do comando.

O problema é que ele faz isso dividindo progressivamente a string em dois em cada caractere de espaço sucessivo, até que a parte esquerda corresponda a um arquivo ou diretório. Muitos programas Win32 tentará passar seqüências de caracteres como C:\Program Files\Contoso\TakeOver.exe StackExchange.com para a chamada do sistema. Isso executará o programa correto - C:\Program Files\Contoso\TakeOver.exe - com a cauda do comando à direita - StackExchange.com - até o ponto em que uma pessoa obviamente perigosa aparecer e criar um arquivo C:\Program como você fez.

Nesse ponto, a chamada do sistema acaba tentando executar o arquivo de imagem do programa C:\Program com o comando tail Files\Contoso\TakeOver.exe StackExchange.com . O céu te ajuda se C:\Program é de fato uma imagem de programa executável.

Esta é uma fraqueza geral e se aplica a qualquer nome de arquivo de programa contendo espaços em combinação com qualquer programa que use One Big String para gerar outros programas. Mas o caso mais comum que é atingido por este é todos os programas que vivem sob C:\Program Files\ e um grande número de programas Win32 que usam a abordagem One Big String.

É tarde demais para alterar a API do Win32. Já era tarde demais há uma década. E a Microsoft não pode alterar todos os programas escritos por outras pessoas que transmitem uma string grande em vez de duas para CreateProcess() . Portanto, a Microsoft faz o Windows verificar, no logon do usuário, a existência de C:\Program e exibir o aviso que você vê.

E, como você pode ver, há um grande aviso de "Segurança" no documento Win32 da Microsoft dizendo que os desenvolvedores não escrevam programas usando a abordagem One Big String, que existe há alguns anos.

Leitura adicional

por 24.01.2014 / 17:10