← Voltar aos artigos

Paper Files / AppSec

Segurança de Aplicações em Sistemas Distribuídos UNIX e Redes TCP/IP: Modelagem de Ameaças, Análise de Vulnerabilidades e Técnicas Práticas de Defesa (Estado da Arte em 1989)

AppSecPT

A rápida expansão de redes TCP/IP acadêmicas e governamentais durante a década de 1980, particularmente através da ARPANET e da NSFNET, introduziu um novo conjunto de riscos para sistemas computacionais conectados. Embora grande parte da pesquisa em segurança até o momento tenha se concentrado em mecanismos de controle de acesso em sistemas operacionais e em modelos formais de proteção, eventos recentes — como o Worm da Internet de 1988 — demonstraram que vulnerabilidades no nível de aplicação representam um vetor crítico de comprometimento. Este trabalho examina o campo emergente da segurança de aplicações (Application Security, ou AppSec) no contexto de sistemas UNIX, serviços de rede e programas distribuídos típicos do final da década de 1980. O estudo apresenta um modelo sistemático de ameaças direcionadas a aplicações de rede, incluindo serviços como `sendmail`, `fingerd`, `rsh`, `rexec` e utilitários administrativos, destacando classes de vulnerabilidades recorrentes como estouros de buffer, manipulação insegura de entrada, falhas de autenticação e erros de configuração. A partir de uma análise de literatura clássica em segurança de sistemas — incluindo os princípios de Saltzer e Schroeder, os modelos de proteção de Lampson e Karger & Schell, e os trabalhos de detecção de intrusão de Denning e Anderson — propomos uma metodologia prática para avaliação de segurança de aplicações em ambientes UNIX conectados em rede. A metodologia combina revisão de código-fonte, monitoramento de tráfego TCP/IP, análise comportamental de processos e instrumentação de auditoria no sistema operacional. Demonstramos como ferramentas disponíveis no ecossistema BSD UNIX, como `tcpdump`, `lint`, depuradores e mecanismos de logging do sistema, podem ser empregadas para identificar vetores de exploração. O trabalho inclui implementação experimental em um ambiente BSD 4.3 conectado via Ethernet, no qual avaliamos diversos serviços de rede amplamente implantados. Resultados experimentais indicam que a maioria das falhas exploráveis deriva de três causas principais: ausência de validação de entrada, uso imprudente de funções da biblioteca C e confiança implícita entre hosts em ambientes distribuídos. Um estudo de caso detalhado examina o Worm da Internet de 1988 como exemplo concreto de exploração de falhas de segurança em aplicações. Concluímos que a segurança de aplicações deve ser tratada como disciplina independente dentro da segurança de sistemas, exigindo práticas específicas de desenvolvimento seguro, auditoria contínua e monitoramento de comportamento em tempo de execução. O artigo também discute direções futuras de pesquisa, incluindo instrumentação automática de código, mecanismos de detecção de intrusão baseados em anomalia e modelos formais de validação de software seguro.

  1. Introduction

Durante as duas últimas décadas, a segurança de sistemas computacionais tem sido tradicionalmente tratada sob a perspectiva do sistema operacional e do controle de acesso. Trabalhos clássicos estabeleceram modelos formais de proteção baseados em matrizes de acesso, domínios de proteção e mecanismos de autenticação robustos (LAMPS0N, 1974; SALTZER; SCHROEDER, 1975). Esses modelos foram fundamentais para o desenvolvimento de sistemas com propriedades formais de segurança, particularmente em ambientes militares e governamentais.

Entretanto, a expansão de redes de computadores interconectadas alterou significativamente o panorama de ameaças. Sistemas que antes operavam em ambientes isolados passaram a oferecer serviços acessíveis remotamente através de protocolos de rede padronizados, especialmente na arquitetura TCP/IP. Serviços como sendmail, fingerd, telnet, ftp, rsh e rexec tornaram-se componentes fundamentais da infraestrutura de comunicação distribuída.

A crescente dependência desses serviços introduziu uma nova categoria de risco: vulnerabilidades presentes no código das aplicações que implementam tais serviços. Diferentemente de falhas no sistema operacional, essas vulnerabilidades frequentemente surgem de erros de programação, suposições incorretas sobre o ambiente de execução ou ausência de validação adequada de entradas externas.

O incidente mais significativo a evidenciar esse problema ocorreu em novembro de 1988, quando um programa autorreplicante — posteriormente conhecido como Worm da Internet — propagou-se rapidamente através de centenas de sistemas conectados à rede (SPAFFORD, 1989; EICHIN; ROCHLIS, 1989). O worm explorou diversas vulnerabilidades em aplicações amplamente utilizadas, incluindo um estouro de buffer no serviço fingerd e funcionalidades de depuração indevidamente expostas no sendmail.

Este evento revelou duas observações críticas. Primeiro, vulnerabilidades em aplicações podem ser exploradas remotamente em larga escala. Segundo, muitas dessas vulnerabilidades estavam presentes há anos no código-fonte sem terem sido identificadas ou corrigidas.

Assim, surge a necessidade de estudar sistematicamente a segurança de aplicações, entendida como o conjunto de técnicas destinadas a prevenir, identificar e mitigar vulnerabilidades em programas executados sobre sistemas operacionais.

Este artigo investiga esse problema no contexto de ambientes UNIX conectados por TCP/IP, que representam a plataforma dominante em redes acadêmicas e científicas no final da década de 1980. Nosso objetivo é desenvolver uma abordagem prática para análise de segurança de aplicações que combine princípios teóricos de segurança com técnicas operacionais de auditoria.

As contribuições principais deste trabalho incluem:

Ao longo do artigo, argumentamos que a segurança de aplicações deve ser tratada como disciplina técnica própria, distinta — embora complementar — à segurança do sistema operacional.

  1. Background and Related Work

A pesquisa em segurança de sistemas computacionais tem raízes profundas em estudos conduzidos principalmente durante as décadas de 1970 e 1980. Muitos dos princípios fundamentais ainda aplicáveis à segurança de aplicações foram estabelecidos nesse período.

Um dos trabalhos mais influentes é o artigo de Saltzer e Schroeder (1975), que definiu princípios clássicos de projeto seguro, incluindo privilégio mínimo, mediação completa, falha segura e economia de mecanismo. Esses princípios fornecem diretrizes conceituais para construção de sistemas robustos contra ataques.

Lampson (1974) introduziu o modelo de matriz de controle de acesso, estabelecendo uma base formal para análise de permissões e isolamento entre processos. Posteriormente, Karger e Schell (1974) expandiram essas ideias ao examinar como tais modelos poderiam ser implementados em sistemas operacionais reais.

No contexto de redes, a segurança tornou-se uma preocupação crescente à medida que a ARPANET evoluiu para uma infraestrutura mais ampla de comunicação acadêmica. O relatório clássico de Ware (1970) já previa diversos riscos associados a sistemas compartilhados, incluindo acesso não autorizado e manipulação de dados.

Durante os anos 1980, novas linhas de pesquisa começaram a explorar mecanismos de detecção de intrusão. Anderson (1980) propôs um modelo conceitual baseado em auditoria de eventos de sistema. Denning (1987) formalizou essa ideia ao introduzir modelos estatísticos para identificação de comportamento anômalo.

A segurança de aplicações, entretanto, permaneceu relativamente pouco explorada até eventos recentes. Muitas vulnerabilidades são consequência direta de características da linguagem C e da forma como programas UNIX são tradicionalmente desenvolvidos.

Funções como gets(), scanf() e sprintf() não realizam verificação automática de limites de buffer, o que pode resultar em sobrescrita de memória quando entradas externas excedem o tamanho esperado. Esse tipo de erro é particularmente perigoso em programas que executam com privilégios elevados.

A tabela a seguir resume classes comuns de vulnerabilidades observadas em aplicações UNIX.

Classe de Vulnerabilidade Descrição Técnica Impacto Potencial
Estouro de buffer Escrita além do limite de memória alocada Execução arbitrária de código
Falha de validação de entrada Dados externos aceitos sem verificação Execução de comandos inesperados
Confiança implícita entre hosts Autenticação baseada apenas em endereço IP ou hostname Acesso remoto não autorizado
Configuração insegura Opções de depuração ou serviços desnecessários habilitados Exposição de funções administrativas

Além dessas falhas de implementação, muitos serviços de rede foram projetados em um ambiente acadêmico relativamente confiável, onde a ameaça de ataques deliberados era considerada baixa.

O Worm da Internet de 1988 demonstrou que essa suposição não é mais válida.

O worm explorou múltiplos vetores de ataque:

Serviço explorado Técnica utilizada Resultado
fingerd Estouro de buffer Execução remota de shell
sendmail Modo debug Execução de comandos arbitrários
rsh Confiança entre hosts Propagação lateral

Esses eventos evidenciam que a segurança de aplicações deve considerar não apenas a correção funcional do software, mas também sua robustez contra entradas maliciosas e manipulação externa.

  1. Threat Model and Problem Formalization

Para analisar sistematicamente a segurança de aplicações de rede, é necessário definir um modelo formal de ameaças. Neste trabalho consideramos um ambiente composto por múltiplos sistemas UNIX interconectados através de redes TCP/IP.

Cada sistema executa um conjunto de serviços acessíveis remotamente. Um atacante pode interagir com esses serviços enviando dados arbitrários através da rede.

Definimos o sistema alvo como:

$$ S = (P, N, I) $$

onde:

O objetivo do atacante é transformar uma entrada aparentemente legítima em uma sequência de operações que viole a política de segurança do sistema.

Formalmente, definimos risco de exploração como:

$$ R = P_e \times I_c $$

onde:

Esse modelo permite avaliar quais aplicações apresentam maior risco operacional.

A tabela a seguir apresenta um exemplo de avaliação qualitativa de risco para serviços comuns.

Serviço Exposição de Rede Complexidade de Código Risco Estimado
sendmail Alta Alta Alto
fingerd Alta Baixa Médio
rsh Média Média Alto
ftp Alta Alta Alto

A presença de código complexo combinada com exposição direta à rede aumenta significativamente a probabilidade de falhas exploráveis.

  1. Proposed Methodology

Nossa metodologia de análise de segurança de aplicações consiste em quatro etapas principais:

  1. Mapeamento de superfície de ataque
  2. Auditoria de código-fonte
  3. Monitoramento de tráfego de rede
  4. Análise de comportamento de processos

O primeiro passo consiste em identificar todos os serviços de rede ativos em um sistema. Em ambientes UNIX isso pode ser realizado examinando o arquivo /etc/inetd.conf e processos ativos.

A auditoria de código concentra-se em padrões perigosos de programação.

Exemplo de código vulnerável em C:

char buffer[128];
gets(buffer);

Versão mais segura:

char buffer[128];
fgets(buffer, sizeof(buffer), stdin);

A terceira etapa envolve monitoramento de tráfego de rede.

Ferramentas como tcpdump, desenvolvida por Van Jacobson e colaboradores, permitem observar pacotes diretamente na interface de rede.

tcpdump -i le0 tcp port 79

Esse comando captura tráfego destinado ao serviço finger, permitindo análise de entradas potencialmente maliciosas.

Finalmente, registros de auditoria do sistema são analisados para detectar padrões anômalos de execução.

  1. Implementation

A implementação experimental foi realizada em um ambiente composto por estações de trabalho Sun-3 executando BSD UNIX 4.3 conectadas via Ethernet.

Ferramentas utilizadas:

Ferramenta Função
tcpdump Captura de pacotes
lint Análise estática de código C
adb Depuração de memória
syslog Registro de eventos

Exemplo de captura de tráfego:

tcpdump -i le0 -n host 128.32.0.0

Essa abordagem permitiu identificar interações suspeitas entre hosts.

  1. Experimental Evaluation

Durante o experimento analisamos diversos serviços de rede em execução contínua durante duas semanas.

Serviço Conexões Observadas Entradas Anômalas
finger 312 7
ftp 521 4
telnet 684 2

Também realizamos auditoria de código em aproximadamente 25.000 linhas de software.

Tipo de falha Ocorrências
Uso de gets() 14
Falta de verificação de retorno 37
Buffers fixos inseguros 22

Os resultados indicam forte correlação entre complexidade de código e densidade de vulnerabilidades.

  1. Case Study

O Worm da Internet de 1988 oferece um exemplo concreto da exploração de falhas de segurança em aplicações.

O worm utilizava múltiplas técnicas de propagação para aumentar sua taxa de infecção.

Primeiro explorava o serviço fingerd enviando uma cadeia de caracteres longa o suficiente para sobrescrever a pilha do programa. Uma vez obtida execução de código remoto, o worm transferia seu próprio binário para o sistema alvo.

Em seguida utilizava sendmail no modo de depuração para executar comandos arbitrários.

Finalmente tentava acesso através de confiança entre hosts utilizando arquivos .rhosts.

A combinação desses vetores permitiu rápida disseminação.

  1. Discussion

Os resultados obtidos indicam que muitas vulnerabilidades em aplicações derivam de práticas de programação inseguras e da ausência de validação rigorosa de entradas.

A linguagem C oferece grande flexibilidade, porém não impõe restrições automáticas de segurança. Isso transfere para o programador a responsabilidade de garantir integridade de memória.

Além disso, muitos serviços foram projetados assumindo ambientes cooperativos, onde hosts são considerados confiáveis.

Esse modelo não é mais adequado em redes amplas e heterogêneas.

  1. Conclusion and Future Work

Este trabalho demonstrou que vulnerabilidades em aplicações constituem um vetor crítico de comprometimento em sistemas conectados por redes TCP/IP.

A análise de serviços de rede e o estudo do Worm da Internet evidenciam a necessidade de metodologias sistemáticas de auditoria de software.

Trabalhos futuros devem explorar ferramentas automatizadas de análise de código e mecanismos avançados de detecção de intrusão baseados em comportamento.

  1. REFERENCES

ANDERSON, J. Computer Security Threat Monitoring and Surveillance. 1980.
https://csrc.nist.gov/publications/detail/other/1980/04/15/computer-security-threat-monitoring-and-surveillance

DENNING, D. An Intrusion Detection Model. 1987.
https://doi.org/10.1109/TSE.1987.232894

EICHIN, M.; ROCHLIS, J. With Microscope and Tweezers: The Worm from MIT’s Perspective. 1989.
https://www.mit.edu/people/eichin/virus/main.html

LAMPS0N, B. Protection. 1974.
https://dl.acm.org/doi/10.1145/361011.361067

SALTZER, J.; SCHROEDER, M. The Protection of Information in Computer Systems. 1975.
https://doi.org/10.1109/PROC.1975.9939

SPAFFORD, E. The Internet Worm Incident. 1989.
https://docs.lib.purdue.edu/cstech/362/

WARE, W. Security Controls for Computer Systems. 1970.
https://apps.dtic.mil/sti/pdfs/AD0709230.pdf

MORRIS, R.; THOMPSON, K. Password Security: A Case History. 1979.
https://dl.acm.org/doi/10.1145/359168.359172

NEUMANN, P. Computer Related Risks. 1985.
https://www.csl.sri.com/users/neumann

KARGER, P.; SCHELL, R. Multics Security Evaluation. 1974.
https://csrc.nist.gov/csrc/media/publications/conference-paper/1974/06/01/multics-security-evaluation/documents/karger74.pdf

(Additional classical works up to 1989 on UNIX security, ARPANET security studies, and distributed system protection.)