segunda-feira, 9 de julho de 2007

Como confiar?



Este blog apresenta um breve resumo e meus comentários sobre o discurso de Ken Thompson durante a entrega do prêmio Turing Award de 1983 (Turing_Award) recebido por ele juntamente com Dennis Ritchie pelo desenvolvimento da teoria dos sistemas operacionais genéricos e pela implementação do sistema operacional UNIX.
Ken Thompson abre o seu discurso saudando a todos os inúmeros colaboradores do sistema operacional UNIX e diz que ele sendo um programador, irá utilizar o programa mais curto que ele já fez para embasar a sua mensagem.
O programa é apresentado em três estágios e tem o objetivo de introduzir um Trojan em um compilador. No estágio 1 ele mostra um programa inofensivo capaz de gerar uma cópia do seu próprio código fonte quando for executado. No estágio 2, Thompson apresenta o compilador C sofrendo uma modificação para reconhecer o caractere barra vertical como parte da sua sintaxe. No estágio 3, é apresentado um trecho hipotético do compilador C capaz de introduzir código malicioso no programa que está sendo compilado e adverte que o código binário gerado dificilmente será descoberto por alguém. Ainda acrescenta que o código malicioso tem a capacidade de se reproduzir, gerando assim programas compilados com código malicioso sem que o código fonte seja alterado.
Ken Thompson conclui seu discurso dizendo categoricamente que não se deve confiar em programas que você não tenha escrito totalmente e caracteriza os técnicos que promovem esse tipo de fraude como vândalos, perigosos e merecedores de permanecerem presos por muitos anos. Chega a comparar a atividade de forjar programas com a de dirigir embriagado e lança um alerta para impressa e a comunidade em geral de que esse tipo de atividade deixe de ser enaltecida e seja encarada como prejudicial e criminosa.

Comentários
As colocações de Ken Thompson feitas em 1983 são extremamente atuais em 2007. Pode-se dizer que o apelo dele ainda não foi ouvido mesmo depois de tantas vítimas. Existe uma forte tendência na comunidade em geral em confiar prontamente naquilo que é dito a respeito dos benefícios de um programa e rapidamente ser adotado em ambientes empresariais. Poucas são as vezes em que se aplica uma política rígida de homologação e verificação das funcionalidades desse programa, quem dirá uma revisão minuciosa do seu código-fonte. Uma prova da atualidade do discurso de Ken Thompson está no pessoal do fórum voto-seguro (http://www.mail-archive.com/voto-eletronico@pipeline.iron.com.br/index.html#01214) que acusa o governo brasileiro de ser leviano na avaliação e verificação do sistema computacional de votação eletrônica. A opinião dos participantes do fórum indica que foi feita uma inspeção parcial do código e num tempo incompatível com o tamanho do sistema.
Foi registrado no começo de 2007, o primeiro período consecutivo de 12 meses sem fraude em sites brasileiros de internet banking. Isso demonstra uma forte tendência e uma melhora considerável nos sistemas de controle, no entanto, o número de ataques e de variações de ameaças continua crescendo o que demonstra que os sujeitos envolvidos em criar tais ameaças não desistiram e continuam buscando novos meios de quebrar os sistemas de segurança.
Diante de tamanha insegurança, devemos optar pela utilização de programas auditáveis, ou seja, programas que sigam implementem padrões abertos, que utilizem algoritmos públicos e reconhecidos pela comunidade em geral ou ainda programas de código aberto. Fazendo assim, estaremos criando programas auditáveis e dignos de maior confiança por quem os utilizam.

Análise de Risco de Segurança de um Sistema ATM

Este blog mostra a análise de risco de segurança para um sistema ATM genérico proposto por Russell C. Bjork como material de apoio no curso de orientação a objetos do Gordon College. O material está disponível em http://www.mathcs.gordon.edu/local/courses/cs211/ATMExample/. A análise tem início com a determinação das vulnerabilidades, ameaças e fontes de ameaça do sistema. Em seguida foi realizada a avaliação do nível de risco das ameaças e por fim foram elaborados os casos de mau uso e os casos de controle para conter as ameaças.

A seguir tem-se a lista de ameaças e o nível de risco associado:
1 - Causar diferenças no montante existente nos caixas durante a rotina de inicialização (Risco: Baixo)
2 - Obter as informações de acesso às contas do cliente e manipulá-las (Risco: Médio)
3 - Introdução de leitores dissimulados no ATM (Risco: Alto)
4 - O envelope ser substituído por outro com montante a menos. O depósito é confirmado conforme o envelope. (Risco: Baixo)

Os controles de segurança a serem implementados são listados a seguir. A lista está indexada pelo número da ameaça:
1.1 - Solicitação de PIN ou mesmo utilização de cartões de identificação com chip de segurança.
2.1 - Inclusão de criptografia na comunicação com o banco e nas operações de acesso aos dados do cartão e teclado durante as transações.
3.1 - Adoção de cartões com chip de segurança que só responde mediante senha do banco emissor.
4.1 - Impressão no envelope dos dados da transação.

A figura abaixo mostra o diagrama de casos de uso do sistema alterado para refletir os casos de mau-uso identificados:



A figura abaixo mostra o diagrama de casos de uso do sistema alterado para refletir os casos de controle necessários para mitigar os riscos identificados:



O Algoritmo RSA


Em 1977 os criptógrafos Rivest, Shamir e Adleman do Massassuchets Institute of Technology (MIT) definiram a primeira técnica de criptografia assimétrica divulgada na literatura aberta, o algoritmo RSA. Este é o principal algoritmo assimétrico em uso (ANSI X9.31) na atualidade. Para operar, cada pessoa que for trocar correspondência deve fabricar uma chave pública e uma chave privada. A chave pública será utilizada para cifrar as mensagens para um certo destinatário enquanto a chave privada será utilizada pelo destinatário para decifrar a mensagem recebida. A relação entre as chaves pública e privada é a proteção do destinatário. Um indivíduo prepara suas chaves do seguinte modo:
Escolhe adequadamente dois números primos p e q
Calcula n = p*q
Escolhe aleatoriamente um número x e calcula y tal que:

mdc(x, fi(n))=1, onde fi(n)=(p-1)(q-1), tal que x esteja entre 1 e fi(n)

y=(x mod fi(n))^(-1)

No fim do cálculo é obtida a chave pública (n, x) e a chave privada (n, y). A chave pública é divulgada abertamente para que qualquer interessado possa trocar mensagens com o criador das chaves.
A partir de uma mensagem de entrada M, gera-se sua representação numérica m substituindo os caracteres por números. As chaves criptográficas são então utilizadas para cifrar e decifrar a mensagem m conforme as seguintes fórmulas:

Cifrar: c=m^x mod n

Decifrar: m=c^y mod n


A segurança do RSA está na dificuldade de obter p e q a partir da fatoração de n, esse problema torna-se complexo quando n é muito grande. O teorema dos números primos afirma que existem 4,3 X 1097 números primos de 100 dígitos. É maior que o total de partículas do universo.
Na prática, devido ao tempo de processamento do RSA, utiliza-se uma combinação de criptografia simétrica com assimétrica. Desta forma, uma chave simétrica de sessão aleatória é gerada para cifrar o texto utilizando-se um algoritmo simétrico, por exemplo: AES. Com a chave pública disponível a chave simétrica é cifrada e em seguida enviada ao destinatário juntamente com a mensagem cifrada. Para decifrar, o destinatário decifra a chave privada de sessão com a sua chave privada para depois decifrar a mensagem com a chave simétrica obtida.