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
- função CreateProcess () . MSDN. Corporação Microsoft.
- Raymond Chen (2011-08-08). O que faz a função CreateProcess se não houver espaço entre o nome do programa? e os argumentos? . OldNewThing.
- Rajorshi (2009-05-13). Vulnerabilidades do CreateProcess . Documentos do desenvolvedor.
- 2005-11-15. Aviso de Segurança: Chamada Insegura do Fornecedor Múltiplo para a Vulnerabilidade do CreateProcess () . iDEFENSE.