Em maio de 2006, alguns programadores que trabalhavam num projeto de segurança de software de código-aberto cometeram um tremendo erro. Semana passada, o erro começou a repercutir nos profissionais de segurança ao redor do mundo.
Em termos técnicos, um erro de programação reduziu a quantidade de aleatoriedade usada para criar chaves criptográficas num pedaço do código da biblioteca OpenSSL, que é usada por programas como o servidor web Apache, o programa de acesso remoto SSH, a rede particular virtual (VPN) IPsec, programas de e-mail seguro, alguns programas usados para acessar a Internet anonimamente, e assim por diante.
Trocando em miúdos: depois de uma semana de análise, nós agora sabemos que duas linhas de código modificadas criaram vulnerabilidades de segurança profundas em pelo menos quatro sistemas operacionais de código-aberto diferentes, 25 aplicativos, e milhões de sistemas individuais de computadores na Internet. E mesmo com a vulnerabilidade descoberta em 13 de maio e uma correção distribuída, a instalação da correção não repara o dano nos sistemas comprometidos. O que é ainda mais alarmante é que alguns computadores podem estar comprometidos sem sequer rodarem o código suspeito.
O motivo pelo qual a correção não resolve o problema tem a ver com o erro de programação específico. Os sistemas de computador modernos empregam números grandes para gerar as chaves que são usadas para criptografar e descriptografar informações enviadas pela rede. Usuários autorizados sabem a chave certa, então não têm de advinhá-la. Invasores de má-fé não sabem a chave correta. Normalmente, simplesmente demoraria tempo demais para adivinhá-la tentando todas as possibilidades - cerca de centenas de bilhões de anos.
Mas a segurança deste sistema vira de ponta cabeça se o computador só puder usar um número limitado de milhões de chaves diferentes. Para o usuário autorizado, a chave parece boa - os dados são criptografados. Mas o software do vilão pode rapidamente gerar e tentar todas as chaves possíveis para um computador específico. O erro introduzido há dois anos torna as chaves criptográficas fáceis de advinhar.
O erro não dá a mesma chave criptográfica para todos os computadores - isso teria sido percebido antes. No entanto, ele reduz o número de chaves diferentes que os computadores Linux podem gerar para 32.767 chaves distintas, dependendo do tipo da arquitetura do processador do computador, do tamanho da chave e de seu tipo.
Menos de um dia depois da vulnerabilidade ser revelada, o hacker de computador HD Moore do projeto Metasploit lançou um conjunto de "brinquedos" para quebrar as chaves destes pobres computadores Linux e Ubuntu. O website de Moore oferece desde domingo arquivos para baixar com chaves pré-computadas, só para tornar mais fácil de identificar os sistemas de computador vulneráveis.
Diferentemente do comum erro de estouro de pilha, que pode ser corrigido atualizando-se o software, as chaves criadas com o software defeituoso não melhoram quando o computador é atualizado: ao invés disso, novas chaves devem ser geradas e instaladas. Um agravante é o fato de que as chaves também precisam ser certificadas e distribuídas: o processo consome tempo, é complexo e pode dar errado.
Ninguém sabe quantos sistemas são afetados por este problema, pois chaves criptográficas são transportáveis: chaves vulneráveis podem ter sido geradas num sistema Debian num escritório e depois instaladas num servidor rodando Windows noutro. O Debian é uma distribuição predileta de muitos profissionais de segurança, e o Ubuntu é uma das distribuições mais populares para uso geral, então o alcance do problema pode ser bem amplo.
Então como os programadores cometeram o erro em primeiro lugar? Ironicamente, eles utilizaram uma ferramenta automatizada projetada para detectar erros de programação que levam a vulnerabilidades de segurança. A ferramenta, chamada Valgrind, descobriu que a biblioteca OpenSSL estava usando um bloco de memória sem inicializar a memória a um estado conhecido - por exemplo, definindo todo o conteúdo do bloco como zero. Normalmente, é um erro usar memória sem deixá-la com um conteúdo conhecido. Mas neste caso, esse estado desconhecido era usado intencionalmente pela biblioteca OpenSSL para ajudar a gerar aleatoriedade.
A memória não-inicializada não era a única fonte de aleatoriedade: o OpenSSL também obtém aleatoriedade de fontes como movimentos do mouse, tempo de pressionamento de teclas, chegada de pacotes na interface de rede, e até pequenas variações na velocidade do disco-rígido do computador. Mas quando os programadores viram os erros detectados pelo Valgrind, eles desativaram as linhas de código ofensivas - e removeram todas as fontes de aleatoriedade usadas para gerar chaves salvo uma, um inteiro chamado identificador do processo que pode variar de 0 a 32767.
"Nunca conserte um erro que você não compreende!" reclamou Ben Laurie, desenvolvedor do OpenSSL, em seu blog após o erro ter sido descoberto por completo. Laurie culpa os desenvolvedores do Debian por tentarem consertar o "bug" na versão do OpenSSL distribuída com os sistemas operacionais Debian e Ubuntu, ao invés de enviar a correção aos desenvolvedores do OpenSSL. "Se eles tivessem feito isto neste caso, " ele diz, "nós (a equipe do OpenSSL) teríamos morrido de rir, e uma vez recuperado o fôlego os avisaríamos que idéia terrível era essa. Mas não, parece que todo distribuidor quer 'valorizar' ficando entre o usuário do software e seu autor."
Talvez mais desconcertante ainda, no entanto, é o que essa história nos diz sobre a segurança do software de código-aberto - e talvez sobre segurança de software em geral. Um desenvolvedor (cujo nome não citarei) notou um problema, propôs uma solução, e obteve aprovação de sua solução por uma pequena quantidade de pessoas que não entendiam realmente as conseqüências do que estava sendo sugerido. O resultado: comunicações entre milhões de sistemas de computador ao redor do mundo que deveriam ser protegidas criptograficamente não estavam sendo protegidas de verdade. Há dois anos, Steve Gibson, um consultor de segurança altamente respeitado, alegou que um erro significativo encontrado em software Microsoft tinha mais a ver com um programador tentando criar uma "porta dos fundos" intencional do que com mais erros de programação da Microsoft.
O erro de aleatoriedade do Debian OpenSSL foi quase certamente um erro inocente. Mas e se um país estrangeiro quisesse intencionalmente introduzir vulnerabilidades secretas no nosso software de código-aberto? Bem ocultas, tais falhas poderiam permanecer secretas por anos.
Uma coisa é certa: há expectativa de encontrar mais dessas vulnerabilidades com o tempo.
Fonte: http://www.technologyreview.com/Infotech/20801/
Artigo por Simson Garfinkel, professor associado da escola de pós-graduação de Monterey, na Califórnia, EUA e membro do Centro de Pesquisa e Computação e Sociedade na Universidade de Harvard.
Postada por: Carlos Filipe Lombizani, cfilipe em linux.ime.usp.br