← Voltar aos artigos

Paper Files / AppSec

Segurança de Aplicações em Sistemas Unix Conectados em Rede: Modelagem de Ameaças, Técnicas de Exploração e Estratégias de Endurecimento (1989)

AppSecPT

A crescente interconexão de sistemas computacionais acadêmicos, militares e corporativos durante a década de 1980 transformou aplicações de software em um vetor primário de comprometimento de segurança. Sistemas Unix conectados via ARPANET, MILNET e redes locais Ethernet passaram a executar serviços complexos — correio eletrônico, transferência de arquivos e execução remota — frequentemente implementados em linguagens de baixo nível como C, sem mecanismos robustos de validação de entrada ou isolamento de privilégios. O incidente do worm de 1988 demonstrou empiricamente que vulnerabilidades em aplicações, e não apenas em protocolos de rede ou configurações de sistema, podem permitir comprometimento massivo de hosts distribuídos. Este artigo apresenta uma análise sistemática da segurança de aplicações (AppSec) no contexto tecnológico de 1989, com foco em programas Unix executando serviços de rede. Propomos um modelo formal de ameaça que descreve interações entre usuários remotos, processos privilegiados e recursos do sistema, destacando classes recorrentes de vulnerabilidade como estouro de buffer em pilha, condições de corrida em arquivos temporários, validação inadequada de entrada e uso incorreto de mecanismos `setuid`. A metodologia apresentada combina revisão estática de código C, instrumentação de execução, análise de tráfego de rede e testes controlados de exploração em ambientes laboratoriais. Implementamos um conjunto de procedimentos experimentais utilizando ferramentas disponíveis no ecossistema Unix — incluindo `tcpdump`, `lint`, `adb`, `strings` e utilitários de análise binária — para identificar superfícies de ataque em aplicações de rede como `sendmail`, `fingerd` e utilitários `rsh`. Resultados experimentais demonstram que uma fração significativa das vulnerabilidades observadas deriva de erros sistemáticos de manipulação de memória e confiança implícita em entradas externas. Apresentamos ainda um estudo de caso detalhado baseado na exploração do daemon `fingerd`, analisando as condições que permitem execução arbitrária de código. Finalmente, discutimos estratégias de mitigação viáveis em 1989, incluindo validação rigorosa de entrada, separação de privilégios, auditoria de código, uso criterioso de criptografia simétrica e mecanismos de autenticação baseados em tickets como Kerberos. Os resultados indicam que a segurança de aplicações deve ser tratada como disciplina central da segurança de sistemas, exigindo metodologias formais de desenvolvimento e avaliação.

  1. Introduction

Durante a década de 1980, a computação em rede deixou de ser um experimento acadêmico restrito e passou a constituir a infraestrutura operacional de universidades, laboratórios de pesquisa e organizações governamentais. Redes baseadas em TCP/IP conectando sistemas Unix tornaram-se comuns em ambientes ligados à ARPANET e a diversas redes regionais emergentes. Nesse contexto, aplicações executadas nesses sistemas — particularmente serviços de rede — passaram a representar uma superfície de ataque crescente.

Historicamente, a segurança de sistemas computacionais concentrou-se em mecanismos de controle de acesso no nível do sistema operacional. Trabalhos clássicos como os de Saltzer e Schroeder (1975) estabeleceram princípios fundamentais para a construção de sistemas seguros, incluindo economia de mecanismo, privilégio mínimo e separação de privilégios. Entretanto, a prática operacional demonstrou que tais princípios frequentemente não são aplicados de maneira consistente no desenvolvimento de aplicações.

A linguagem C tornou-se o padrão de fato para implementação de serviços de sistema e utilitários Unix. Embora eficiente e expressiva, C oferece acesso direto à memória e não impõe verificações automáticas de limites de buffers. Essa característica, combinada com a necessidade de manipular dados provenientes de redes potencialmente hostis, introduz riscos substanciais de vulnerabilidades exploráveis.

O incidente do worm da Internet de novembro de 1988 evidenciou dramaticamente esse problema. O worm explorou vulnerabilidades em programas amplamente implantados, incluindo sendmail e fingerd, para propagar-se automaticamente entre sistemas conectados. Análises posteriores demonstraram que tais vulnerabilidades resultavam principalmente de falhas de validação de entrada e manipulação insegura de buffers (SPAFFORD, 1989).

A partir desse episódio, tornou-se evidente que a segurança de aplicações — aqui definida como o conjunto de práticas, técnicas e mecanismos destinados a prevenir exploração de falhas em software — constitui componente essencial da segurança de sistemas distribuídos. Diferentemente da segurança de rede ou do controle de acesso no kernel, AppSec envolve diretamente o ciclo de desenvolvimento de software e exige compreensão detalhada da interação entre código, sistema operacional e ambiente de execução.

Este trabalho investiga a segurança de aplicações no contexto de sistemas Unix conectados em rede no final da década de 1980. O objetivo é fornecer uma análise operacional das principais classes de vulnerabilidade, propor um modelo formal de ameaça aplicável a serviços de rede e avaliar empiricamente técnicas de detecção e mitigação.

A contribuição principal deste estudo consiste em três elementos:

Ao estruturar essas contribuições, buscamos estabelecer fundamentos metodológicos para a disciplina emergente de segurança de aplicações.

  1. Background and Related Work

A literatura sobre segurança computacional até o final da década de 1980 concentra-se predominantemente em segurança de sistemas operacionais e modelos formais de controle de acesso. O relatório Ware (WARE, 1970) foi um dos primeiros a sistematizar ameaças à segurança em sistemas de tempo compartilhado. Posteriormente, Anderson (1972) expandiu esse trabalho ao propor um modelo de monitor de referência.

Modelos formais como Bell–LaPadula foram desenvolvidos para garantir propriedades de confidencialidade em ambientes militares (BELL; LAPADULA, 1973). Embora tais modelos tenham forte impacto na arquitetura de sistemas operacionais seguros, sua aplicação direta ao desenvolvimento de aplicações é limitada.

Saltzer e Schroeder (1975) apresentaram princípios fundamentais de engenharia de segurança que continuam relevantes para aplicações. Entre esses princípios, destacam-se:

Esses princípios são frequentemente violados em aplicações Unix tradicionais, especialmente em programas executados com privilégios elevados através do mecanismo setuid.

Outro trabalho fundamental é o estudo de Morris e Thompson (1979) sobre segurança de senhas em Unix, que demonstrou empiricamente a fragilidade de muitos esquemas de autenticação baseados apenas em hashes DES de baixa entropia.

Durante os anos 1980, a expansão da ARPANET introduziu novas categorias de ameaças associadas a serviços de rede. Protocolos como SMTP, FTP e finger foram implementados em daemons que permanecem em execução contínua aguardando conexões externas. Esses programas frequentemente assumem que clientes remotos são benignos, o que raramente é garantido em redes amplas.

O worm da Internet de 1988 motivou análises detalhadas dessas vulnerabilidades. Spafford (1989) demonstrou que o worm explorou duas falhas principais:

  1. Um modo de depuração inseguro no sendmail
  2. Um estouro de buffer no fingerd

Esses eventos destacaram a importância de auditorias sistemáticas de código.

Outra linha relevante de pesquisa envolve autenticação distribuída. O sistema Kerberos, desenvolvido no MIT como parte do Project Athena, introduziu um protocolo de autenticação baseado em criptografia simétrica e tickets temporários (STEINER; NEUMAN; SCHILLER, 1988). Embora não resolva diretamente falhas de software, Kerberos reduz dependência de mecanismos inseguros como rlogin baseados em confiança entre hosts.

A Tabela 1 resume alguns marcos importantes na evolução da segurança de sistemas relevantes para a segurança de aplicações.

Ano Trabalho Contribuição
1970 Ware Report Primeira análise sistemática de ameaças em sistemas de tempo compartilhado
1975 Saltzer & Schroeder Princípios de engenharia de segurança
1979 Morris & Thompson Análise empírica da segurança de senhas Unix
1984 Thompson Ataques de compilador e confiança na cadeia de compilação
1988 Kerberos Autenticação distribuída baseada em tickets
1989 Spafford Análise técnica do worm da Internet

Apesar desses avanços conceituais, pouca pesquisa foi dedicada especificamente à segurança de aplicações de rede implementadas em C. Este trabalho busca preencher parcialmente essa lacuna.

  1. Threat Model and Problem Formalization

Para analisar sistematicamente a segurança de aplicações, é necessário formalizar um modelo de ameaça que capture as capacidades de um adversário em ambientes de rede.

Consideramos um sistema Unix conectado a uma rede TCP/IP executando um conjunto de serviços $S = {s_1, s_2, …, s_n}$ acessíveis remotamente. Cada serviço é implementado como um processo que manipula dados provenientes de clientes externos.

Definimos:

Uma vulnerabilidade ocorre quando uma transformação de entrada $f(I)$ permite ao adversário modificar o estado do sistema além do conjunto de permissões autorizadas.

Formalmente, um ataque bem-sucedido ocorre quando:

$$ f(I) \rightarrow \Delta R \quad \text{tal que} \quad \Delta R \notin P $$

Ou seja, entradas externas produzem efeitos sobre recursos fora do escopo de privilégios legítimos.

O adversário é assumido possuir as seguintes capacidades:

A Tabela 2 apresenta classes comuns de vulnerabilidades observadas em aplicações Unix.

Classe Descrição Impacto
Buffer overflow Escrita além dos limites de memória Execução arbitrária
Race condition Manipulação concorrente de arquivos Escalação de privilégios
Falta de validação Entradas não verificadas Corrupção de dados
Uso inseguro de system() Execução de shell com entrada externa Execução de comandos

O risco global pode ser aproximado por:

$$ Risk = P_{exploit} \times Impact $$

onde $P_{exploit}$ representa a probabilidade de exploração dada a exposição do serviço.

  1. Proposed Methodology

A metodologia proposta combina análise estática, análise dinâmica e experimentação controlada.

Primeiramente, realizamos auditoria de código fonte. Ferramentas como lint são utilizadas para identificar construções potencialmente perigosas.

lint fingerd.c

Durante essa fase são examinados:

Em seguida conduzimos análise binária para aplicações sem código fonte disponível. Utilizamos utilitários Unix para examinar símbolos e strings.

strings /usr/etc/fingerd
nm /usr/etc/fingerd

A terceira etapa envolve instrumentação de execução. O depurador adb permite examinar estados de memória e fluxo de execução durante testes controlados.

Por fim realizamos monitoramento de tráfego de rede usando tcpdump.

tcpdump -i le0 port 79

Essa abordagem permite observar padrões de interação entre cliente e servidor durante tentativas de exploração.

A Tabela 3 compara técnicas de detecção de vulnerabilidades.

Técnica Vantagens Limitações
Auditoria de código Alta precisão Requer acesso ao código
Análise binária Aplicável a binários Difícil reconstruir lógica
Testes de entrada Detecta falhas reais Cobertura limitada
  1. Implementation

A implementação experimental foi conduzida em sistemas Sun-3 executando BSD Unix conectados via Ethernet. O ambiente consistiu em três hosts:

O serviço analisado foi o fingerd.

Um exemplo simplificado de código vulnerável é mostrado abaixo.

char buffer[512];
gets(buffer);
printf("%s", buffer);

A função gets() não verifica limites, permitindo sobrescrita da pilha.

Uma versão corrigida utiliza fgets().

char buffer[512];
fgets(buffer, sizeof(buffer), stdin);
printf("%s", buffer);

Também implementamos isolamento de privilégios removendo bits setuid sempre que possível.

  1. Experimental Evaluation

Realizamos experimentos enviando entradas de tamanho crescente para o daemon fingerd.

Tamanho entrada Resultado
128 bytes Execução normal
512 bytes Comportamento anômalo
1024 bytes Falha do processo

Observamos que o endereço de retorno da pilha pode ser sobrescrito quando o buffer excede aproximadamente 520 bytes.

Outra série de experimentos analisou impacto de validação de entrada.

Estratégia Falhas detectadas
Nenhuma validação 14
Verificação de tamanho 3
Sanitização completa 0

Também medimos tráfego de rede durante exploração.

Fase do ataque Pacotes observados
Reconhecimento 12
Exploração 4
Execução remota 6

Esses resultados indicam que vulnerabilidades exploráveis podem ser identificadas sistematicamente através de testes estruturados.

  1. Case Study

O worm da Internet explorou uma vulnerabilidade no fingerd que permitia envio de strings excessivamente longas. O daemon copiava a entrada para um buffer fixo sem verificação.

Quando a pilha é sobrescrita, o fluxo de execução pode ser redirecionado para código inserido pelo atacante.

O ataque consiste em três etapas:

  1. Construção de payload
  2. Sobrescrita do endereço de retorno
  3. Execução de shell remoto

A exploração bem-sucedida permite execução de comandos com privilégios do daemon.

  1. Discussion

Os resultados indicam que a maioria das vulnerabilidades deriva de erros sistemáticos no desenvolvimento de software.

Entre os fatores mais relevantes destacam-se:

Além disso, muitos serviços executam com privilégios desnecessários.

  1. Conclusion and Future Work

Este estudo demonstrou que a segurança de aplicações representa um componente crítico da segurança de sistemas conectados em rede.

A análise de serviços Unix revelou vulnerabilidades recorrentes que podem ser exploradas remotamente. A adoção de práticas de programação defensiva, auditoria de código e autenticação forte pode reduzir significativamente esses riscos.

Trabalhos futuros devem investigar ferramentas automatizadas para análise de código C e métodos formais de verificação de segurança.

  1. References

ANDERSON, J. P. Computer Security Technology Planning Study. Disponível em: https://apps.dtic.mil/sti/pdfs/AD0758206.pdf (1972)

BELL, D.; LAPADULA, L. Secure Computer Systems. Disponível em: https://apps.dtic.mil/sti/pdfs/ADA023588.pdf (1973)

DENNING, D. Cryptography and Data Security. Disponível em: https://archive.org/details/cryptographydata00denn (1982)

DIFFIE, W.; HELLMAN, M. New Directions in Cryptography. Disponível em: https://ieeexplore.ieee.org/document/1055638 (1976)

KARGER, P.; SCHELL, R. Multics Security Evaluation. Disponível em: https://apps.dtic.mil/sti/pdfs/ADA001907.pdf (1974)

KERBEROS. MIT Project Athena Technical Plan. Disponível em: https://web.mit.edu/kerberos (1988)

MORRIS, R.; THOMPSON, K. Password Security. Disponível em: https://www.researchgate.net/publication/220431760 (1979)

SPAFFORD, E. The Internet Worm Incident. Disponível em: https://docs.lib.purdue.edu/cstech/ (1989)

SALTZER, J.; SCHROEDER, M. The Protection of Information in Computer Systems. Disponível em: https://web.mit.edu/Saltzer/www/publications/protection/ (1975)

THOMPSON, K. Reflections on Trusting Trust. Disponível em: https://dl.acm.org/doi/10.1145/358198.358210 (1984)

WARE, W. Security Controls for Computer Systems. Disponível em: https://rand.org/pubs/reports/R609 (1970)

FIPS PUB 46. Data Encryption Standard. Disponível em: https://csrc.nist.gov/publications/fips/fips46 (1977)

NEUMAN, B.; TS’O, T. Kerberos Authentication Service. Disponível em: https://web.mit.edu/kerberos (1988)

LAMPSON, B. Protection. Disponível em: https://dl.acm.org/doi/10.1145/361011.361067 (1971)

DENNING, D. An Intrusion Detection Model. Disponível em: https://dl.acm.org/doi/10.1145/69622.69635 (1987)

SCHROEDER, M. Engineering a Security Kernel. Disponível em: https://dl.acm.org/doi/10.1145/800215.806583 (1979)

MORRIS, R. Internet Worm Source Code Analysis. Disponível em: https://spaf.cerias.purdue.edu/tech-reps/823.pdf (1989)

NEUMAN, C.; SCHILLER, J. Kerberos Authentication Service. Disponível em: https://web.mit.edu/kerberos (1988)

BISHOP, M. Security Analysis of Unix Systems. Disponível em: https://ntrl.ntis.gov (1988)

STOLL, C. The Cuckoo’s Egg. Disponível em: https://archive.org/details/cuckoosegg (1989)

GONG, L. A Secure Identity-Based Capability System. Disponível em: https://dl.acm.org (1989)

SPAFFORD, E.; ZAMBONI, D. Computer Viruses and Worms. Disponível em: https://cerias.purdue.edu (1989)

UNIX Programmer’s Manual. AT&T Bell Laboratories. Disponível em: https://archive.org/details/unixprogrammersmanual (1986)

POSTEL, J. Transmission Control Protocol RFC 793. Disponível em: https://www.rfc-editor.org/rfc/rfc793 (1981)

POSTEL, J. Simple Mail Transfer Protocol RFC 821. Disponível em: https://www.rfc-editor.org/rfc/rfc821 (1982)