3.2 Código Móvel


Código Móvel denomina um conjunto de tecnologias de linguagem e plataforma de sistemas distribuídos que suportam a construção de programas de computador que são:

A tecnologia Java (Kramer, 1996) e seu modelo de código móvel conhecido como applet foram criados pela Sun Microsystems em 1995. Applets são pequenos programas Java que são instalados em servidores Web e referenciados através de páginas HTML. Quando um browser acessa esta página HTML que referencia o applet, ele automaticamente também transfere o código do applet e o executa. Applets são hoje os principais responsáveis pela grande disseminação do conceito e das tecnologias de código móvel em geral. Alguns autores preferem classificar o esquema descrito acima como uma restrição do modelo de código móvel, chamada de Código sob Demanda (Carzaniga et alli, 1997).

Sob um ponto de vista mais amplo, outras tecnologias de código móvel que merecem destaque, quer seja pela sua disseminação, quer seja pelas características peculiares do seus modelos computacionais são: JavaScript (Netscape, 1999); ActiveX (Microsoft, 1996); Obliq (Bharat e Cardelli, 1995); TCL/Tk (Scriptics, 1999) e Telescript (General Magic, 1996). Uma extensa relação - mas um tanto desatualizada - destas tecnologias é apresentada por Connoly (1996).

O uso de código móvel na Web, e em especial o modelo de applets Java, permite que, adicionalmente ao uso de páginas HTML e figuras, os recursos transferidos entre servidores e clientes Web sejam programas de computador. A execução segura de código móvel se refere à relativa garantia de que o código oriundo de um servidor qualquer da Web (chamado de código estrangeiro) não tenha acesso indiscriminado aos recursos presentes na plataforma do cliente, e portanto não possa causar danos à plataforma do cliente, como ocorre com vírus.

Quando contrastado com o modelo computacional de scripts CGI, o modelo de código móvel basicamente desloca a carga computacional para a máquina do cliente. Em outras palavras, enquanto que no modelo computacional de scripts CGI o programa que está armazenado no servidor permanece e é executado neste servidor, na maiorias das aplicações de código móvel o programa que está armazenado no servidor é transferido e executado na máquina do cliente. Do ponto de vista do cliente, uma conseqüência da execução remota de scripts CGI é que a entrada e saída de dados do cliente é normalmente efetuada em lotes (batch), onde a computacão é efetuada em várias etapas seqüenciais: (1) entrada de dados no cliente; (2) transferência de dados para o servidor; (3) processamento no servidor; (4) transferência de dados para o cliente e (5) saída de dados. Como que decorre entre as etapas 1 e 5 é da ordem de alguns segundos, os dados trocados entre o cliente e o programa são compostos basicamente por texto. No caso de código móvel, como o programa executa máquina do cliente, o programa pode normalmente apresentar interface gráfica multimídia, podendo tratar eventos do mouse, manipular sons, efetuar animações ou realizar cálculos pesados de forma interativa. Adicionalmente, após a transferência do código, não há obrigatoriedade do programa em execução no cliente se comunicar com o servidor.

Modelos de Código Móvel de Amplo Espectro

As principais características que uma tecnologia de código móvel com amplo espectro de aplicação deve apresentar são apresentadas abaixo. Para cada uma delas é feita uma descrição de como a tecnologia Java suporta esta característica.
O código trazido de um servidor qualquer (chamado de código estrangeiro) executa em um espaço de nomes restrito, chamado de sandbox, de modo que no decorrer de sua execução o programa tenha acesso limitado às informações e recursos presentes no ambiente operacional do usuário. Dentro de um sandbox o acesso a recursos como sistema de arquivos, memória, controle da interface gráfica, conexões de rede, etc., é feito apenas em conformidade com um estrito esquema de permissões definido pelo usuário.

Applets Java, por exemplo, quando executando dentro do sandbox, apresentam várias restrições descritas em (Sun Microsystems, 1998a). O modelo de código móvel ActiveX não utiliza o conceito de sandbox, e sua segurança de execução é baseada na autenticação da procedência do código por intermédio de assinaturas digitais que são atestadas por uma entidade certificadora da Internet. Uma vez que o usuário ActiveX acata a certificação do código, o programa executa no ambiente operacional do usuário sem qualquer restrição computacional.

O código de um programa concebido para ser móvel deve ser abstrato o suficiente para não estar amarrado a detalhes ou dependências de sistemas operacionais como MS-Windows e os diversos dialetos de UNIX, nem a processadores específicos como Intel e Motorola. A solução historicamente mais bem sucedida e conhecida para suportar esta portabilidade de código é o uso de máquinas virtuais simples e pequenas, capazes de serem facilmente portadas para as várias plataformas de sistema operacional onde se deseja executar o programa. Através de um projeto de máquina virtual consistente é possível se garantir a execução homogênea de um mesmo código móvel em várias plataformas específicas sem que seja necessário se recompilar este código.

Programas construídos na linguagem Java, por exemplo, são compilados para um formato de código intermediário, chamado de bytecode. A máquina virtual Java que interpreta estes bytecodes é um microprocessador - implementado em software - que interpreta um conjunto de aproximadamente 160 instruções de uma máquina virtual especialmente projetada para executar programas Java (Lindholm e Yellin, 1996). Adicionalmente, as bibliotecas padronizadas que completam o núcleo de qualquer implementação da máquina virtual de Java desempenham papel fundamental na garantia desta portabilidade.

A discussão apresentada na Seção 3.1 destacou a clara importância que o apelo das interfaces multimídia teve no impulso à disseminação da tecnologia WWW. De modo similar, qualquer tecnologia de código móvel que espera obter sucesso na Web deve apresentar capacidades de tratamento de multimídia tão ou mais sofisticadas que as presentes no modelo básico da Web.

Por exemplo, algumas das principais bibliotecas que constituem o núcleo da máquina virtual Java, como java.applet e java.awt (Sun Microsystems, 1999d), fornecem uma grande variedade de opções no tratamento de interfaces multimídia.

A execução de programas de código móvel é feita sob demanda dos clientes. Sendo assim, não há como se prever quando um programa disponibilizado em um servidor será utilizado por clientes quaisquer. Para que um programa funcione adequadamente sob estas condições de imprevisibilidade, todas as etapas de transmissão do código (do servidor para o cliente); instalação do código (ativação da máquina virtual, carga do sandbox, verificação da consistência do código recebido, ligação entre o código recebido e as bibliotecas locais do cliente); e execução do código (criação de processos, alocação de memória para dados e instruções, etc.) precisam ocorrer da forma mais automática e rápida possível, sem que o usuário (cliente) seja envolvido em uma série de questionamentos sobre a configuração local do programa.

O modelo de código móvel de applets em Java, por exemplo, permite que desenvolvedores de código móvel definam associações entre programas Java e documentos HTML de modo que, ao carregar um documento HTML trazido de um servidor qualquer, o browser Web possa automaticamente solicitar a imediata carga do código do applet associado. Clientes Web que são compatíveis com programas Java e as próprias bibliotecas que compõem o núcleo da máquina virtual Java realizam a instalação e execução automática e segura do applet, sem que o usuário precise responder a nenhuma pergunta.

Por mais tecnicamente adequada que possa ser uma tecnologia, vários fatores não técnicos contribuem para que esta tecnologia seja bem sucedida no mercado. Nenhuma tecnologia de código móvel (tecnologia de software em geral) será bem sucedida se não oferecer boas condições para desenvolvimento de produtos, através da disponibilização de IDEs-Interactive Development Environments a preços acessíveis; facilidades no acesso a especificações de linguagens e bibliotecas (Sun, 1999b), material de aprendizagem e treinamento, exemplos de código e aplicações; boas condições para distribuição e comercialização de produtos, através da disponibilização de máquinas virtuais que podem ser usadas e distribuídas sem pagamento de royalties; condições para formar uma comunidade de desenvolvedores e usuários que possam trocar idéias e dúvidas, adquirir confiança mútua no futuro da tecnologia, discutir sobre novos nichos de aplicação da tecnologia, etc., como é o caso da Java Developer Connection (Sun, 1999a).
Às características expostas acima podemos ainda acrescentar alguns elementos adicionais presentes na tecnologia Java:

Limitações e Problemas da Tecnologia Java

Algumas das principais limitações hoje existentes com relação específica à adoção da tecnologia Java e de seu modelo de código móvel são: Mesmo levando-se em consideração os problemas e dificuldades expostos acima, Java é atualmente a tecnologia que reúne as maiores possibilidades de sucesso entre as tecnologias de código móvel de amplo espectro de aplicação.

Tecnologias Primitivas de Código Móvel, Vírus e Práticas de Computação Segura

Embora esta seção tenha definido características importantes e desejáveis a serem apresentadas pelas tecnologias de código móvel de amplo espectro, é importante destacar que existem vastos nichos de aplicação de código móvel que são preenchidos por combinações de tecnologias mais simplificadas, aqui chamadas de tecnologias primitivas de código móvel. As mais conhecidas e disseminadas são possivelmente: a cópia e execução de programas convencionais disponíveis em servidores web e ftp; e a anexação (attachment) de programas a cartas de correio eletrônico (e-mail) que são transferidas de um remetente para um destinatário. Apenas o uso de attachments será discutido aqui.

Existem basicamente duas formas de se fazer esta transferência de código através de attachments: anexação explícita de programas executáveis ou através do uso de macros anexadas a cartas de correio eletrônico ou embutidas em documentos, como textos Word e planilhas Excel.

O envio de programas executáveis através de cartas de correio eletrônico tem sido de grande utilidade para usuários da Internet, principalmente entre aqueles que se conhecem pessoalmente, que trabalham na mesma empresa ou que mantém alguma relação de confiança mais estreita. Ao receber de um remetente conhecido uma carta com um programa anexo, basta que usuário (destinatário) solicite a execução do programa, e este será imediatamente executado na máquina do cliente.

Embora simples e fácil de implementar, esta prática apresenta algumas limitações técnicas:

A última limitação apresentada acima torna bastante arriscada a execução de código recebido através de e-mail, principalmente se considerarmos que se expande a cada dia o universo de pessoas com as quais os usuários Internet interagem. À medida que maiores quantidades de código são recebidas via e-mail e executadas permissivamente, mais aumentam os riscos de danos ou contaminações por vírus, cavalos-de-tróia e worms (IBM, 1998). De modo similar à prática de sexo seguro através de condons (camisinha), estimulada nas campanhas de prevenção ao vírus da AIDS, as corporações de hoje dependem inevitavelmente de computadores e redes de computadores sadios, e começam a se engajar em campanhas chamadas pratique computação segura (Ohlson, 1999), isto é, não execute programas dos quais você não conhece a procedência.

Vírus de Macro

As dificuldades em se praticar computação segura aumentam à medida em que novas plataforma de sistemas, na tentativa de criar programas com elevado grau de usabilidade, empregam esquemas de automação de atividades poderosos e insidiosos, como é o caso de macros do MS-Office, que podem ser embutidas em documentos Word e planilhas Excel. Vírus de macro, como o Melissa (Cohen, 1999) e o VBS.Monopoly (Nelson, 1999), escritos nas linguagens de macro do MS-Office e em VBScript, respectivamente, exploram brechas de segurança em programas como o MS-Outlook (programa de automação de correio eletrônico da Microsoft), e podem potencialmente causar grandes problemas de segurança.

O cenário é o seguinte: o remetente envia para o destinatário uma carta contendo um documento Word ou Excel com macros em anexo. Quando o destinatário recebe a carta e abre o programa no editor de texto ou na planilha eletrônica, a macro explora brechas de segurança no computador do cliente e é automaticamente ativada, mesmo que o usuário não a execute. O problema mais crítico é que usuários não estão preparados para perceber que, nesta situação, receber uma carta de correio eletrônico representa teoricamente um risco quase tão elevado quanto a instalação de um novo software cuja procedência é duvidosa. Felizmente os vírus de macro Mellisa e VBS.Monopoly não são muito danosos. O efeito decorrente da contaminação pelo vírus Melissa, por exemplo, é o envio de uma cópia do próprio vírus para os 50 últimos endereços de correio eletrônico utilizados pelo usuário. O vírus VBS.Monopoly também atua de modo similar ao Melissa, e adicionalmente, produz uma figura JPEG que faz uma piada sobre a Microsoft Corporation e Bill Gates (Nelson, 1999). Vírus como Melissa e VBS.Monopoly, que se espalham rapidamente através de uma rede mas que não produzem maiores danos, são chamados mais precisamente de vermes (worms).

Código Móvel, Vírus e o Ciberespaço

O uso cada vez mais intenso das tecnologias de código móvel, sejam elas de amplo espectro ou primitivas, é um processo inevitável. A tecnologia de código móvel é fundamental para o compartilhamento de construções digitais complexas no ciberespaço, que servem como "tijolos" para o desenvolvimento de várias outras tecnologias e aplicações.

Em garantindo uma maior estabilidade e segurança aos seus usuários, as tecnologias de código móvel de amplo espectro oferecem teoricamente maiores possibilidades de utilização a longo prazo do que as tecnologias primitivas.
As características e aplicações da tecnologia Java, em especial, demonstram que está se seguindo este caminho, pois ela se encontra atualmente em uso, por exemplo, como bloco fundamental na construção de plataformas e aplicações para:


No entanto, especialistas de segurança em informática são unânimes em afirmar sempre existirão brechas de segurança a ser exploradas, qualquer que seja o sistema de computadores. Deste modo, não se pode esquecer que a simplicidade das tecnologias primitivas de código móvel é a maior aliada para sua disseminação a curto e médio prazo, mesmo que os riscos e a instabilidade sejam maiores. Percebe-se, por exemplo, que o emprego de e-mails com attachments executáveis é uma prática cada vez mais comum dentro de comunidades digitais isoladas ou semi-isoladas, como nas intranets (sistemas de informações construídos com a tecnologia desenvolvida para a Internet e a Web) . Os custos e riscos de utilização desta tecnologia primitiva de código móvel, simples, poderosa e de fácil utilização, são relativamente baixos se considerarmos sua aplicação em um universo de interação fechado, como ocorre dentro de uma empresa ou corporação que exerce rígido controle sobre o uso de sua rede de computadores. Tais custos e riscos, no entanto, são bem mais difíceis de estimar se este universo está em permanente expansão, tal como ocorre na Internet.

Observando-se a forma como são propostas as tecnologias primitivas de código móvel, percebe-se que a dificuldade no equilíbrio adequado entre poder computacional e facilidades de interação com programas diversos é quem cria as maiores brechas de segurança para vírus e outros códigos similares. Após descobertas, a maioria destas brechas de segurança demoram poucos dias ou semanas para ser corrigidas, seja através da distribuição e aplicação de pequenos programas chamados de remendos (patches), seja através da atualização de programas anti-virais. O maior problema é que enquanto a brecha de segurança não é corrigida, o dano causado pelo código invasor pode ser muito grande (CNN, 1999), e este dano pode ser agravado devido à lentidão na compreensão do problema e uso dos patches e anti-vírus por parte dos usuários em geral.

Spafford (1995) faz uma comparação entre vírus de computador e modelos e vida artificial, observando que vírus de computador exibem, em maior ou menor escala, diversas características de organismos vivos, como (1) padrões de atividade persistente no tempo e espaço; (2) reprodução; (3) armazenamento de auto-representações; (4) metabolismo; (5) interações funcionais com o ambiente; (6) interdependência entre partes; (7) estabilidade sobre perturbações e (8) crescimento. A principal restrição que o trabalho de Spafford faz a respeito de vírus de computador como organismo vivo é que o ambiente onde ele "vive" também deveria apresentar características de seres vivos. Considerando-se que a Internet é o principal ambiente pelo qual circulam os vírus e outros códigos maliciosos da atualidade, talvez já seja adequado considerar estes elementos como os seres vivos mais primitivos do Ciberespaço.