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)
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.
- 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 é:
- Identificar classes recorrentes de vulnerabilidades em aplicações de rede.
- Formalizar um modelo de ameaça adequado ao contexto da Internet de 1989.
- Desenvolver uma metodologia prática para análise e teste de segurança de aplicações.
- Avaliar empiricamente a eficácia de contramedidas de desenvolvimento seguro.
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.
- 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.
- 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:
- Capacidade de estabelecer conexões TCP remotas.
- Capacidade de enviar entradas arbitrárias para aplicações.
- Capacidade de observar respostas do sistema.
Formalmente, podemos representar uma aplicação como função:
$$ A : I \rightarrow O $$
onde:
- $I$ representa o espaço de entradas possíveis.
- $O$ representa o espaço de saídas.
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.
- Proposed Methodology
Nossa metodologia de avaliação de segurança consiste em quatro etapas principais:
- Análise estática de código
- Inspeção de binários
- Teste ativo em rede
- Análise de privilégios
Durante a análise de código C, buscamos padrões perigosos como:
gets()strcpy()sprintf()
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.
- 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.
- 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% |
- 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.
- 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.
- 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.
- 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