msdn01_capa.JPG

Clique aqui para ler todos os artigos desta edição

 

Coluna “Encarando o Desenvolvedor”

por Mauro Sant’Anna

 
Tratando usuários como psicopatas

   Hoje em dia, é comum "meterem o pau" nas grandes empresas de software em conseqüência dos problemas de segurança encontrados em seus produtos. Acredito que a explicação para esses problemas esteja além do "desejo de ganhar dinheiro vendendo artigos defeituosos para os patos", como definem algumas pessoas. Creio também que grande parte do problema resida no fato de que os desenvolvedores, tanto de software como de hardware, tendem a se comportar de maneira ingênua e, conseqüentemente, perigosa.
   Nos gloriosos tempos dos aplicativos cliente-servidor escritos em Clipper, Delphi ou Visual Basic, os desenvolvedores consideravam os usuários pessoas meio bobinhas, mas bem intencionadas (mais ou menos como o chefe O'Hara, do seriado de TV Batman). Os usuários, com sua ilimitada ingenuidade, conseguiam expor os defeitos escondidos até mesmo dos aplicativos mais bem desenvolvidos. Por exemplo, eles pressionavam um conjunto de teclas não esperado ou instalavam combinações inusitadas de hardware, tais como uma impressora matricial russa junto com um mouse fabricado no Congo.
Fomos habituados a criar aplicativos protegidos contra a "imaginação" dos usuários, mas não contra comportamentos intencionalmente maliciosos. Essa premissa orientava não só o desenvolvimento de aplicativos como também de software básico, linguagens de programação e até de hardware.
   Se há dez anos alguém me explicasse o que é preciso para que um moderno vírus ou worm controle um computador, eu simplesmente não acreditaria, tal a complexidade. Por exemplo, em um típico ataque de buffer overflow, o hacker tenta inserir dados codificados de maneira especial que sobrescrevem as áreas de memória que contêm o endereço de retorno da função, de modo a fazer com que este endereço aponte para um trecho de código cuja execução traga algum benefício para o invasor. Há alguns anos, isso pareceria enredo de conto de ficção científica, mas hoje, infelizmente, é comum. Na verdade, a simples existência de um buffer overflow já justifica um boletim de segurança, mesmo que, aparentemente, não haja ninguém se aproveitando da falha.
   Para quem duvida que isso era considerado inconcebível há alguns anos, apresento duas provas: em primeiro lugar, as rotinas de manipulação de caracteres da linguagem C (muito usadas em software básico) são extremamente vulneráveis a esse tipo de ataque; em segundo lugar, as CPUs modernas guardam tanto os dados como os endereços de retorno na mesma pilha de hardware - "Santa Ingenuidade, Batman!". Se fôssemos projetar uma linguagem ou CPU hoje, sabendo o que sabemos a respeito de falhas de segurança causadas por buffer overflow, jamais cometeríamos esses dois erros infantis.
   No que se refere ao desenvolvimento de software e, mais especificamente, de software para a Web (que pode ser acessada do mundo todo), precisamos adotar atitudes drásticas. Nossos usuários podem agir agora como verdadeiros gênios do mal, em vez de ingênuos bem intencionados. O Curinga, em vez do chefe O'Hara.
   Uma das principais conseqüências para o desenvolvedor de software, é que ele precisa tratar tudo que vem do usuário com muito cuidado, como se estivesse lidando com lixo radioativo. Essa regra vale, por exemplo, para URLs, dados enviados por meio de formulários ou campos escondidos. Atualmente, uma das vulnerabilidades mais comuns em aplicativos Web consiste na injeção de comandos SQL em programas que simplesmente concatenam a entrada do usuário com algum texto fixo com o intuito de criar um comando "especial" para o banco de dados.
Infelizmente, precisamos tratar os usuários como potenciais psicopatas criminosos. A época de ingenuidade e despreocupação está irreversivelmente ligada ao passado.