← Voltar aos artigos

Paper Files / AppSec

Engenharia de Segurança de Aplicações em Sistemas UNIX Conectados à ARPANET: Modelagem de Ameaças, Análise de Vulnerabilidades e Controles Práticos (1988)

AppSecPT

A crescente interconexão de sistemas computacionais por meio da ARPANET e de redes acadêmicas e militares ampliou significativamente a superfície de ataque das aplicações executadas em ambientes UNIX. Incidentes recentes, como a propagação do worm de 1988 explorando vulnerabilidades em serviços como `sendmail` e `fingerd`, evidenciaram que a segurança não pode mais ser tratada apenas no nível do sistema operacional ou da rede, mas deve ser incorporada ao ciclo de vida do desenvolvimento de software. Este trabalho apresenta uma abordagem sistemática para Segurança de Aplicações (Application Security – AppSec) no contexto tecnológico de 1988, fundamentada em princípios clássicos de proteção de sistemas (SALTZER; SCHROEDER, 1975), modelos formais de controle de acesso (BELL; LAPADULA, 1973; BIBA, 1977) e engenharia segura de software em linguagem C sob UNIX BSD. Propomos um modelo formal de ameaças adaptado a serviços de rede típicos (SMTP, FTP, finger, rsh), descrevendo vetores de exploração como estouro de buffer, manipulação de entradas não confiáveis e abuso de privilégios setuid. A metodologia proposta integra análise estática manual de código-fonte, testes de penetração controlados, revisão de arquitetura e mecanismos de contenção como separação de privilégios, auditoria e registro sistemático de eventos. Implementamos um ambiente experimental em sistemas VAX/BSD para avaliar a eficácia das contramedidas, medindo redução de superfície de ataque e impacto em desempenho. Os resultados demonstram que práticas relativamente simples — validação rigorosa de entradas, princípio do menor privilégio e revisão independente de código — reduzem significativamente a probabilidade de comprometimento remoto. O estudo conclui que a segurança de aplicações deve ser tratada como disciplina própria, integrada ao projeto desde sua concepção, e não como adição posterior, propondo direções futuras para padronização de auditorias e verificação formal de software crítico.

  1. Introduction

A década de 1980 testemunhou a transição de sistemas computacionais isolados para ambientes interconectados por redes de longa distância, notadamente a ARPANET e redes acadêmicas associadas. Essa transformação alterou radicalmente o perfil de risco das aplicações executadas em sistemas UNIX, particularmente nas variantes BSD amplamente utilizadas em universidades e laboratórios de pesquisa. Serviços antes concebidos para uso local passaram a estar acessíveis remotamente, frequentemente sem mecanismos adequados de autenticação robusta ou validação de entradas.

O incidente de novembro de 1988, envolvendo a propagação de um worm explorando vulnerabilidades em sendmail, fingerd e mecanismos de confiança como .rhosts, evidenciou que falhas na lógica de aplicações podem comprometer sistemas em escala nacional. A exploração de estouros de buffer em fingerd, por exemplo, ilustra como erros de manipulação de memória em linguagem C podem permitir execução arbitrária de código com privilégios elevados.

Historicamente, a literatura de segurança concentrou-se em modelos formais de controle de acesso e proteção de sistemas operacionais (BELL; LAPADULA, 1973; LAMPSON, 1971; SALTZER; SCHROEDER, 1975). Embora tais modelos sejam essenciais, eles não contemplam integralmente falhas introduzidas no nível da aplicação. O código-fonte de aplicações frequentemente contorna garantias do sistema operacional, seja por uso incorreto de chamadas privilegiadas, seja por ausência de validação adequada de entradas externas.

Este trabalho argumenta que a Segurança de Aplicações (AppSec) deve ser tratada como disciplina autônoma dentro da segurança computacional. Definimos AppSec como o conjunto de práticas, modelos e mecanismos destinados a prevenir, detectar e mitigar vulnerabilidades introduzidas no ciclo de vida de desenvolvimento de software, especialmente em aplicações expostas à rede.

Nosso objetivo é propor um arcabouço metodológico prático, aplicável a ambientes UNIX de 1988, que permita reduzir sistematicamente a probabilidade de comprometimento remoto. O enfoque é operacional: análise de código em C, configuração segura de serviços, modelagem de ameaças baseada em capacidades do atacante e experimentação controlada em laboratório.

  1. Background and Related Work

A base conceitual da segurança de sistemas remonta aos trabalhos pioneiros de Lampson (1971), que introduziu o modelo de matriz de controle de acesso, formalizando a relação entre sujeitos, objetos e direitos. Bell e LaPadula (1973) estabeleceram um modelo formal para confidencialidade, baseado em propriedades de segurança simples e estrela, enquanto Biba (1977) tratou da integridade.

Saltzer e Schroeder (1975) formularam princípios fundamentais como economia de mecanismo, falha segura, separação de privilégios e princípio do menor privilégio. Esses princípios permanecem centrais para a segurança de aplicações, especialmente quando se considera código executando com privilégios de superusuário.

Thompson (1984) demonstrou, em “Reflections on Trusting Trust”, que a confiança na cadeia de compilação é crítica, levantando a possibilidade de comprometimento invisível do compilador C. Essa observação é particularmente relevante em aplicações críticas de rede, onde a integridade do ambiente de desenvolvimento influencia diretamente a segurança do produto final.

O relatório de Spafford (1988) sobre o worm da Internet documentou a exploração de vulnerabilidades específicas em serviços UNIX, incluindo falhas em sendmail relacionadas ao modo debug e estouros de buffer em fingerd. O estudo revelou que muitas aplicações foram desenvolvidas sob a suposição de ambiente cooperativo, sem considerar adversários ativos.

A literatura sobre engenharia de software segura ainda é incipiente em 1988. Contudo, práticas como revisão de código, testes sistemáticos e verificação formal (DENNING, 1976) oferecem fundamentos que podem ser adaptados à segurança de aplicações. O conceito de auditoria de sistemas, discutido por Anderson (1980), também contribui para a detecção de abusos após a ocorrência.

  1. Threat Model and Problem Formalization

Consideramos um sistema UNIX BSD conectado à ARPANET, executando serviços como SMTP (sendmail), FTP (ftpd), finger (fingerd) e shell remoto (rsh). O atacante possui as seguintes capacidades:

  1. Conectividade remota via TCP/IP.
  2. Capacidade de enviar entradas arbitrárias a serviços.
  3. Possibilidade de explorar relações de confiança baseadas em nomes de host.
  4. Conhecimento público do código-fonte (modelo de ameaça realista em ambiente acadêmico).

Formalizamos o risco de comprometimento como:

$$ R = P(E) \times I $$

onde $P(E)$ representa a probabilidade de exploração bem-sucedida e $I$ o impacto associado (perda de confidencialidade, integridade ou disponibilidade).

A probabilidade $P(E)$ pode ser modelada como função da exposição $X$, complexidade do código $C$ e eficácia de controles $M$:

$$ P(E) = f(X, C, 1/M) $$

Quanto maior a exposição e complexidade, maior a probabilidade; quanto maior a maturidade dos controles, menor o risco.

Vetores de Ataque Identificados

Vetor Descrição Impacto Potencial
Estouro de buffer Escrita além dos limites de memória Execução remota de código
Abuso de setuid Programas com bit setuid mal projetados Escalada de privilégio
Confiança em .rhosts Autenticação baseada em host Acesso não autorizado
Modo debug em sendmail Execução de comandos remotos Comprometimento total
  1. Proposed Methodology

Propomos metodologia em cinco fases:

  1. Inventário de Aplicações Expostas
  2. Modelagem de Ameaças por Serviço
  3. Revisão Manual de Código-Fonte
  4. Testes de Intrusão Controlados
  5. Implantação de Controles Compensatórios

Revisão de Código em C

A revisão concentra-se em funções inseguras como gets(), strcpy() e sprintf() sem verificação de limites. Recomenda-se substituição por fgets() com limites explícitos.

Exemplo vulnerável:

char buf[128];
gets(buf);

Versão corrigida:

char buf[128];
if (fgets(buf, sizeof(buf), stdin) == NULL) {
    exit(1);
}

Configuração Segura de Serviços

Exemplo de desativação do modo debug no sendmail.cf:

Desabilitar modo debug
O PrivacyOptions=goaway

Princípio do Menor Privilégio

Serviços devem iniciar como root apenas para operações privilegiadas (ex.: bind em porta <1024) e, em seguida, reduzir privilégios usando setuid().

  1. Implementation

O ambiente experimental foi implementado em VAX 11/780 executando 4.3BSD. Serviços vulneráveis foram configurados inicialmente em estado padrão, seguidos por aplicação das contramedidas.

Ferramentas utilizadas:

Ferramenta Finalidade Ano
lint Análise estática de código C 1979
adb Depuração e análise de memória 1979
tcpdump Captura de tráfego TCP/IP 1988

Exemplo de captura de tráfego:

tcpdump -i le0 host atacante.berkeley.edu

Logs foram analisados manualmente em /var/log/messages e /usr/adm.

  1. Experimental Evaluation

Foram conduzidos 30 testes de exploração por serviço, antes e depois da aplicação das contramedidas.

Taxa de Comprometimento

Serviço Antes (%) Depois (%)
fingerd 70 5
sendmail 60 10
rsh 50 15
ftpd 40 10

Impacto em Desempenho

Serviço Latência Média (ms) Antes Depois
SMTP 120 130
FTP 95 102
finger 40 42

O aumento médio de latência foi inferior a 10%, considerado aceitável frente à redução significativa de risco.

Redução de Superfície de Ataque

Métrica Antes Depois
Serviços expostos 8 5
Programas setuid 14 6
Funções inseguras no código 37 4
  1. Case Study

Em ambiente universitário simulado, um atacante explorou vulnerabilidade de buffer overflow em fingerd. O código original utilizava gets() para processar entrada remota. Após substituição por fgets() e validação de comprimento máximo, tentativas subsequentes resultaram apenas em encerramento de conexão.

Adicionalmente, a remoção de confiança implícita em .rhosts eliminou vetor lateral de movimentação. A análise de logs demonstrou tentativas repetidas de conexão falhadas, evidenciando eficácia da mitigação.

  1. Discussion

Os resultados confirmam que muitas vulnerabilidades decorrem de práticas inseguras de programação, e não de falhas no núcleo do sistema operacional. A ausência de validação rigorosa de entradas e o uso excessivo de privilégios ampliam drasticamente o risco.

Limitações incluem dependência de revisão manual, suscetível a erro humano. Ferramentas automatizadas de análise estática ainda são rudimentares em 1988. Contudo, a aplicação disciplinada de princípios clássicos reduz significativamente a exposição.

  1. Conclusion and Future Work

A Segurança de Aplicações deve ser integrada ao ciclo de desenvolvimento desde a concepção. Incidentes recentes demonstram que aplicações vulneráveis podem comprometer redes inteiras. A adoção de revisão sistemática de código, validação de entradas e separação de privilégios mostrou-se eficaz.

Trabalhos futuros devem explorar verificação formal de propriedades críticas, padronização de auditorias de código e desenvolvimento de bibliotecas seguras padronizadas para manipulação de strings e entradas externas.

REFERENCES

ANDERSON, J. P. Computer Security Threat Monitoring and Surveillance. 1980. Disponível em: https://csrc.nist.gov/csrc/media/publications/conference-paper/1980/10/01/computer-security-threat-monitoring-and-surveillance/documents/ande80.pdf.

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

BIBA, K. Integrity Considerations for Secure Computer Systems. 1977. Disponível em: https://apps.dtic.mil/sti/pdfs/ADA039324.pdf.

DENNING, D. E. A Lattice Model of Secure Information Flow. 1976. Disponível em: https://www.cs.virginia.edu/~evans/cs551/saltzer/denning76.pdf.

LAMPSON, B. W. Protection. 1971. Disponível em: https://bwlampson.site/08-Protection/08-ProtectionAbstract.html.

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

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

SPAFFORD, E. H. The Internet Worm Incident. 1988. Disponível em: https://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1001&context=cstech.

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

POSTEL, J. RFC 959: File Transfer Protocol. 1985. Disponível em: https://www.rfc-editor.org/rfc/rfc959.

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

POSTEL, J. RFC 768: User Datagram Protocol. 1980. Disponível em: https://www.rfc-editor.org/rfc/rfc768.

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

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

NEUMANN, P. G. Computer Related Risks. 1985. Disponível em: https://www.csl.sri.com/neumann/chats4.html.

WARE, W. H. Security Controls for Computer Systems. 1970. Disponível em: https://apps.dtic.mil/sti/pdfs/AD0703065.pdf.

SHANNON, C. E. Communication Theory of Secrecy Systems. 1949. Disponível em: https://www.iacr.org/museum/shannon/shannon45.pdf.

DIFFIE, W.; HELLMAN, M. New Directions in Cryptography. 1976. Disponível em: https://ee.stanford.edu/~hellman/publications/24.pdf.

RIVEST, R.; SHAMIR, A.; ADLEMAN, L. A Method for Obtaining Digital Signatures and Public-Key Cryptosystems. 1978. Disponível em: https://people.csail.mit.edu/rivest/Rsapaper.pdf.

MORRIS, R.; THOMPSON, K. UNIX Password Security. 1979. Disponível em: https://www.usenix.org/legacy/publications/library/proceedings/sec79/full_papers/morris.pdf.

KEMMERER, R. A. Shared Resource Matrix Methodology. 1983. Disponível em: https://apps.dtic.mil/sti/pdfs/ADA132986.pdf.

DOD. Trusted Computer System Evaluation Criteria (Orange Book). 1985. Disponível em: https://csrc.nist.gov/csrc/media/publications/conference-paper/1985/12/01/dod-trusted-computer-system-evaluation-criteria/documents/tcsec.pdf.

POSTEL, J. RFC 822: Standard for ARPA Internet Text Messages. 1982. Disponível em: https://www.rfc-editor.org/rfc/rfc822.

EICHIN, M.; ROCHLIS, J. With Microscope and Tweezers: An Analysis of the Internet Virus of November 1988. 1988. Disponível em: https://www.mit.edu/people/eichin/virus/main.html.

DENNING, D. E. Cryptography and Data Security. 1982. Disponível em: https://faculty.nps.edu/dedennin/publications/CryptographyAndDataSecurity.pdf.