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)
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.
- 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:
- Um modelo de ameaças específico para aplicações de rede em ambientes UNIX.
- Uma metodologia prática de auditoria de segurança baseada em análise de código e monitoramento de rede.
- Avaliação experimental de serviços de rede comuns.
- Estudo de caso detalhado baseado no Worm da Internet de 1988.
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.
- 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.
- 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:
- $P$ representa o conjunto de processos em execução
- $N$ representa as interfaces de rede
- $I$ representa os fluxos de entrada aceitos pelas aplicações
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:
- $P_e$ é a probabilidade de exploração de uma vulnerabilidade
- $I_c$ é o impacto da exploração no sistema comprometido
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.
- Proposed Methodology
Nossa metodologia de análise de segurança de aplicações consiste em quatro etapas principais:
- Mapeamento de superfície de ataque
- Auditoria de código-fonte
- Monitoramento de tráfego de rede
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.)