← Voltar aos artigos

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)

AppSecPT

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.

  1. 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.

  1. 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:

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.

  1. 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:

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
  1. Proposed Methodology

A metodologia proposta consiste em três fases operacionais.

  1. 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
  1. 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.

  1. Auditoria de configuração

Execução de COPS para identificar falhas administrativas.

./cops -v

O relatório identifica:

  1. 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.

  1. 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
  1. 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:

  1. Conexão TCP ao serviço finger
  2. Envio de string longa
  3. Sobrescrita da pilha
  4. Execução de shell remoto

Esse mecanismo foi utilizado pelo worm de 1988 para propagação automática.

  1. 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.

  1. 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