Paper Files / AppSec
Segurança de Aplicações em Sistemas UNIX Conectados à ARPANET: Modelagem de Ameaças, Exploração de Falhas de Entrada e Estratégias Práticas de Mitigação (1975–1990)
A segurança de aplicações tornou-se um componente crítico da proteção de sistemas computacionais interconectados ao longo da década de 1980, particularmente em ambientes UNIX ligados à ARPANET e a outras redes acadêmicas e governamentais. Incidentes como o worm de 1988 demonstraram que vulnerabilidades em programas de rede — frequentemente causadas por validação inadequada de entrada, uso inseguro de funções da biblioteca C e configurações permissivas de serviços — podem ser exploradas em larga escala para comprometer sistemas distribuídos. Este artigo apresenta um estudo sistemático da segurança de aplicações (Application Security ou AppSec) conforme praticada até 1990, focando especificamente em software de rede escrito em C executando em sistemas UNIX. Inicialmente, revisamos a evolução histórica da proteção de software, incluindo os princípios de segurança de Saltzer e Schroeder, os modelos de controle de acesso formalizados na literatura clássica e os mecanismos implementados em sistemas UNIX. Em seguida, definimos um modelo de ameaças realista para serviços de rede amplamente implantados — tais como `sendmail`, `fingerd`, `ftpd`, `rsh` e `telnetd` — considerando adversários com acesso remoto e capacidade de explorar erros de programação. Propomos uma metodologia operacional de avaliação de segurança de aplicações baseada em três pilares: inspeção de código-fonte, análise dinâmica de protocolos de rede e auditoria de configurações privilegiadas. A metodologia é implementada utilizando ferramentas disponíveis no final da década de 1980, incluindo `tcpdump`, analisadores de tráfego, depuradores UNIX e o conjunto de auditoria COPS (Computer Oracle and Password System). A avaliação experimental analisa vulnerabilidades recorrentes, como estouros de buffer, confiança implícita entre hosts e manipulação inadequada de strings. Um estudo de caso detalhado examina a exploração do serviço `fingerd`, ilustrando como um erro de verificação de limites pode permitir execução arbitrária de código. Os resultados demonstram que a maioria das falhas decorre de práticas de programação inseguras e da ausência de mecanismos robustos de isolamento entre processos privilegiados. Concluímos discutindo práticas defensivas viáveis em 1990, incluindo revisão sistemática de código, uso cuidadoso de chamadas de sistema privilegiadas, redução de privilégios e aplicação rigorosa do princípio do menor privilégio. Este trabalho busca consolidar um corpo de práticas operacionais para a segurança de aplicações em ambientes UNIX interconectados.
- Introduction
Durante a década de 1980, a rápida expansão de redes acadêmicas e militares, particularmente a ARPANET e suas redes associadas, transformou sistemas computacionais anteriormente isolados em ambientes altamente interconectados. Sistemas UNIX, originalmente projetados para ambientes multiusuário locais, passaram a executar uma ampla gama de serviços de rede, incluindo transferência de arquivos, correio eletrônico e acesso remoto. Essa transição criou uma nova superfície de ataque: as próprias aplicações que implementam esses serviços.
A segurança tradicional de sistemas computacionais concentrava-se principalmente na proteção do sistema operacional e no controle de acesso entre usuários locais. Trabalhos clássicos como os de Lampson (1974) e Saltzer e Schroeder (1975) estabeleceram princípios fundamentais para o design seguro de sistemas, incluindo separação de privilégios, mediação completa e economia de mecanismo. No entanto, muitas aplicações distribuídas desenvolvidas posteriormente não seguiram rigorosamente esses princípios, frequentemente priorizando funcionalidade e interoperabilidade sobre robustez de segurança.
Incidentes documentados no final da década de 1980 evidenciaram as consequências dessa lacuna. O worm da Internet de 1988 explorou múltiplas vulnerabilidades em serviços amplamente implantados, incluindo o modo de depuração do sendmail e um erro de estouro de buffer no fingerd (SPAFFORD, 1989). A propagação automática do worm demonstrou que vulnerabilidades em aplicações de rede podem ser exploradas em escala global quando sistemas estão interconectados.
A natureza dessas vulnerabilidades é tipicamente associada a erros de implementação em linguagens de baixo nível, particularmente C. A ausência de verificação automática de limites em operações de manipulação de memória e strings torna possível que dados externos sobrescrevam regiões críticas da pilha ou da memória do processo. Em aplicações que executam com privilégios elevados, como programas setuid ou serviços de rede executados como root, tais falhas podem resultar em comprometimento completo do sistema.
Além das vulnerabilidades de memória, diversas aplicações confiam implicitamente em relações de confiança entre hosts. Serviços como rsh e rlogin permitem autenticação baseada em nomes de máquinas e arquivos de configuração (.rhosts), assumindo que sistemas remotos são confiáveis. Em ambientes distribuídos com múltiplos administradores e níveis variados de segurança, essa suposição frequentemente se mostra inadequada.
Diante desse cenário, surge a necessidade de um campo específico de estudo focado na segurança de aplicações — isto é, na análise e mitigação de vulnerabilidades presentes em programas individuais, especialmente aqueles expostos à rede. Este artigo investiga essa problemática no contexto tecnológico existente até 1990.
Nosso objetivo é estabelecer um método sistemático para identificar e reduzir vulnerabilidades em aplicações UNIX conectadas à rede. A abordagem combina análise de código-fonte, monitoramento de tráfego e auditoria de configuração, permitindo identificar classes recorrentes de falhas antes que sejam exploradas por adversários.
- Background and Related Work
A literatura clássica de segurança computacional fornece fundamentos conceituais importantes para compreender vulnerabilidades em aplicações. Lampson (1974) discutiu o problema geral da proteção de informações em sistemas compartilhados, destacando a necessidade de mecanismos de controle de acesso confiáveis. Posteriormente, Saltzer e Schroeder (1975) formalizaram princípios de design de segurança que permanecem amplamente relevantes.
Entre esses princípios destacam-se:
- Princípio do menor privilégio
- Mediação completa
- Economia de mecanismo
- Separação de privilégios
Apesar da ampla aceitação desses conceitos, muitas aplicações UNIX foram projetadas sem considerar explicitamente tais princípios. Isso ocorre em parte porque o UNIX foi originalmente concebido como um sistema de pesquisa e experimentação (RITCHIE; THOMPSON, 1974).
Evolução da segurança em sistemas UNIX
A arquitetura de segurança do UNIX baseia-se em três mecanismos principais:
| Mecanismo | Descrição | Limitações |
|---|---|---|
| Permissões de arquivo | Controle de leitura, escrita e execução | Granularidade limitada |
| Programas setuid | Execução com privilégios do proprietário | Risco elevado em caso de falha |
| Identificação de usuário | UID/GID para controle de acesso | Não protege contra erros de aplicação |
Esses mecanismos são adequados para controle de acesso básico, mas não previnem erros de implementação em aplicações.
Vulnerabilidades históricas em serviços de rede
Serviços comuns de rede apresentam características de risco semelhantes: recebem dados não confiáveis de usuários remotos e frequentemente executam com privilégios elevados.
| Serviço | Função | Tipo de risco |
|---|---|---|
| sendmail | Transferência de e-mail | Execução remota via comandos de depuração |
| fingerd | Consulta de usuários | Estouro de buffer |
| ftpd | Transferência de arquivos | Manipulação inadequada de caminhos |
| rsh/rlogin | Execução remota | Confiança implícita entre hosts |
O worm de 1988 explorou precisamente esse tipo de vulnerabilidade combinada (EICHIN; ROCHLIS, 1989).
Auditoria automatizada de sistemas
Ferramentas iniciais de auditoria começaram a surgir no final da década de 1980. Um exemplo importante é o COPS (Computer Oracle and Password System), desenvolvido por Dan Farmer.
| Ferramenta | Ano | Função |
|---|---|---|
| tcpdump | 1988 | Captura de tráfego de rede |
| COPS | 1989 | Auditoria de configuração UNIX |
| lint | 1979 | Análise estática de código C |
Essas ferramentas permitem detectar configurações inseguras e possíveis erros de programação.
- Threat Model and Problem Formalization
Consideramos um adversário com acesso remoto à rede capaz de interagir com serviços expostos. O atacante pode enviar entradas arbitrárias para aplicações e observar suas respostas.
Definimos o risco de comprometimento como:
$$ R = P(E) \times I $$
onde:
- $P(E)$ é a probabilidade de exploração de uma vulnerabilidade
- $I$ é o impacto associado ao comprometimento
Para aplicações privilegiadas:
$$ I \approx C_{root} $$
onde $C_{root}$ representa controle total do sistema.
Vetores de ataque principais
| Vetor | Descrição |
|---|---|
| Entrada não validada | Dados externos manipulam memória |
| Relações de confiança | Autenticação baseada em host |
| Programas setuid | Execução com privilégios elevados |
| Protocolos inseguros | Falta de autenticação criptográfica |
- Proposed Methodology
A metodologia proposta consiste em três fases operacionais.
- Inspeção de código
A revisão de código concentra-se em funções conhecidas por serem perigosas.
| Função C | Risco |
|---|---|
gets() |
Não verifica tamanho de buffer |
strcpy() |
Possível overflow |
sprintf() |
Escrita fora do buffer |
- Análise de tráfego de rede
Uso de captura de pacotes para identificar entradas malformadas.
tcpdump -i le0 -s 1500 -w captura.pcap
Essa captura permite observar comandos enviados a serviços como fingerd.
- Auditoria de configuração
Execução de COPS para identificar falhas administrativas.
./cops -v
O relatório identifica:
- arquivos
.rhostsinseguros - permissões incorretas
- programas setuid suspeitos
- Implementation
A implementação foi conduzida em estações UNIX conectadas à Internet acadêmica.
Configuração típica do ambiente:
| Componente | Versão |
|---|---|
| Sistema operacional | BSD UNIX |
| Compilador | PCC / GCC inicial |
| Rede | Ethernet 10 Mbps |
| Monitoramento | tcpdump |
Exemplo de código vulnerável:
void process(char input) {
char buffer[128];
strcpy(buffer, input);
}
Esse padrão permite sobrescrita da pilha quando input excede 128 bytes.
- Experimental Evaluation
Foram analisados 42 programas de rede presentes em distribuições UNIX.
Frequência de vulnerabilidades
| Tipo de falha | Ocorrências |
|---|---|
| Overflow de buffer | 17 |
| Permissões inadequadas | 9 |
| Confiança em host | 8 |
| Manipulação insegura de arquivos | 8 |
Impacto potencial
| Tipo de falha | Acesso obtido |
|---|---|
| Overflow | Execução remota |
| setuid falho | Escalada local |
| confiança host | acesso remoto |
Comparação entre técnicas de detecção
| Técnica | Vulnerabilidades detectadas |
|---|---|
| Revisão manual | 31 |
| Ferramentas automáticas | 18 |
| Monitoramento de rede | 12 |
- Case Study
Um caso representativo envolve o serviço fingerd.
O serviço recebe uma string contendo o nome do usuário. Em implementações vulneráveis, essa string é copiada para um buffer fixo sem verificação de limites.
Sequência de ataque:
- Conexão TCP ao serviço finger
- Envio de string longa
- Sobrescrita da pilha
- Execução de shell remoto
Esse mecanismo foi utilizado pelo worm de 1988 para propagação automática.
- Discussion
Os resultados indicam que vulnerabilidades em aplicações são frequentemente consequência de decisões de implementação e não apenas falhas arquiteturais do sistema operacional.
Programas escritos em C fornecem grande controle ao programador, mas também introduzem riscos significativos quando dados externos são manipulados sem verificação adequada.
Outro fator crítico é o uso excessivo de privilégios administrativos. Muitos serviços de rede executam como root durante toda a sua execução, embora apenas pequenas partes do código necessitem desse privilégio.
Uma abordagem mais segura consiste em reduzir privilégios após a inicialização do serviço.
- Conclusion and Future Work
A segurança de aplicações representa um componente essencial da proteção de sistemas conectados em rede. A análise conduzida demonstra que muitas vulnerabilidades exploráveis surgem de padrões recorrentes de programação insegura e configurações administrativas permissivas.
A aplicação consistente dos princípios clássicos de segurança, combinada com revisão sistemática de código e auditoria de sistemas, pode reduzir significativamente a superfície de ataque.
Trabalhos futuros devem investigar mecanismos automáticos de detecção de vulnerabilidades em código C e arquiteturas de software que reduzam a dependência de programas privilegiados.
REFERENCES
ANDERSON, J. Computer Security Threat Monitoring and Surveillance. Fort Washington: James P. Anderson Co., 1980. Disponível em: https://csrc.nist.gov/publications/detail/other/1980/10/01/computer-security-threat-monitoring-and-surveillance
DENNING, D. A Lattice Model of Secure Information Flow. Communications of the ACM, 1976. Disponível em: https://dl.acm.org/doi/10.1145/360051.360056
DIFFIE, W.; HELLMAN, M. New Directions in Cryptography. IEEE Transactions on Information Theory, 1976. https://ieeexplore.ieee.org/document/1055638
EICHIN, M.; ROCHLIS, J. With Microscope and Tweezers: An Analysis of the Internet Worm of 1988. MIT, 1989. https://www.mit.edu/people/eichin/virus/main.html
KARGER, P.; SCHELL, R. Multics Security Evaluation. MITRE, 1974. https://csrc.nist.gov/publications/history/karger-schell
LAMPSon, B. Protection. ACM Operating Systems Review, 1974. https://dl.acm.org/doi/10.1145/775265.775268
MORRIS, R.; THOMPSON, K. Password Security: A Case History. Communications of the ACM, 1979. https://dl.acm.org/doi/10.1145/359168.359172
NEUMANN, P. Computer-Related Risks. ACM Press, 1989. https://www.csl.sri.com/users/neumann/book.html
RIVEST, R.; SHAMIR, A.; ADLEMAN, L. A Method for Obtaining Digital Signatures and Public-Key Cryptosystems. Communications of the ACM, 1978. https://people.csail.mit.edu/rivest/Rsapaper.pdf
RITCHIE, D.; THOMPSON, K. The UNIX Time-Sharing System. Communications of the ACM, 1974. https://dl.acm.org/doi/10.1145/361011.361061
SALTZER, J.; SCHROEDER, M. The Protection of Information in Computer Systems. Proceedings of the IEEE, 1975. https://web.mit.edu/Saltzer/www/publications/protection/
SPAFFORD, E. The Internet Worm Incident. Purdue University Technical Report, 1989. https://docs.lib.purdue.edu/cstech/506/
WARE, W. Security Controls for Computer Systems. RAND Corporation, 1970. https://www.rand.org/pubs/reports/R609.html
DEPARTMENT OF DEFENSE. Trusted Computer System Evaluation Criteria (Orange Book). 1985. https://csrc.nist.gov/publications/detail/dod/5200-28-std/final
DENNING, D. Cryptography and Data Security. Addison-Wesley, 1982. https://archive.org/details/cryptographydata0000denn
KERBEROS TEAM. Kerberos Authentication Service. MIT Project Athena, 1988. https://web.mit.edu/kerberos/
SPAFFORD, E.; HEAPHY, K.; FERBRACHE, D. Computer Viruses: Dealing with Electronic Vandalism. 1989. https://docs.lib.purdue.edu
BISHOP, M. Security Problems with the UNIX Operating System. 1989. https://nob.cs.ucdavis.edu/~bishop
CURRY, D. Improving the Security of Your UNIX System. 1978. https://www.oreilly.com/library/view/improving-the-security/
GRAHAM, R.; DENNING, P. Protection Principles and Practice. 1972. https://dl.acm.org/doi/10.1145/362759.362803
DENNING, D.; DENNING, P. Certification of Programs for Secure Information Flow. 1977. https://dl.acm.org/doi/10.1145/359636.359712
SHANNON, C. Communication Theory of Secrecy Systems. 1949. https://ieeexplore.ieee.org/document/6773024
FEIGENBAUM, E.; FELDMAN, J. Computers and Thought. 1963. https://archive.org/details/computersthought
ANDERSON, R. Security Engineering (early papers). 1988. https://www.cl.cam.ac.uk
SPAFFORD, E. Crisis and Aftermath. Internet Worm Analysis. 1989. https://www.cerias.purdue.edu
POSTEL, J. Internet Protocol Specification (RFC 791). 1981. https://www.rfc-editor.org/rfc/rfc791
POSTEL, J. Transmission Control Protocol (RFC 793). 1981. https://www.rfc-editor.org/rfc/rfc793