FALHA DE SEGURANCA NO VB E OS 95/98/ME

USUARIO.EXCLUIDOS 11/05/2006 09:58:52
#146111
Há algum tempo atraz postei um exemplo de como salvar e recuperar a senha em um formulário...



Já vi centenas (em certo tempo até eu) de programadores que costumam escrever rotinas semelhantes a essa, deixando opções para salvar senhas e ou conteúdo secreto.

A questão é que recentemente, analizando e estudando as famosas APIS que o tio bil deixou para implementar rotinas com nossos OS, descobri que em versões do windows como 95/98/ME e em programas feitos em VB em qualquer sistema OPERACIONAL (inclusive o WINXP,2003) é possível atravez das APIS "SendMessage", "FindWindow" e "GetWindow" ler o conteúdo de qualquer TEXTBOX (COM PASSWORDCHAR ou NÃO), Label, CommandButton, de qualquer EXE!

Nos referidos OS que citei acima, é possível ler o conteúdo de qualquer controle de qualquer aplicativo.

Já no XP/2003 em campos do tipo senha (passwordchar) não é possível ler, porém, um programa feito em vb, rodando em winxp é totalmente vulneravel, com um raio x, você ve até o que não pode rss.

E claro que como você, eu também já tinha visto alguns programinhas indecentes que já faziam isso, agora algo como citado acima, com poucas linhas de código e com o uso destas duas simples APIS me revoltou...

Com a api "FindWindow" você pode achar o handle de qualquer aplicativo no sistema pelo nome do aplicativo, pelo caption do aplicativo e etc.

Com a api "GetWindow" você pode achar todos os handles de todos os controles (Com as principais propriedades com CAPTION e TEXT) de uma janela ativa, de um aplicativo aberto.

De posse do handle de um determinado controle, com a api "SendMessage" você pode ler o conteúdo de qualquer controle, mesmo que o mesmo esteja invisivel (visible = false)

E pronto... em pouco segundos tudo está feito, estamos diante de mais uma das MAZELAS que o tio bil sempre apronta para nós.
[S28]

Não coloque informações SECRETAS E/OU DE ALTA SEGURANÇA em Controles no VB!

Rsss
LUIS.HERRERA 11/05/2006 15:05:15
#146177
E o UserControl como foi feito?
LUIS.HERRERA 11/05/2006 16:33:58
#146192
Testei Webmaster e mesmo com o usercontrol continua reconhecendo os caracteres digitados.

Uma coisa eu sei, se tem como EXIBIR, tem como OCULTAR, isso é fato. Agora cabe a nós descobrir como.

Vamos lá galera, isso sim é um desafio.

Nota: Lembren-se que as vezes a solução é mais ridícula do que se pode imaginar.

Que a força esteja com todos nós.
LUIS.HERRERA 11/05/2006 17:04:12
#146195
Minhas tentativas:
caminhos:

1) hWnd
Sei que existem controles que possui um hWnd e outros que não possuem. Como se define um hWnd para um componente?

Exemplo: o OCX do Flash (macromedia atual ADOBE) não possui um hWnd, ao menos documentado. Porém trata-se de uma janela que o navegador reconhece, o próprio VB também, mas não se consegue capturar seu hWnd, pois essa propriedade não existe como disse no componente, só se estiver oculta e com acesso restrito de alguma forma.


2) Label (Usercontrol)
O objeto Label, pela função enviada pelo Webmaster, não é reconhecido pela API, então a string de seu Caption não é exibida.

Sendo assim tentei implementar um label no lugar do texbox com a aparencia (borda e backcolor) = textbox, mas ele não tem as propriedades gotfocus (para piscar o cursor e digitar textos dentro).

Então pensei em criar um textbox oculto junto no usercontrol, onde a cada tecla digitada eu concatenaria no label.caption e apagaria o textbox.text. Se fosse pressionado (backspace), excluiria o último caracter da string label.caption.

Problemas:
- como representaria o cursor piscando no label?
- como passaria o foco para o textbox oculto no usercontrol, quando este recebe-se o foco e como poderia receber esse foco no usercontrol?

Se isso acima fosse possível, acho que teria outro problema, pois se o controle mesmo oculto pode ser identificado e seu conteúdo capturado, acho que só complicaria um pouco, mas não resolveria.

3) Criar novo Objeto
Como se cria um TextBox?
é possível criar uma estrutura semelhante sem usar o componente original do VB?

USUARIO.EXCLUIDOS 11/05/2006 17:26:49
#146196
Boa lebre web, já tinha pensado nisso...

Outra boa alternativa é carregar e salvar senhas em variáveis publicas, ao validar se o campo senha estiver vazio porém a referida variável não, use a senha da variável, pode se usar um label para indicar que a senha está salva e será usada...

Ou também poderiamos trilhar pelo caminho do teclado virtual (Dica do WCOSTA)
E deixar de usar opções como "Lembrar senha" e etc.
USUARIO.EXCLUIDOS 11/05/2006 18:27:16
#146208
Na verdade as "novas" caixas de texto do windows xp, como a que tem no MSN Messenger, devolve um resultado meio biruta, porem eu tenho um programa que fiz faz tempo, que decodifica esse formato, em resumo com algumas API's eu criei um programa onde eu posso mapear toda a estrutura de controles e classe de um executavél rodando e ainda descobrir senhas.. hehehe, se o WEBMASTER permitir posso estar colocando o código aqui..
WEBMASTER 11/05/2006 18:35:05
#146209
Wolf,

A idéia não é publicar o problema, isso te várias maneiras de se descobrir. O que precisamos é pensar na maneira de não permitir isto.
USUARIO.EXCLUIDOS 11/05/2006 19:07:37
#146210
hahã...Falei q era meio ninja[S97]...[risada-sarcastica]...acho q consegui, só peço aos colegas q peguem o arquivo em anexo e façam testes (utilizem o 2º textbox para verificar erro) e me digam se encontram algum bug...

Explicando: Como eu havia dito, filtro pelo keypress e keydown e guardo a senha real em uma variável, e no textbox fica apenas "*" realmente...Mas calma pessoal, como sempre faço, criei umas funções para facilitar o uso disso no dia a dia...

Testem ai e postem, considerem MaxLength e td q tem direito...
LUIS.HERRERA 11/05/2006 19:22:29
#146211
Bem galera a coisa tá ficando boa.
Também criei minha solução, com teclado virtual, mas acho que funcionou.

Segue o zip com o EXE de exemplo para testes, se funcionar e ninguém conseguir pegar o que é digitado pelo teclado, então vou "Tentar" fazer meu primeiro Usercontrol e postar o código.

O primeiro formulário exibido é com o exemplo do Webmaster, no início do tópico, então cliquem no botão Teclado Virtual, será aberto o form2. Bem podem clicar nos botões que será incluída a senha no campo e depois tem os botões para limpar, ver a senha e logar, este não tem nada pois não há onde logar claro.

Nota: Vocês verão que não dá nem para pegar o texto dos botões do teclado virtual (0 até 9 e A, #, $, @ _ ).

Também na MsgBox com o resultado da Senha, a mesma não é exibida.

Nota: Depois que o Webmaster falou das subclass para impedir que o SendMensage pegue o valor, lembrei de uma classe que recebi de um amigo, que usa esse recurso para interceptar as mensagens de janelas e impedir certas coisas, não sei se seria mais prático tentar usá-la para anular o envio (captura) do conteúdo, pois não sei quem seria executado primeiro, se o código do nosso aplicativo para trocar o conteúdo do SendMensage ou o SendMenssage do Windows para exibí-lo?

Bem mas já tem um exemplo funcionando, vamos ver se alguém tem algum programa que consiga pegar o serial teclado nesse meu projeto.
LUIS.HERRERA 11/05/2006 19:30:20
#146212
Matheus "Arrebentou", só faltou uma documentação do código mesmo para deixar tudo mastigado e fácil de entender, mas funcionou muito bem, ao menos com o código que estou usando.

Vamos aguardar o resto do pessoal testar e ver se não é possível quebrar mesmo, inclusive com o programa do Wolf.

LUIS.HERRERA 11/05/2006 19:43:19
#146215
Ok Matheus vamos aguardar o pessoal.

Olha só, sem querer esbarrei num detalhe interessante.

Fui testar meu sistema, já que tem login, e para minha surpresa descobri que não era possível pegar os dados dos meus campos e nem dos botões que uso (LaVolpe Button).

A princípio não entendi, pois pensava que estaria desprotegido e ao testar os demais campos, nenhum deles retornava dados. Então aparentemente descobri o que ocorre, meus campos estão dentro de um frame, isso mesmo, o frame aparentemente impede que os dados de seus controles sejam violados. Somente aparece os dados do caption do frame e não dos controles nele contidos.

Se alguém quiser testar isso também? Está ai uma nova dica.
Página 1 de 2 [18 registro(s)]
Tópico encerrado , respostas não são mais permitidas