[Triangulo-pm] Res: Insegurança no Windows

Adriano Ferreira a.r.ferreira em gmail.com
Sexta Dezembro 15 04:08:07 PST 2006


Pessoal,

O Elias falou sobre a possibilidade de substituir maliciosamente o cmd
(o interpretador de comandos ou shell para Windows NT, 2000, XP, etc.)
O fato do Windows decidir o nome do executável na hora de executar o
comando é mais um fator potencial de insegurança. Se você executa
"cmd", ele vai procurar no mínimo por "cmd.com", "cmd.exe", "cmd.bat",
nesta ordem. E você ainda pode colocar mais sufixos nesta lista. Por
exemplo, na máquina onde estou o PATHEXT é

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.py;.pyc;.pyo;.pyw;.pys;.tcl

Quer dizer, ainda tem umas linguagens adicionais para você escrever
que são padrões para Windows (Visual Basic, JavaScript, e outros) e
ainda tem certas instalações que lhe fazem o favor de incluir ainda
mais extensões de arquivo ao problema. (Nota. ActiveState Perl pode
fazer isto também se você escolher na hora da instalação.)

Um exemplo de como fazer o usuário executar o seu comando sem querer é
colocar este falso cmd.bat no diretório do usuário. Se ele vai até o
"Iniciar | Executar" e digita "cmd", acaba invocando este script.

A busca do Windows é mais ou menos assim:
* olhe no diretório corrente
* procure uma combinação "comando" + extensão dentre as extensões do PATHEXT -
  na primeira encontrada, manda brasa
* se não encontrou, passe a fazer o mesmo em cada diretório no PATH, até
  encontrar ou desistir.

O problema é o "olhe no diretório corrente". Digamos que pensando em
segurança, você faz um programa que outros usuários vão executar e
constrange de alguma maneira a integridade do PATH (impedindo que
outros caminhos sejam inseridos) para que você saiba o que está
acontecendo (os programas sendo chamados). Considere a hipótese de que
o usuário TEM de usar este programa. Então ele entra no programa. Este
programa (principalmente se for complexo) pode entre outras coisas que
faz, invocar outros programas e, para evitar incômodos de
portabilidade, faz isto confiando no path para resolver comandos como
"perl", "acroreader", "iexplore", etc. Se você não encontrou também um
jeito de evitar que o usuário determine o diretório corrente, ele pode
fazer com que o seu programa "seguro" execute qualquer outro programa,
colocando um programa de mesmo nome no diretório corrente que o seu
programa invoca. É aqui que mora o perigo. Fica pior se ao confiar na
segurança do seu programa, você permite que em determinadas seções o
programa rode com diferentes privilégios. O programa malicioso pode de
repente se ver com estes privilégios.

Em Unix, não tem esta brecha. Ou está no PATH ou não está. Se tem
jeito de constranger o PATH para não ter coisas perigosas, então não
terá. Unix pode ser mal usado? Definitivamente. Mas mesmo queimando a
cachola com Windows, você pode acabar com um programa perigoso por
causa dos buracos de segurança no Windows como este encima do qual
comecei a discussão.

Obrigado ao Elias e ao Flávio pela continuação da discussão. Desculpem
pela demora na resposta.

Adriano.


On 12/12/06, Adriano Ferreira <a.r.ferreira at gmail.com> wrote:
> Em Windows, existe historicamente o mau hábito de buscar o arquivo
> executável primeiramente no diretório atual e depois no PATH. Em Unix,
> o diretório atual pode ser colocado no PATH -- quando o usuário assume
> o risco. Mas em Windows, esteja ou não no PATH, o diretório corrente
> vai ser usado.
>
> Por quê isto é inerentemente inseguro?


On 12/13/06, Flávio Fonseca <ff at dirpd.ufu.br> wrote:
> Particularmente eu abomino o windows, mas a coisa nao pode ser assim tão
> bagunçada. Infelizmente usuários linux quando vao para o mundo windows vivem
> segundo o mundo azul. Ou seja, no linux todos seguimos as recomendaçoes de
> não ficarmos usando usuário root. Se vc fizer isso no windows também isso vai
> mudar a história, vc nao consegue apagar tudo que ve pela frente. Por outro
> lado, se vc quiser jogar assim aplique as mesmas regras no linux: como root
> crie um arquivo /bin/ls com o conteúdo echo
> echo "Eu posso fazer o que eu quiser aqui!"
> chmod +755 /bin/ls
>
> Execute o comando ls de qquer lugar do linux, com qualquer usuário que ele vai
> imprimir o mesmo texto do windows.
>
> troque o comando echo acima para rm -rf / que vc vai ver seu sistema
> operacional desaparecer diante de seus olhos. Para garantir que qquer um pode
> detonar seu sistema faça um chmod +s /bin/ls. Assim até o linux fica igual o
> windows.
>
> Acho que nessa questão o que realmente pega é a educação ou mesmo
> adestramento. Quando usamos linux obedecemos as regras de segurança básicas.
> Quando usamos windows queremos com esse usuário poder fazer tudo, instalar
> qquer programa, mudar configuração, formatar , etc. Simplesmente sempre
> usamos o windows com o equivalente ROOT dele. Se vc usar o linux sempre como
> root vai aprender pelo método difícil. Salvo algumas distribuições mais
> estilo windows (como o antigo conectiva) que criava o alias para rm como rm
> -i a chance de fazer besteira no Linux é maior que no windows. sempre que vc
> faz um del *,* o window pergunta se vc tem certeza..., o linux nao!. Quando
> vc se arrepender será tarde demais. Vc nao instala nada no linux sem senha de
> root (a menos que seja no seu proprio home para vc usar e no windows isso
> também pode ser feito).
>
>   Concluindo: que para mim o windows é uma grande M***** é. Mas sou contra
> injustiças. Pesar dois fatos com medidas diferentes não é justo.  E
> reforçando mais uma vez: eu odeio windows!
>
> att.
>
> Flávio
>
> On Wednesday 13 December 2006 09:18, Elias Chacon wrote:
> > Se eu fizer um programinha em shell ( .bat ) chamado cmd com um del *.* e
> > colocá-lo no raiz, então ele será executado! Experimente...
> > O meu teste foi o seguinte:
> > Criei um cmd.bat no diretório do usuário atual. O conteúdo:
> > @echo off
> > echo "Eu posso fazer o que eu quiser aqui!"
> > Se você mandar um Iniciar->Executar->CMD... Voilá!
> > Eu posso fazer o que eu quiser aqui!


Mais detalhes sobre a lista de discussão Triangulo-pm