Archive

Archive for the ‘Chomsky’ Category

Soquetes: PHP, IPv6 e inseguridade

04/03/2012 1 comment

 

Introdução

 

Soquete é um recurso muito interessante e bastante usado pelos programadores mais experientes. Soquete é usado quando se deseja conexão entre equipamentos por diversas razões, como por exemplo, se a expectativa é o controle mais refinado da comunicação entre sistemas operacionais diferentes. Este texto mostra algumas preocupações a serem levadas em conta quando a linguagem é o PHP. Tais preocupações devem induzir ao leitor, no final, que a programação do soquete, em si é razoavelmente simples. Mas a programação da aplicação é difícil.

 

Soquetes e o conceito Cliente-Servidor

 

O modelo Cliente-Servidor é inerente ao uso de soquetes. Os diagramas que apresentam os soquetes sempre são formais. Um bom exemplo pode ser visto em [1], onde há uma abstração do relacionamento entre o Cliente e o Servidor usando soquetes. Um diagrama mais refinado é mostrado na figura abaixo.

 

 

Um exemplo de um servidor completo, que aceita telnet, pode ser visto no sítio do PHP, em [2]. Um texto muito interessante, completo e exaustivamente discutido, com exemplos na linguagem C está em [3].

Um problema que ocorreu no exemplo do sítio do PHP, [2], em IPv4, foi o aparecimento de alguns caracteres adicionais, nos 5 primeiros textos que o Cliente enviava para o Servidor. Não consegui resposta para o problema, mas algumas pessoas diziam que se referia ao protocolo do telnet. Mas não apresentavam solução. No primeiro texto do Cliente para o Servidor, este prefixava algo como ÿþÿþ ÿþÿþ’ÿü e, outros caracteres eram adicionados, diminuindo o tamanho, até o quinto texto. A partir do sexto texto, não aparecia mais. A solução encontrada, foi usar a função substr para obter o texto original com base no caracter 22. Tal posição foi encontrada via algumas tentativas/erro.

Em IPv6, este problema não ocorreu. O tratamento IPv6 no PHP (soquete) precisa ser explicitado, no primeiro parâmetro da função socket_create(AF_INET6, SOCK_STREAM, SOL_TCP). Para IPv4, retira-se o 6. Fora a indiossincrasia do IPv4, tudo funcionou conforme o figurino. No final fiquei imaginando se o amadurecimento no desenvolvimento do IPv6 e seus aplicativos (do sistema) refletia estabilidade maior do que o IPv4. Pura conjectura, claro.

Programar o soque é simples, portanto. Há muita ajuda na Internet e googladas procurando por PHP irão trazer resultados interessantes. Mas, programar a aplicação do soquete é uma tarefa difícil. Quem tiver IPv6, pode testar o protótipo, bastanto usar o comando abaixo:

telnet -6 peony.pegasus.com.br 10000

Só irá funcionar, em IPv6! Tudo o que for digitado, exceto os resultados dos comandos descritos na “ajuda”, retornam ao Cliente.

 

Qual a dificuldade no desenvolvimento de programas e/ou aplicações usando soquetes?

 

Muitas!! O exemplo, que pode ser visto pelo telnet acima, é muito simples porque lida com a necessidade de conhecimento da linguagem PHP e as funções disponíveis para os soquetes. É uma questão de treino. A resposta à entrada meu ip, por exemplo, depende de uma função especial, socket_getpeername. Fora as questões abstratas dos manuais deve-se aprender o local onde ela será colocada e de como pode-se evitar a sua execução repetitiva, já que o servidor de soquete sobrevive dentro de alguns do…while(true). No exemplo em pauta foi usado o artifício da numeração das linhas de entrada. A criatividade pode nos remeter a outras soluções.

Por outro lado, a linguagem de entrada é demasiadamente simples e se encaixa no mais baixo nível da hierarquia das linguagens: uma linguagem regular. Além disso, a aplicação do exemplo, isto é, o Servidor usa uma regra básica de somente executar o que reconhece previamente (já que são poucos e bem definidos comandos), repassando de volta ao Cliente a entrada que ela não consegue interpretar. Contudo, uma aplicação, via de regra, tende a complicar o meio de campo participando daquele conjunto indesejável, da indecidibilidade. Há uma linha de pesquisa muito interessante, denominada “A ciência da inseguridade”, nomeada pelo Len Sassaman (morto prematuramente aos 31 anos), Meredith L Patterson, Sergey Bratus e outros. Vale a pena um atento olhar no sítio desta turma, em [4], para garantir que nossas preocupações estejam sólidas em relação aos problemas que ocorrem quando se deseja programar de forma segura. Este mesmo grupo expõe uma questão bastante convincente: protocolos são tão complexos (aka, BGP), que verificar se diferentes implementações atendem às especificações originais é um problema indecidível.

Por fim, se o Servidor for mais complexo no sentido de precisar de reconhecer muitos comandos ou de uma linguagem mais complexa, algumas regras serão observadas, até por recomendação do pessoal do projeto LANGSEC, como por exemplo garantir que o “reconhecedor” da entrada seja gerado por uma gramática, preferencialmente regular ou no máximo, livre de contexto (visível na Hierarquia de Chomsky, mostrada na figura abaixo). Além de outras recomendações, evidentemente!

Classificação de gramáticas formais, segundo Chomsky.

 

Referências

 


1. Wikipedia. Berkeley sockets. Wikipedia. [Online] [Citado em: 02 de março de 2012.] http://en.wikipedia.org/wiki/Berkeley_sockets.
2. The PHP Group. Sockets. PHP. [Online] [Citado em: 1 de março de 2012.] http://www.php.net/manual/en/book.sockets.php.
3. Hacking, Jon Erickson. Hacking. [trad.] Marcelo Madeira e Henriqueta Grubba. 1. São Paulo : Digerati Books, 2009. ISBN 978-85-60480-30-2.
4. Sassaman, Len, Patterson, Meredith L. e Bratus, Sergey. LANGSEC: Language-theoretic Security. [Online] http://langsec.org.