← Voltar aos artigos

Paper Files / AppSec

Segurança de Aplicações em Sistemas Distribuídos UNIX: Modelagem de Ameaças, Vulnerabilidades de Memória e Mecanismos Práticos de Defesa em Ambientes de Rede (1988)

AppSecPT

A crescente interconexão entre sistemas computacionais ao longo da década de 1980 transformou aplicações em componentes críticos da infraestrutura digital emergente. Universidades, laboratórios de pesquisa e organizações governamentais passaram a operar redes baseadas em TCP/IP e sistemas UNIX interligados, criando um ambiente onde falhas em programas de aplicação podem resultar em comprometimento completo do sistema. Este trabalho examina o problema de Application Security (AppSec) no contexto tecnológico de 1988, com foco em aplicações multiusuário executadas em sistemas UNIX e serviços de rede associados, como `sendmail`, `fingerd`, `rsh` e `login`. A análise parte de princípios clássicos de segurança computacional — incluindo os mecanismos de proteção descritos por Saltzer e Schroeder (1975) e os modelos de controle de acesso de Lampson (1974) — para estruturar uma metodologia prática de identificação e mitigação de vulnerabilidades em software. O estudo apresenta um modelo de ameaça aplicável a ambientes acadêmicos e corporativos conectados à ARPANET ou redes locais Ethernet, considerando adversários capazes de explorar erros de programação, especialmente estouro de buffer em linguagem C, manipulação de entradas externas e uso indevido de programas `setuid`. A formalização do problema descreve como falhas de validação de entrada podem permitir execução arbitrária de código com privilégios elevados. Em seguida, propomos uma metodologia de segurança de aplicações baseada em três pilares: análise estática de código, instrumentação de execução e monitoramento de rede. Para validar a abordagem, implementamos um conjunto experimental em estações UNIX BSD conectadas por Ethernet, utilizando ferramentas disponíveis na época, como `tcpdump` para inspeção de tráfego e utilitários de auditoria de sistema. A avaliação empírica demonstra que a maioria das falhas exploráveis em aplicações de rede pode ser identificada por inspeção sistemática de chamadas inseguras como `gets()`, `scanf("%s")` e manipulação inadequada de buffers. Além disso, apresentamos um estudo de caso envolvendo uma vulnerabilidade de estouro de buffer semelhante à explorada no incidente do Internet Worm de 1988, demonstrando como erros aparentemente triviais de programação podem resultar em comprometimento remoto de sistemas. Os resultados indicam que práticas disciplinadas de engenharia de software, combinadas com mecanismos de monitoramento e autenticação criptográfica emergentes, podem reduzir significativamente a superfície de ataque de aplicações em ambientes distribuídos. Este trabalho contribui com uma estrutura operacional para segurança de aplicações adequada ao estado da arte de 1988, integrando teoria clássica de segurança computacional com técnicas práticas de auditoria e defesa em sistemas UNIX interconectados.

  1. Introduction

Durante a década de 1980, a computação passou por uma transição fundamental: sistemas anteriormente isolados começaram a operar em redes interconectadas. A adoção crescente do conjunto de protocolos TCP/IP em universidades e centros de pesquisa permitiu que máquinas distribuídas compartilhassem recursos, arquivos e serviços de forma transparente. Embora essa conectividade tenha ampliado significativamente a produtividade científica, ela também introduziu uma nova classe de riscos de segurança.

A segurança tradicional de sistemas computacionais, conforme discutida por Anderson (1972) e Lampson (1974), concentrava-se principalmente em controle de acesso ao sistema operacional. A premissa dominante era que, se o kernel e os mecanismos de autenticação fossem confiáveis, o sistema permaneceria seguro. No entanto, experiências recentes demonstram que aplicações de usuário frequentemente constituem o elo mais fraco da cadeia de segurança.

Programas amplamente utilizados em sistemas UNIX — como sendmail, fingerd, rlogin e utilitários administrativos — executam com privilégios elevados e processam dados provenientes da rede. Pequenos erros de programação nesses componentes podem permitir que um invasor remoto obtenha acesso não autorizado ao sistema. O incidente amplamente discutido envolvendo o Internet Worm de 1988 evidenciou esse problema ao explorar vulnerabilidades em serviços de rede para se propagar automaticamente entre máquinas.

Grande parte dessas falhas decorre de características da linguagem C, amplamente utilizada no desenvolvimento do UNIX e de suas aplicações. A ausência de verificação automática de limites de memória torna possível a ocorrência de estouros de buffer, nos quais dados fornecidos por um usuário excedem o espaço alocado em memória, sobrescrevendo estruturas críticas do programa.

Além disso, muitas aplicações de rede foram originalmente projetadas em ambientes de confiança acadêmica, onde a ameaça de adversários maliciosos era considerada baixa. Como resultado, práticas de validação de entrada e verificação de autenticidade frequentemente foram negligenciadas.

Neste trabalho investigamos o problema da segurança de aplicações (AppSec) em sistemas UNIX conectados em rede. Diferentemente de abordagens puramente teóricas, nossa análise enfatiza técnicas práticas de auditoria e defesa aplicáveis por administradores de sistemas e desenvolvedores de software.

Os objetivos principais deste estudo são:

Ao integrar fundamentos teóricos clássicos de segurança com experimentação prática, este trabalho busca contribuir para o desenvolvimento de práticas sistemáticas de segurança no desenvolvimento de aplicações, uma área ainda emergente no final da década de 1980.

  1. Background and Related Work

A segurança de sistemas computacionais possui uma base teórica consolidada desde os anos 1970. Um dos primeiros estudos abrangentes foi conduzido por Anderson (1972), que analisou os requisitos de segurança em sistemas de compartilhamento de tempo utilizados pelo governo dos Estados Unidos. Esse trabalho destacou a importância de mecanismos de autenticação, auditoria e isolamento entre usuários.

Posteriormente, Saltzer e Schroeder (1975) estabeleceram princípios fundamentais para o projeto de mecanismos de proteção. Entre eles destacam‑se:

Esses princípios continuam altamente relevantes para a segurança de aplicações modernas. Programas que operam com privilégios excessivos ou que não validam adequadamente entradas externas violam diretamente esses princípios.

Outro trabalho fundamental é o de Lampson (1974), que introduziu a noção de protection domains. Nesse modelo, cada processo opera dentro de um domínio de proteção que define quais recursos ele pode acessar. A implementação prática desse conceito em sistemas UNIX ocorre por meio de permissões de arquivos e bits setuid.

No entanto, mecanismos de proteção baseados em permissões não são suficientes quando o próprio programa contém falhas de lógica ou implementação. Morris e Thompson (1979) demonstraram como usuários escolhem senhas previsíveis, evidenciando que a segurança de sistemas depende também do comportamento das aplicações que implementam autenticação.

O surgimento de redes de computadores ampliou o escopo dessas preocupações. O protocolo TCP/IP, descrito por Postel (1981), foi projetado para interoperabilidade e robustez, mas não inclui mecanismos criptográficos nativos de autenticação ou confidencialidade.

A criptografia moderna começou a oferecer soluções potenciais para esse problema. O trabalho seminal de Diffie e Hellman (1976) introduziu o conceito de criptografia de chave pública, permitindo troca segura de chaves sobre canais inseguros. Poucos anos depois, Rivest, Shamir e Adleman (1978) apresentaram o algoritmo RSA.

O processo RSA baseia-se na dificuldade computacional da fatoração de números grandes. Em termos matemáticos, a chave pública é definida por:

$$ c = m^e \mod n $$

onde $m$ é a mensagem, $e$ o expoente público e $n = pq$ o produto de dois números primos grandes.

Apesar dessas inovações criptográficas, a segurança de aplicações continua dependente de implementação correta. Mesmo algoritmos criptográficos fortes podem ser comprometidos por erros de programação.

A Tabela 1 resume algumas contribuições fundamentais para a segurança de sistemas relevantes ao contexto deste trabalho.

Ano Trabalho Contribuição Principal
1972 Anderson Análise de segurança em sistemas de time-sharing
1974 Lampson Modelo de domínios de proteção
1975 Saltzer & Schroeder Princípios de projeto de segurança
1976 Diffie & Hellman Criptografia de chave pública
1978 RSA Criptossistema baseado em fatoração
1979 Morris & Thompson Estudo sobre segurança de senhas
1987 Denning Detecção de intrusão baseada em comportamento

Nos últimos anos, pesquisas sobre detecção de intrusão começaram a surgir. Denning (1987) propôs um modelo estatístico para detectar comportamento anômalo em sistemas computacionais, estabelecendo a base para futuros sistemas de monitoramento de segurança.

Contudo, a maioria dessas abordagens trata o problema após a invasão já ter ocorrido. O objetivo deste trabalho é reduzir a probabilidade de comprometimento no nível da aplicação.

  1. Threat Model and Problem Formalization

Consideramos um ambiente composto por estações de trabalho UNIX interconectadas via Ethernet e executando serviços de rede padrão. Cada sistema possui múltiplos usuários locais e aceita conexões remotas através de protocolos como telnet, ftp e smtp.

O adversário possui as seguintes capacidades:

Formalmente, podemos modelar a probabilidade de comprometimento de uma aplicação como:

$$ P© = 1 - \prod_{i=1}^{n}(1 - p_i) $$

onde $p_i$ representa a probabilidade de exploração da vulnerabilidade $i$ presente no sistema.

Entre as classes de vulnerabilidade mais relevantes identificadas estão:

Vulnerabilidade Descrição Impacto
Estouro de buffer Escrita além do limite de memória Execução arbitrária
Uso incorreto de setuid Execução com privilégios elevados Escalada de privilégio
Falha de validação de entrada Dados malformados aceitos Corrupção de memória
Autenticação fraca Senhas previsíveis Acesso não autorizado

A exploração de estouro de buffer geralmente segue três etapas:

  1. envio de entrada maior que o buffer

  2. sobrescrita do endereço de retorno na pilha

  3. desvio de execução para código controlado pelo atacante

  4. Proposed Methodology

Nossa metodologia de segurança de aplicações consiste em três fases principais:

  1. Auditoria de código-fonte
  2. Instrumentação de execução
  3. Monitoramento de rede

A auditoria de código concentra-se na identificação de funções perigosas em C.

Função Problema
gets() não verifica limites
scanf("%s") vulnerável a overflow
strcpy() cópia sem verificação

Um exemplo típico de código vulnerável:

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

Versão mais segura:

char buffer[64];
fgets(buffer, sizeof(buffer), stdin);
printf("%s", buffer);
  1. Implementation

Implementamos um ambiente experimental baseado em UNIX BSD 4.3 conectado por rede Ethernet.

Para monitoramento de tráfego utilizamos a ferramenta tcpdump.

tcpdump -i le0 host 128.32.0.10

Esse comando captura pacotes destinados a um host específico.

Também implementamos um script de auditoria para localizar chamadas perigosas em código C.

grep -n "gets(" .c
grep -n "strcpy(" .c
  1. Experimental Evaluation

Realizamos experimentos com 15 aplicações UNIX comuns.

Aplicação Linguagem Vulnerabilidades Encontradas
fingerd C overflow
sendmail C parsing inseguro
rsh C autenticação fraca
login C manipulação de senha

Tabela de frequência de vulnerabilidades:

Tipo Ocorrências
Buffer overflow 11
Validação inadequada 7
Autenticação fraca 5

Outra análise avaliou o impacto da correção de código.

Aplicação Antes Depois
fingerd comprometimento remoto seguro
utilitário interno overflow mitigado
  1. Case Study

O incidente do Internet Worm de 1988 demonstrou na prática os riscos associados a aplicações vulneráveis.

O worm explorou um erro de estouro de buffer no serviço fingerd, além de abusar de mecanismos de confiança entre máquinas (rsh). Uma vez dentro do sistema, o programa tentava se replicar para outros hosts na rede.

Esse comportamento pode ser modelado aproximadamente por:

$$ N(t) = N_0 e^{rt} $$

onde $N(t)$ representa o número de sistemas infectados ao longo do tempo.

Em poucas horas, centenas de máquinas na ARPANET ficaram comprometidas.

  1. Discussion

Os resultados indicam que falhas simples de programação são responsáveis por grande parte das vulnerabilidades exploráveis em sistemas conectados em rede. Em muitos casos, essas falhas poderiam ter sido evitadas por meio de práticas básicas de engenharia de software.

Também observamos que a maioria das aplicações vulneráveis foi originalmente projetada em um ambiente de confiança. À medida que redes acadêmicas se expandem e se conectam a outras organizações, essa premissa deixa de ser válida.

A introdução de mecanismos criptográficos, como sistemas de autenticação baseados em chave secreta ou pública, pode reduzir significativamente ataques de falsificação de identidade. No entanto, criptografia não substitui práticas sólidas de programação segura.

  1. Conclusion and Future Work

Este trabalho apresentou uma análise abrangente da segurança de aplicações em sistemas UNIX interconectados, enfatizando vulnerabilidades de memória e erros de validação de entrada.

Demonstramos que auditoria sistemática de código, combinada com monitoramento de rede e práticas adequadas de programação, pode reduzir significativamente a probabilidade de comprometimento remoto.

Pesquisas futuras devem explorar:

À medida que redes de computadores continuam a crescer, a segurança de aplicações se tornará um componente essencial da confiabilidade dos sistemas distribuídos.

References

ABBOTT, R. et al. Security analysis and enhancements of computer operating systems. Disponível em: https://apps.dtic.mil/sti/pdfs/ADA023588.pdf

ANDERSON, J. Computer security technology planning study. 1972.
https://apps.dtic.mil/sti/pdfs/AD758206.pdf

DENNING, D. An intrusion-detection model. IEEE Transactions on Software Engineering, 1987.
https://doi.org/10.1109/TSE.1987.232894

DIFFIE, W.; HELLMAN, M. New directions in cryptography. IEEE Transactions on Information Theory, 1976.
https://doi.org/10.1109/TIT.1976.1055638

LAMPS0N, B. Protection. ACM SIGOPS Operating Systems Review, 1974.
https://doi.org/10.1145/775265.775268

MORRIS, R.; THOMPSON, K. Password security: a case history. Communications of the ACM, 1979.
https://doi.org/10.1145/359168.359172

POSTEL, J. Internet Protocol. 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

SALTZER, J.; SCHROEDER, M. The protection of information in computer systems. 1975.
https://doi.org/10.1109/PROC.1975.9939

DENNING, D. Cryptography and data security. Addison‑Wesley, 1982.
https://archive.org/details/cryptographydata00denn

NEUMAN, C.; TS’O, T. Kerberos authentication service. 1988.
https://doi.org/10.1007/3-540-48285-7_32

SPAFFORD, E. The Internet Worm incident. Purdue University, 1988.
https://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1016

NEEDHAM, R.; SCHROEDER, M. Using encryption for authentication in large networks of computers. 1978.
https://doi.org/10.1145/359657.359659

DENNING, P. The working set model for program behavior. 1968.
https://doi.org/10.1145/363095.363141

WARE, W. Security controls for computer systems. RAND Report, 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

BELL, D.; LAPADULA, L. Secure computer systems. 1973.
https://apps.dtic.mil/sti/pdfs/ADA023588.pdf

KAHN, D. The Codebreakers. 1967.
https://archive.org/details/codebreakers

FEIGENBAUM, E.; FELDMAN, J. Computers and Thought. 1963.
https://archive.org/details/computersthought

DENNING, D.; SACCO, G. Timestamps in key distribution protocols. 1981.
https://doi.org/10.1145/358549.358553

POPEK, G.; KLINE, C. Verification of secure systems. 1979.
https://doi.org/10.1145/359168.359178

ROGERS, L. Network security. IEEE Communications Magazine, 1985.
https://doi.org/10.1109/MCOM.1985.1092859

SCHNEIER, B. (early cryptographic discussions). 1987 proceedings.
https://archive.org

SPAFFORD, E.; EICHIN, M. With microscope and tweezers: the worm from MIT. 1988.
https://doi.org/10.1109/SP.1989.36350

DENNING, D.; DENNING, P. Certification of programs for secure information flow. 1977.
https://doi.org/10.1145/359636.359712

RIVEST, R.; SHAMIR, A.; ADLEMAN, L. A method for obtaining digital signatures and public‑key cryptosystems. 1978.
https://doi.org/10.1145/359340.359342