Olá pessoal, esse é meu primeiro artigo aqui no LinuxSecurity, assim gostaria de agradecer a oportunidade e pedir que me enviem suas críticas e sugestões para os próximos artigos. Meu endereço de e-mail é Andre-SP@pobox.com Na semana passada estive discutindo um pouco sobre protocolos de segurança para comunicações wireless. O WEP é um desses protocolos e é sobre ele que pretendo falar nessa matéria. As comunicações sem fio podem ser feitas utilizando o padrão 802.11 do IEEE para redes Ethernet e o WEP para resolver os seguintes problemas: - Impedir que intrusos consigam ler os dados transmitidos - Impedir que intrusos consigam modificar dados transmitidos - Impedir que intrusos tenham acesso a rede wireless A sigla WEP significa: "Wired Equivalent Privacy". Esse protocolo deveria assegunrar: confidencialidade, integridade dos dados e controle de acesso a rede wireless. Infelizmente nenhum desses aspectos é totalmente atendido pela especificação atual do WEP. Vale lembrar que existem algumas diferenças de implantação do protocolo de acordo com o fabricante, mas a principio todas seguem as especificações do protocolo e essas especificações apresentam falhas que serão discutidas a seguir. 1) Como funciona o WEP De forma resumida o protocolo WEP funciona da seguinte forma: Os "peers" envolvidos em uma troca de dados devem compartilhar um segredo "k". Não existe, no protocolo, a determinação de como esse segredo deve ser trocado entre eles. A mensagem que será enviada do transmissor ao receptor é representado por "M". Para enviar: - Computar checksum da mensagem: c(M). Não depende de k. - Pegar um IV (Initialization Vector) "v" e utilizando RC4 gerar um keystream: RC4(v,k). IV é um número que deve ser gerado pelo emissor. O WEP implementa o IV como sendo sequêncial, iniciando do valor 0 sempre que o cartão de rede for reiniciado. Mais a frente discutirei essa decisão de implementação e efeitos. - Computar o XOR de com o keystream RC4(v,k) para determinar o ciphertext (texto encriptado). - Transmitir o ciphertext pelo link de radio. Para receber: - Gerar o keystream utilizando o valor de v, retirado do pacote recebido, e o secret k: RC4(v,k). - Computar o XOR do ciphertext com o keystream RC4(v,k) para achar . - Checar se c'=c(M') e caso seja aceitar que M' como a mensagem tranmitida. 2) Utilização de keystream e IVs Existem algumas regras para a utilização de keystreams, em nosso caso o RC4: uma delas é nunca reutilizar um keystream. Suponha um keystream K e dois cypertexts P1 e P2 no protocolo WEP temos: C1 = P1 XOR K C2 = P2 XOR K C1 XOR C2 = P1 XOR K XOR P2 XOR K = P1 XOR P2 Assim, caso um atacante conheça ou advinhe uma das mensagens não encriptadas ele pode descobrir partes de outras mensagens encriptadas. O keystream utilizado pelo WEP é RC4(v,k), Ele depende de v e k. O valor de k é fixo, então o keystream passa a depender somente do valor de v. Caso v seja reutilizado, RC4(v,k) tambem se repitirá, o que é bastante ruim, como demonstrado acima. O WEP implementa v como um valor de 24 bits no header dos pacotes, assim v pode ter 2^24 valores ou aproximadamente 16 milhões de possibilidades. Depois de 16 milhões de pacotes v será reutilizado. Existe ainda um outro problema: visto que os adaptadores de rede zeram o valor de v sempre que são reinicializados, é comum que duas partes envolvidas em uma comunicação estejam utilizando valores semelhantes de v, possibilitando colisões. Suponha agora que um atacante saiba um plaintext e um ciphertext, isso nao é dificil visto que ele pode enviar, por exemplo, um ping e ficar "escutando" a resposta. Com isso é possível possível determinar o keystream: RC4(v,k) fazendo XOR do plaintext com o ciphertext. Note que não é possível descobrir o valor do secret k. Na proxima vez que um pacote for transmitido utilizando esse valor de v conhecido, o atacante poderá calcular o keystream, computar seu XOR com o cipertext recebido e ler os dados. Se um atacante capturar os valores dos keystream para todos os valores possíveis de v ele terá 1500 * (2^24) = 24GB (sendo 1500 o tamanho do pacote). Com esses 24GB de keystreams ele pode ler toda a comunicação entre os peers que estejam utilizando o k em questão, mas novamente, ele nunca saberá qual o valor de k. É importante lembrar também que o tamanho da base de dados não depende do tamanho do segredo k. O algorítimo utilizado para computar o checksum é o CRC32. Um pacote será aceito caso, depois de decriptado, os ultimos 4 bytes do plaintext formarem um checksum correto para o resto do plaintext. 3) Autenticação O protocolo WEP permite que a "estação base" autentique seus usuários da seguinte forma: - A base manda uma string para o cliente - O cliente envia de volta essa string ecriptada com WEP utilizando o segredo k. - A base desencriptada o pacote e verifica se a string é valida. Caso seja, o cliente é aceito. Mais um vez, um atacante conhece a string enviada pela base e o ciphertext devolvido, e isso é o suficiente para ele também se autenticar com a base. 4) Conclusão Em nenhum momento nesse artigo foi demonstrado como: injetar tráfego, alterar pacotes ou se autenticar sem conhecer o segredo k, embora isso seja possível. A intensão desse artigo é demonstrar as fragilidades do protocolo WEP e não ensinar como utiliza-las. O que pode então ser feito com o WEP: - Não assuma que é seguro (nada pode ser "meio seguro", ou é ou não é seguro). Provavelmente é razoavel utilizar WEP para redes onde não existam grandes "vantagens" ao serem invadidas. - Trate sua rede wireless como uma rede publica - Coloque sua rede wireless fora de seu firewall e de forma isolada. - Caso usuários wireless tenham de utilizar serviços em sua rede local, utilize algum outro tipo de autenticação, como por exemplo: VPN, IPSec, SSH. Para que o WEP se torne um protocolo mais confiavel sua especificação deveria: - Implementar valores de v longos e de preferência que não se repitam por um período de tempo consideravel. - Não reiniciar os valores de v quando os adaptadores forem reiniciados. - Implementar um forma de trocar os valores do segredo k durante a comunicação. - Implementar um checagem de CRC mais "forte" de forma a garantir a integridade dos pacotes. Os problemas com algorítimos de criptografia nos levam a lembrar as formas de desenhar um algoritimo, podendo destacar: utilizar algoritimos e designs antigos e já verificados e analisados publicamente; e submeter o algoritimo, em sua fase de design, a avaliação publica. A mensagem final é: utilizar redes wireless com WEP, sem supor que são seguras. É recomendavel utilizar outras formas de autenticação e de encriptação como: VPNs, IPSec, SSH. Vale lembrar que todas as informações aqui apresentadas foram baseadas em documentos e white papers disponíveis na Internet. Espero que tenham gostado do artigo. Pretendo escrever outros nas próximas semanas. Por favor, enviem suas críticas e sugestões, estarei esperando. Obrigado pela atenção. André Corrêa andre-sp@pobox.com