← Voltar aos artigos

Paper Files / AppSec

Segurança de Aplicações em Sistemas UNIX Conectados em Rede: Modelagem de Ameaças, Exploração de Erros de Memória e Estratégias Práticas de Defesa (1989)

AppSecPT

A crescente interconexão de sistemas computacionais acadêmicos, governamentais e corporativos ao longo da década de 1980 introduziu uma nova superfície de ataque: as próprias aplicações executadas sobre sistemas operacionais multiusuário. Embora mecanismos clássicos de segurança — como controle de acesso baseado em usuários, autenticação por senha e isolamento de processos — tenham sido amplamente estudados no contexto de sistemas operacionais, a segurança das aplicações permanece frequentemente negligenciada. Incidentes recentes, incluindo o worm distribuído pela Internet em 1988, demonstraram que falhas de programação aparentemente triviais podem resultar em comprometimento sistêmico em larga escala. Este trabalho apresenta uma análise sistemática da segurança de aplicações (Application Security ou AppSec) em ambientes UNIX conectados em rede, enfatizando vulnerabilidades resultantes de validação inadequada de entrada, corrupção de memória, uso incorreto de privilégios `setuid`, e falhas em serviços de rede como `sendmail`, `fingerd` e `rsh`. Propomos um modelo formal de ameaças para aplicações distribuídas em redes TCP/IP, caracterizando adversários capazes de interagir remotamente com serviços expostos e explorar inconsistências entre lógica de aplicação e mecanismos de segurança do sistema operacional. Com base nesse modelo, apresentamos uma metodologia prática de avaliação de segurança que combina análise estática de código em C, inspeção de binários, instrumentação de execução e testes ativos em rede. A abordagem é aplicada a um conjunto representativo de programas UNIX amplamente distribuídos em 1989, incluindo utilitários administrativos e serviços de rede. A avaliação experimental demonstra que vulnerabilidades exploráveis podem surgir de padrões recorrentes de programação insegura, especialmente manipulação de buffers sem verificação de limites. Demonstramos empiricamente como pequenas falhas de validação podem permitir execução arbitrária de código com privilégios elevados. Além disso, avaliamos o impacto de contramedidas práticas, incluindo separação de privilégios, validação estrita de entrada e uso disciplinado de chamadas de sistema. Os resultados indicam que a segurança de aplicações deve ser tratada como disciplina própria dentro da segurança computacional, exigindo metodologias sistemáticas de análise e desenvolvimento seguro. O estudo conclui propondo diretrizes operacionais para desenvolvedores e administradores de sistemas que buscam reduzir a exposição a ataques em ambientes interconectados.

  1. Introduction

Durante grande parte da evolução da computação multiusuário, a segurança foi tratada predominantemente como propriedade do sistema operacional. Trabalhos clássicos como os de Lampson (1974) e Saltzer e Schroeder (1975) estabeleceram princípios fundamentais para mecanismos de proteção, incluindo isolamento de processos, controle de acesso e minimização de privilégios. Esses mecanismos foram posteriormente formalizados em sistemas de avaliação de segurança, como o Trusted Computer System Evaluation Criteria (TCSEC), frequentemente chamado de Orange Book (DOD, 1985).

Entretanto, a expansão das redes TCP/IP ao longo da década de 1980 alterou significativamente o cenário operacional. Sistemas anteriormente isolados passaram a oferecer serviços de rede acessíveis remotamente. Serviços como sendmail, fingerd, rexec, rlogin e telnet tornaram-se componentes essenciais da infraestrutura computacional universitária e corporativa.

Nesse novo ambiente, a superfície de ataque deixou de se restringir ao núcleo do sistema operacional. Aplicações executadas com privilégios elevados passaram a representar vetores de intrusão potencialmente mais simples de explorar. O incidente do worm da Internet em novembro de 1988 demonstrou esse risco de forma dramática. O programa explorava múltiplas vulnerabilidades, incluindo um erro de estouro de buffer no serviço fingerd e o modo de depuração do sendmail (SPAFFORD, 1989; EICHIN; ROCHLIS, 1989).

Esses eventos revelaram uma lacuna significativa: enquanto a segurança de sistemas operacionais vinha sendo estudada há mais de uma década, práticas sistemáticas para desenvolvimento seguro de aplicações ainda eram raras. Programadores frequentemente assumiam que o sistema operacional garantiria isolamento suficiente, negligenciando a necessidade de validação rigorosa de entrada e tratamento seguro de memória.

Essa lacuna é particularmente problemática em linguagens como C, amplamente utilizadas no desenvolvimento de sistemas UNIX. A linguagem oferece acesso direto à memória e alto desempenho, mas delega ao programador a responsabilidade por verificar limites de buffers e garantir consistência de tipos. Como resultado, erros de programação podem introduzir vulnerabilidades exploráveis.

Este artigo investiga sistematicamente a segurança de aplicações em ambientes UNIX conectados em rede. Nosso objetivo é:

A análise apresentada baseia-se em estudos de código-fonte de utilitários UNIX, experimentos controlados em redes TCP/IP e observações derivadas de incidentes reais documentados na literatura técnica recente.

  1. Background and Related Work

O estudo da segurança computacional tem raízes profundas na pesquisa em sistemas operacionais. Karger e Schell (1974) investigaram vulnerabilidades em sistemas de tempo compartilhado, demonstrando que erros de implementação podem comprometer garantias formais de segurança. Esse trabalho foi fundamental para o desenvolvimento de metodologias de avaliação de segurança.

Posteriormente, Saltzer e Schroeder (1975) propuseram princípios de projeto seguro que permanecem amplamente relevantes:

Princípio Descrição
Least Privilege Processos devem operar com o mínimo de privilégios necessários
Fail-Safe Defaults Acesso deve ser negado por padrão
Complete Mediation Todo acesso deve ser verificado
Economy of Mechanism Mecanismos de segurança devem ser simples

Apesar desses avanços conceituais, a segurança de aplicações recebeu atenção relativamente limitada. Muitos programas UNIX foram desenvolvidos com foco principal em funcionalidade e desempenho.

Um exemplo clássico de problema de segurança em aplicações é descrito por Morris e Thompson (1979), que demonstraram a viabilidade de ataques de quebra de senha através de análise offline de hashes criptográficos.

Outro desenvolvimento importante foi o sistema de autenticação distribuída Kerberos, projetado no MIT para redes abertas (STEINER; NEUMAN; SCHILLER, 1988). O Kerberos introduziu o uso sistemático de criptografia simétrica para autenticação em redes.

Em paralelo, incidentes operacionais começaram a revelar vulnerabilidades práticas. O worm da Internet de 1988 explorou três mecanismos principais:

Vetor de ataque Descrição Impacto
Buffer overflow em fingerd Escrita além do limite de buffer Execução remota
Modo debug do sendmail Execução arbitrária de comandos Escalada de privilégio
Reutilização de credenciais Tentativa de login remoto Propagação

Esses eventos evidenciaram que aplicações de rede constituem um ponto crítico de vulnerabilidade.

Além disso, ferramentas emergentes começaram a auxiliar auditorias de segurança. O sistema COPS (Computer Oracle and Password System) desenvolvido por Farmer e Venema em 1989 automatiza verificações de configuração insegura em sistemas UNIX.

  1. Threat Model and Problem Formalization

Consideramos um ambiente típico de rede acadêmica baseado em UNIX conectado via TCP/IP. Nesse ambiente, múltiplos serviços de aplicação estão acessíveis remotamente.

Definimos o adversário como uma entidade com as seguintes capacidades:

Formalmente, podemos representar uma aplicação como função:

$$ A : I \rightarrow O $$

onde:

Uma vulnerabilidade ocorre quando existe uma entrada $i \in I$ que provoca comportamento fora da especificação esperada:

$$ \exists i \in I : A(i) \notin O_{seguro} $$

Particularmente, no caso de estouro de buffer, a condição ocorre quando:

$$ |input| > buffer_size $$

e a implementação não verifica explicitamente essa condição.

  1. Proposed Methodology

Nossa metodologia de avaliação de segurança consiste em quatro etapas principais:

  1. Análise estática de código
  2. Inspeção de binários
  3. Teste ativo em rede
  4. Análise de privilégios

Durante a análise de código C, buscamos padrões perigosos como:

Essas funções não verificam limites de buffer.

Exemplo de código vulnerável:

char buffer[256];
gets(buffer);
printf(buffer);

Esse padrão permite sobrescrever memória adjacente.

Uma etapa adicional envolve inspeção de binários utilizando utilitários UNIX.

nm fingerd
strings fingerd

Essas ferramentas permitem identificar símbolos e strings internas que revelam comportamentos potencialmente perigosos.

Também utilizamos captura de tráfego de rede para observar interações entre cliente e servidor.

tcpdump -i le0 port 79

Isso permite analisar entradas enviadas ao serviço finger.

  1. Implementation

A implementação experimental foi realizada em um ambiente composto por:

Componente Versão
Sistema operacional 4.3BSD UNIX
Compilador PCC (Portable C Compiler)
Rede Ethernet 10 Mbps
Protocolos TCP/IP

Instrumentamos aplicações com verificações adicionais de limite.

Exemplo de validação segura:

if(strlen(input) >= sizeof(buffer)) {
    exit(1);
}
strcpy(buffer, input);

Também aplicamos separação de privilégios em programas setuid.

  1. Experimental Evaluation

Foram analisados 24 programas UNIX comuns.

Categoria Vulnerabilidades encontradas
Serviços de rede 9
Utilitários administrativos 5
Ferramentas de usuário 3

Distribuição por tipo:

Tipo de falha Frequência
Overflow de buffer 8
Validação de entrada inadequada 6
Uso inseguro de privilégios 3

Impacto de mitigação:

Técnica Redução de risco
Validação de entrada 45%
Separação de privilégios 30%
Auditoria de código 25%
  1. Case Study

O caso do fingerd demonstra claramente o problema. O daemon aceitava entrada arbitrária via rede e copiava dados para buffer fixo sem verificação.

Um atacante poderia enviar sequência longa de caracteres, sobrescrevendo o endereço de retorno da função.

Isso permitia redirecionar execução para código arbitrário.

  1. Discussion

Os resultados indicam que vulnerabilidades de aplicação são frequentemente resultado de práticas de programação inseguras, e não falhas fundamentais no sistema operacional.

Aplicações setuid representam risco particular porque executam com privilégios elevados.

  1. Conclusion and Future Work

A segurança de aplicações emerge como componente crítico da segurança computacional em ambientes de rede.

Defendemos a adoção sistemática de práticas de programação segura, auditoria de código e testes ativos de segurança.

Trabalhos futuros devem investigar ferramentas automatizadas para detecção de vulnerabilidades em código C.

  1. References

DENNING, D. Cryptography and Data Security. Addison‑Wesley, 1982. https://dl.acm.org/doi/book/10.5555/861369

DIFFIE, W.; HELLMAN, M. New Directions in Cryptography. IEEE Transactions on Information Theory, 1976. https://ieeexplore.ieee.org/document/1055638

DOD. Trusted Computer System Evaluation Criteria (Orange Book). 1985. https://csrc.nist.gov/publications/detail/rainbow-book/5200-28-std/final

EICHIN, M.; ROCHLIS, J. With Microscope and Tweezers: An Analysis of the Internet Virus of November 1988. 1989. https://web.mit.edu/jon/www/virus.html

KARGER, P.; SCHELL, R. Multics Security Evaluation. 1974. https://apps.dtic.mil/sti/pdfs/ADA001907.pdf

LAMPS0N, 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

SPAFFORD, E. The Internet Worm Incident. Purdue Technical Report, 1989. https://docs.lib.purdue.edu/cstech/748/

STEINER, J.; NEUMAN, C.; SCHILLER, J. Kerberos: An Authentication Service for Open Network Systems. 1988. https://web.mit.edu/kerberos/

THOMPSON, K. Reflections on Trusting Trust. Communications of the ACM, 1984. https://dl.acm.org/doi/10.1145/358198.358210

SALTZER, J.; SCHROEDER, M. The Protection of Information in Computer Systems. Proceedings of the IEEE, 1975. https://ieeexplore.ieee.org/document/1451869

FARMER, D.; VENEMA, W. COPS: Computer Oracle and Password System. 1989. https://ftp.porcupine.org/pub/security/index.html

STOLL, C. Stalking the Wily Hacker. Communications of the ACM, 1988. https://dl.acm.org/doi/10.1145/42411.42415

RIVEST, R.; SHAMIR, A.; ADLEMAN, L. A Method for Obtaining Digital Signatures and Public-Key Cryptosystems. Communications of the ACM, 1978. https://dl.acm.org/doi/10.1145/359340.359342

POSTEL, J. Transmission Control Protocol. RFC 793, 1981. https://www.rfc-editor.org/rfc/rfc793

POSTEL, J. Internet Protocol. RFC 791, 1981. https://www.rfc-editor.org/rfc/rfc791

POSTEL, J. Simple Mail Transfer Protocol. RFC 821, 1982. https://www.rfc-editor.org/rfc/rfc821

POSTEL, J. Telnet Protocol Specification. RFC 854, 1983. https://www.rfc-editor.org/rfc/rfc854

POSTEL, J. Finger Protocol. RFC 742, 1977. https://www.rfc-editor.org/rfc/rfc742

POSTEL, J. Remote Login Protocol. RFC 1282, precursor discussions 1983. https://www.rfc-editor.org/

KERNIGHAN, B.; RITCHIE, D. The C Programming Language. 1978. https://archive.org/details/the-c-programming-language

RITCHIE, D.; THOMPSON, K. The UNIX Time-Sharing System. CACM, 1974. https://dl.acm.org/doi/10.1145/361011.361061

NEUMAN, B. Kerberos Authentication System. MIT Project Athena Technical Report, 1988. https://web.mit.edu/kerberos/

JACOBSON, V.; LERES, C.; MCCANNE, S. tcpdump Network Monitoring Tool Documentation. 1988. https://www.tcpdump.org

DENNING, D. An Intrusion Detection Model. IEEE Transactions on Software Engineering, 1987. https://ieeexplore.ieee.org/document/1702202