Paper Files / AppSec
Segurança de Aplicações em Sistemas Unix Conectados em Rede: Modelagem de Ameaças, Análise de Vulnerabilidades e Práticas de Engenharia Segura no Contexto da Internet Acadêmica de 1989
A rápida expansão de redes TCP/IP interconectadas durante a década de 1980 — particularmente através da ARPANET e de suas redes sucessoras — alterou profundamente o modelo de ameaça enfrentado por sistemas computacionais multiusuário. Aplicações que anteriormente operavam em ambientes isolados passaram a ser expostas a tráfego remoto potencialmente hostil, revelando classes inteiras de vulnerabilidades decorrentes de erros de programação, validação inadequada de entrada e mecanismos de autenticação fracos. O incidente amplamente documentado do worm de Morris em 1988 demonstrou empiricamente que programas de rede amplamente implantados, como `sendmail` e `fingerd`, podiam ser explorados remotamente para obter execução arbitrária de código em sistemas Unix conectados à Internet experimental. Este artigo investiga sistematicamente o problema da segurança de aplicações (Application Security, ou AppSec) no contexto tecnológico de 1989, com foco particular em serviços de rede escritos em C executando em variantes de Unix como BSD 4.2/4.3. Apresentamos um modelo formal de ameaça para serviços de rede baseados em sockets, identificando superfícies de ataque típicas: interfaces de entrada textual, buffers de tamanho fixo, chamadas privilegiadas (`setuid`), relações de confiança entre hosts e dependências de bibliotecas do sistema. Em seguida, propomos uma metodologia de engenharia segura que combina revisão de código, análise estática com ferramentas de compilação, monitoramento de rede e auditoria de configuração. A metodologia é avaliada experimentalmente em um laboratório composto por estações VAX e Sun-3 executando BSD 4.3, onde reproduzimos classes conhecidas de falhas — incluindo estouro de buffer e abuso de comandos administrativos — para avaliar a eficácia de contramedidas como validação rigorosa de entrada, redução de privilégios e isolamento de processos. Resultados experimentais indicam que grande parte das explorações observadas pode ser mitigada através de práticas relativamente simples de desenvolvimento seguro e configuração prudente do sistema. Em particular, mostramos que a probabilidade de comprometimento remoto diminui significativamente quando serviços privilegiados são minimizados e quando a entrada de rede é tratada como dados não confiáveis. O estudo também destaca limitações práticas das ferramentas de segurança disponíveis no final da década de 1980, sugerindo direções futuras para sistemas automatizados de auditoria e detecção de intrusão. Este trabalho busca consolidar princípios de segurança aplicados especificamente ao desenvolvimento e operação de aplicações conectadas em rede, fornecendo uma base metodológica para pesquisadores e administradores responsáveis por proteger sistemas em ambientes acadêmicos e governamentais emergentes da Internet.
- Introduction
A interconexão crescente de sistemas computacionais através de redes baseadas em TCP/IP transformou radicalmente o panorama de segurança da computação ao longo da década de 1980. Originalmente projetada para facilitar colaboração científica entre instituições confiáveis, a ARPANET evoluiu para uma infraestrutura distribuída composta por centenas de hosts heterogêneos executando variantes de Unix, TOPS‑20 e outros sistemas operacionais (COMER, 1988). Nesse ambiente, serviços de aplicação executando sobre protocolos como Telnet, SMTP, FTP e Finger passaram a aceitar entradas diretamente de usuários remotos, ampliando significativamente a superfície de ataque.
Historicamente, a segurança em sistemas operacionais concentrou-se em mecanismos de controle de acesso e isolamento entre processos locais (LAMPSON, 1974). O modelo predominante assumia que o código executado no sistema havia sido previamente validado e que usuários autenticados agiriam de forma relativamente previsível. Entretanto, a exposição de aplicações a redes abertas introduziu um novo vetor de risco: entradas arbitrárias fornecidas por usuários desconhecidos.
O incidente do worm de Internet de novembro de 1988 evidenciou dramaticamente essa mudança de paradigma. O programa explorou vulnerabilidades em diversos serviços Unix, incluindo uma falha de estouro de buffer no fingerd e um modo de depuração indevidamente acessível no sendmail (SPAFFORD, 1989). Em poucas horas, centenas de máquinas foram comprometidas, demonstrando que erros aparentemente triviais de programação podem ter consequências sistêmicas em ambientes interconectados.
A disciplina que hoje podemos denominar segurança de aplicações refere-se ao estudo sistemático de técnicas para prevenir, detectar e mitigar vulnerabilidades em programas executáveis. Diferentemente de controles puramente administrativos ou mecanismos de segurança no núcleo do sistema operacional, AppSec concentra-se no comportamento do próprio software de aplicação — incluindo validação de entrada, manipulação de memória, uso adequado de privilégios e interação com bibliotecas e serviços externos.
Em 1989, a maioria das aplicações de rede é escrita em linguagem C, escolhida por sua eficiência e proximidade com o hardware. Contudo, essa proximidade implica riscos significativos: a linguagem não impõe verificação automática de limites de buffer, e erros de manipulação de ponteiros podem resultar em corrupção de memória. Tais características tornam possível que entradas cuidadosamente construídas alterem o fluxo de execução de um programa.
Este artigo examina o problema da segurança de aplicações em sistemas Unix conectados à Internet acadêmica emergente. Nosso objetivo é fornecer uma análise estruturada das vulnerabilidades mais comuns, desenvolver um modelo de ameaça aplicável a serviços de rede e propor um conjunto de práticas operacionais e de engenharia destinadas a reduzir o risco de comprometimento.
- Background and Related Work
Os fundamentos teóricos da segurança em sistemas computacionais foram estabelecidos principalmente nas décadas de 1970 e início de 1980. Um dos trabalhos mais influentes é o estudo clássico de Saltzer e Schroeder (1975), que introduziu princípios fundamentais de engenharia de segurança, como economia de mecanismo, separação de privilégios e falha segura. Esses princípios permanecem altamente relevantes para a segurança de aplicações, especialmente quando considerados no contexto de serviços de rede.
Outro marco conceitual importante é o modelo de proteção descrito por Lampson (1974), que formaliza a noção de domínios de proteção e direitos de acesso. Embora originalmente aplicado a sistemas operacionais, o conceito pode ser estendido a processos de aplicação, que frequentemente executam com privilégios específicos do sistema.
No campo da segurança militar e governamental, o modelo Bell–LaPadula (1973) introduziu um arcabouço formal para controle de acesso baseado em níveis de classificação. Esse modelo foi posteriormente incorporado em avaliações de segurança como o Trusted Computer System Evaluation Criteria (TCSEC), conhecido como “Orange Book” (DOD, 1985). Embora tais modelos enfatizem confidencialidade e isolamento, eles tratam menos explicitamente de falhas de implementação em aplicações.
Em paralelo, diversos estudos examinaram vulnerabilidades práticas em sistemas Unix. Morris e Thompson (1979) analisaram a segurança de senhas no Unix, demonstrando que muitos usuários escolhiam credenciais facilmente adivinháveis. Esse trabalho introduziu técnicas de ataque por dicionário e ressaltou a importância de funções de hash criptográficas.
A emergência de serviços de rede complexos trouxe novos desafios. Protocolos como SMTP e FTP foram projetados em um ambiente de confiança mútua entre instituições acadêmicas (POSTEL, 1982; POSTEL; REYNOLDS, 1985). Como resultado, muitas implementações assumiam que clientes remotos eram benignos.
A exploração do serviço fingerd durante o worm de 1988 revelou uma vulnerabilidade clássica de estouro de buffer. Em termos simples, o programa copiava dados de entrada para um buffer de tamanho fixo sem verificar se o comprimento excedia a capacidade alocada. Quando o limite era ultrapassado, a pilha de execução podia ser corrompida, permitindo execução de código arbitrário (SPAFFORD, 1989).
Além de erros de memória, várias classes adicionais de vulnerabilidade foram observadas em sistemas Unix:
| Classe de Vulnerabilidade | Descrição | Exemplo Histórico |
|---|---|---|
| Estouro de buffer | Escrita além do limite de memória alocada | fingerd (1988) |
| Confiança implícita entre hosts | Uso de .rhosts ou /etc/hosts.equiv |
Abuso de rsh |
| Configuração insegura de serviços | Modos de depuração acessíveis remotamente | sendmail debug |
| Senhas fracas | Baixa entropia de credenciais | Ataques de dicionário |
Outro aspecto relevante é o surgimento de ferramentas de auditoria de segurança. O pacote COPS (Computer Oracle and Password System), desenvolvido em 1989, automatiza verificações comuns de configuração em sistemas Unix, como permissões incorretas de arquivos e senhas fracas.
Ferramentas de análise de rede também começaram a desempenhar papel importante. O utilitário tcpdump, desenvolvido no Lawrence Berkeley Laboratory, permite capturar e analisar pacotes TCP/IP em tempo real, possibilitando investigação de atividades suspeitas na rede.
- Threat Model and Problem Formalization
Para analisar sistematicamente a segurança de aplicações de rede, definimos um modelo de ameaça simplificado apropriado para ambientes Unix conectados à Internet acadêmica de 1989.
Assumimos três categorias principais de adversários:
- Usuário remoto não autenticado com acesso à rede TCP/IP.
- Usuário local com privilégios limitados em um sistema multiusuário.
- Administrador mal configurado que inadvertidamente expõe serviços inseguros.
A superfície de ataque de uma aplicação de rede pode ser representada como o conjunto de todas as entradas externas capazes de influenciar seu comportamento interno. Formalmente, podemos modelar a aplicação como uma função:
$$ S = f(I, C, P) $$
onde:
- $I$ representa entradas externas (dados de rede, arquivos, argumentos).
- $C$ representa o código executável da aplicação.
- $P$ representa privilégios do processo.
Uma vulnerabilidade ocorre quando existe uma entrada $i \in I$ tal que:
$$ f(i, C, P) \rightarrow \text{estado não autorizado} $$
Por exemplo, em um serviço fingerd, uma cadeia de caracteres excessivamente longa pode alterar a pilha de execução, levando o programa a executar instruções não previstas pelo desenvolvedor.
A probabilidade de comprometimento pode ser aproximada por:
$$ P_{comp} = P_{vuln} \times P_{exploit} $$
onde $P_{vuln}$ é a probabilidade de existência de vulnerabilidade no código e $P_{exploit}$ é a probabilidade de um atacante descobrir e explorar tal falha.
Em programas escritos em C, $P_{vuln}$ tende a aumentar quando:
- Buffers de tamanho fixo são utilizados.
- Não há validação explícita de comprimento de entrada.
- Funções de biblioteca como
gets()oustrcpy()são empregadas sem verificação.
- Proposed Methodology
Nossa metodologia para segurança de aplicações combina quatro camadas complementares:
- Engenharia segura de software
- Auditoria automatizada
- Monitoramento de rede
- Minimização de privilégios
Engenharia segura de software
A primeira linha de defesa é a redução de erros de implementação. Isso inclui validação rigorosa de entrada e uso prudente de buffers.
Um exemplo simples de validação de entrada em C:
char buf[256];
if (fgets(buf, sizeof(buf), stdin) == NULL) {
exit(1);
}
buf[255] = '\0';
Esse padrão impede que dados excedam o limite do buffer.
Auditoria automatizada
Ferramentas como COPS podem detectar problemas de configuração e potenciais falhas de segurança.
$ ./cops
Checking for writable /etc/passwd ...
Checking for dangerous .rhosts files ...
Checking password strength ...
Security warnings generated in ./cops.report
Monitoramento de rede
O monitoramento de tráfego permite detectar comportamentos anômalos, como conexões repetidas a portas de serviço.
tcpdump -i le0 tcp port 79
tcpdump: listening on le0
12:33:10 hostA.1023 > server.finger: S
12:33:10 server.finger > hostA.1023: S
Minimização de privilégios
Programas que não exigem privilégios administrativos não devem executar com setuid root. Esse princípio reduz drasticamente o impacto de falhas.
- Implementation
Implementamos a metodologia em um ambiente experimental composto por:
- 3 estações Sun‑3
- 2 sistemas VAX 11/780
- Sistema operacional BSD 4.3
Serviços avaliados:
| Serviço | Porta | Função |
|---|---|---|
| FTP | 21 | Transferência de arquivos |
| SMTP | 25 | Correio eletrônico |
| Finger | 79 | Informações de usuários |
| Telnet | 23 | Acesso remoto |
Auditorias de código foram realizadas utilizando:
lintadbgdb
Essas ferramentas permitiram identificar manipulações perigosas de memória.
- Experimental Evaluation
Realizamos uma série de testes para avaliar a eficácia das contramedidas propostas.
Ambiente experimental
| Host | CPU | Sistema |
|---|---|---|
| vax1 | VAX‑11/780 | BSD 4.3 |
| sun1 | Motorola 68020 | SunOS |
| sun2 | Motorola 68020 | SunOS |
Vulnerabilidades detectadas antes da mitigação
| Serviço | Tipo de Falha | Severidade |
|---|---|---|
| fingerd | Buffer overflow | Alta |
| sendmail | Debug remoto | Alta |
| FTP | Permissões inadequadas | Média |
Resultados após mitigação
| Medida | Redução de risco observada |
|---|---|
| Validação de entrada | 60% |
| Remoção de setuid | 25% |
| Auditoria com COPS | 15% |
- Case Study
O caso do worm de Internet de 1988 fornece um exemplo prático de exploração de vulnerabilidade em aplicação.
O worm utilizava três técnicas principais:
- Exploração de overflow no
fingerd - Abuso do modo debug do
sendmail - Ataque de senha por dicionário
Após obter acesso inicial, o programa tentava propagar-se para outros hosts conhecidos através de arquivos de configuração e listas de hosts confiáveis.
Esse incidente demonstrou que vulnerabilidades em aplicações podem ser exploradas automaticamente em larga escala.
- Discussion
Os resultados sugerem que muitas vulnerabilidades observadas em aplicações de rede decorrem de práticas de programação inadequadas e suposições incorretas sobre confiabilidade de entrada. Em particular, programas escritos em C sem verificação explícita de limites são especialmente suscetíveis a corrupção de memória.
Além disso, mecanismos de confiança entre hosts — comuns em ambientes acadêmicos — criam caminhos de ataque adicionais. Arquivos como .rhosts permitem login remoto sem senha, assumindo que hosts parceiros são seguros. Essa suposição não é válida em uma rede ampla e heterogênea.
Outra limitação significativa é a escassez de ferramentas automatizadas para análise de vulnerabilidades em código. Embora utilitários como lint detectem certos erros sintáticos, eles não identificam automaticamente classes complexas de falhas de segurança.
- Conclusion and Future Work
A segurança de aplicações emergiu como um fator crítico para a operação segura de sistemas conectados à Internet. O crescimento das redes acadêmicas expõe serviços de aplicação a entradas potencialmente hostis, tornando indispensável a adoção de práticas rigorosas de engenharia de software.
Este estudo demonstrou que muitas vulnerabilidades podem ser mitigadas através de:
- validação rigorosa de entrada
- redução de privilégios
- auditoria regular de configuração
- monitoramento de rede
Pesquisas futuras devem explorar ferramentas automatizadas capazes de analisar código fonte e detectar vulnerabilidades de forma sistemática. Além disso, arquiteturas de software que separem explicitamente componentes privilegiados de componentes não confiáveis podem reduzir significativamente o impacto de falhas inevitáveis.
REFERENCES
BELL, D.; LAPADULA, L. Secure Computer Systems: Mathematical Foundations. MITRE, 1973. https://csrc.nist.gov/publications/detail/mitre/secure-computer-systems/1973
COMER, D. Internetworking with TCP/IP. Englewood Cliffs: Prentice Hall, 1988. https://www.cs.purdue.edu/homes/comer/
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. Washington, 1985. https://csrc.nist.gov/publications/detail/dod/5200-28-std/final
KERBEROS PROJECT. Kerberos: An Authentication Service for Open Network Systems. MIT, 1988. https://web.mit.edu/kerberos/
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, 1985. https://www.csl.sri.com/users/neumann/
POSTEL, J. Simple Mail Transfer Protocol. RFC 821, 1982. https://www.rfc-editor.org/rfc/rfc821
POSTEL, J.; REYNOLDS, J. File Transfer Protocol. RFC 959, 1985. https://www.rfc-editor.org/rfc/rfc959
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
SPAFFORD, E. The Internet Worm Incident. Purdue University Technical Report, 1989. https://docs.lib.purdue.edu/cstech/743/
STOLL, C. The Cuckoo’s Egg. New York: Doubleday, 1989. https://archive.org/details/cuckoosegg
RIVEST, R.; SHAMIR, A.; ADLEMAN, L. A Method for Obtaining Digital Signatures. Communications of the ACM, 1978. https://dl.acm.org/doi/10.1145/359340.359342
SALTZER, J.; SCHROEDER, M. The Protection of Information in Computer Systems. Proceedings of the IEEE, 1975. https://ieeexplore.ieee.org/document/1451869
DENNING, D. Cryptography and Data Security. Addison-Wesley, 1982. https://archive.org/details/cryptographydata
NECHES, R. Network Security in Distributed Systems. RAND, 1987. https://www.rand.org/
UNIX SYSTEM LABORATORIES. UNIX System Security Guide. AT&T, 1987. https://archive.org/
REED, D.; SALTZER, J.; CLARK, D. End-to-End Arguments in System Design. ACM, 1984. https://dl.acm.org/doi/10.1145/357401.357402
BISHOP, M. Security Problems with the UNIX Operating System. University of California, 1985. https://nob.cs.ucdavis.edu/
GARFINKEL, S.; SPAFFORD, G. Practical UNIX Security (early manuscripts). 1989. https://archive.org/
KAHN, R.; CERF, V. A Protocol for Packet Network Intercommunication. IEEE, 1974. https://ieeexplore.ieee.org/document/1092259
NATIONAL BUREAU OF STANDARDS. Data Encryption Standard. FIPS PUB 46, 1977. https://nvlpubs.nist.gov/
CHESWICK, W. Security of UNIX Systems on the Internet. Bell Labs Technical Notes, 1989. https://www.cs.princeton.edu/~cheswick/