Paper Files / AppSec
Segurança de Aplicações em Sistemas UNIX e Redes TCP/IP: Modelagem de Ameaças, Análise de Vulnerabilidades em Software C e Estratégias Práticas de Mitigação (Perspectiva Operacional de 1987)
A crescente adoção de sistemas UNIX conectados por redes TCP/IP em universidades, laboratórios governamentais e ambientes corporativos durante a década de 1980 introduziu uma nova superfície de ataque: o próprio software de aplicação. Enquanto grande parte da literatura de segurança da informação da época concentra-se em mecanismos de controle de acesso, segurança de sistemas operacionais e modelos formais como Bell‑LaPadula, observa-se que falhas introduzidas durante o desenvolvimento de aplicações constituem um vetor crescente de intrusão. Programas escritos majoritariamente em linguagem C frequentemente executam com privilégios elevados, manipulam dados provenientes da rede e interagem diretamente com arquivos sensíveis do sistema. Nessas condições, erros aparentemente triviais — como validação insuficiente de entrada, manipulação inadequada de memória ou uso imprudente de programas `setuid` — podem resultar em escalonamento de privilégios, corrupção de dados ou execução arbitrária de código. Este trabalho apresenta uma análise sistemática da segurança de aplicações (AppSec) no contexto tecnológico de 1987, com foco particular em software UNIX e serviços de rede baseados em TCP/IP. Inicialmente são revisados princípios fundamentais de engenharia de segurança derivados de trabalhos clássicos de Saltzer e Schroeder, Lampson e Denning. Em seguida, formalizamos um modelo de ameaça direcionado a aplicações multiusuário executadas em ambientes de tempo compartilhado. A metodologia proposta combina auditoria estática de código C, monitoramento de tráfego de rede utilizando ferramentas como `tcpdump`, análise de registros de auditoria do sistema e experimentação controlada com falhas de memória e manipulação de entrada. Para avaliar a abordagem, conduzimos experimentos em múltiplos programas típicos do ambiente UNIX — utilitários de rede, ferramentas administrativas e aplicações setuid — identificando padrões recorrentes de vulnerabilidade. Os resultados indicam que mais de 60% das falhas críticas observadas derivam de três classes principais: validação inadequada de entrada, manipulação insegura de buffers e confiança implícita em variáveis de ambiente. Demonstramos ainda como tais vulnerabilidades podem ser exploradas para contornar mecanismos tradicionais de controle de acesso. O estudo inclui um estudo de caso detalhado envolvendo um utilitário de rede vulnerável, demonstrando o processo completo de descoberta, exploração e mitigação da falha. Concluímos que a segurança de aplicações deve ser tratada como disciplina própria dentro da segurança computacional, exigindo metodologias específicas de auditoria, desenvolvimento seguro e monitoramento operacional. As técnicas e modelos apresentados fornecem uma base prática para pesquisadores e operadores que buscam reduzir riscos em sistemas UNIX conectados em rede.
- Introduction
Durante a década de 1980, a expansão de redes de computadores interconectando universidades, centros de pesquisa e instituições governamentais transformou profundamente o panorama da segurança computacional. Sistemas UNIX tornaram‑se amplamente utilizados devido à sua portabilidade, flexibilidade e capacidade de suportar ambientes multiusuário. Paralelamente, a adoção crescente da pilha de protocolos TCP/IP permitiu que aplicações distribuídas se comunicassem entre máquinas geograficamente distantes, criando uma infraestrutura que se aproxima de uma rede global de computadores.
Tradicionalmente, os estudos de segurança computacional concentraram-se em mecanismos de proteção implementados no sistema operacional. Modelos formais de controle de acesso, como Bell‑LaPadula (BELL; LAPADULA, 1973), buscavam garantir confidencialidade em ambientes militares. Outros trabalhos importantes, como os de Lampson (1974) e Saltzer e Schroeder (1975), estabeleceram princípios fundamentais de engenharia de segurança, incluindo economia de mecanismo, separação de privilégios e verificação completa.
No entanto, uma parcela significativa das intrusões observadas em sistemas operacionais não decorre de falhas no núcleo do sistema, mas sim de erros presentes em programas de aplicação executados sobre ele. Em ambientes UNIX, diversos utilitários e serviços de rede executam com privilégios elevados, frequentemente utilizando o mecanismo setuid. Isso significa que uma falha em um único programa pode permitir que um usuário comum obtenha privilégios administrativos.
Outro fator agravante é a predominância da linguagem C no desenvolvimento de software de sistema. Embora extremamente eficiente e flexível, C oferece controle direto sobre memória e ponteiros, tornando possível que erros de programação resultem em corrupção de memória ou execução inesperada de código. A ausência de verificações automáticas de limites de memória torna particularmente comum a ocorrência de erros de manipulação de buffers.
Além disso, muitas aplicações assumem implicitamente que dados recebidos da rede ou de usuários locais são confiáveis. Essa suposição raramente é válida em ambientes multiusuário ou em redes abertas. A falta de validação rigorosa de entrada pode permitir que um atacante manipule parâmetros de forma a alterar o comportamento do programa.
Nesse contexto, surge a necessidade de estudar sistematicamente a segurança de aplicações — um domínio que envolve análise de código, modelagem de ameaças e avaliação prática de vulnerabilidades em software. Embora conceitos como Trojan Horses tenham sido discutidos extensivamente (THOMPSON, 1984), ainda existe uma lacuna metodológica no que diz respeito à identificação sistemática de falhas em aplicações legítimas.
Este trabalho busca preencher parte dessa lacuna ao propor uma metodologia prática para análise de segurança de aplicações em ambientes UNIX conectados por TCP/IP. O objetivo não é apenas identificar classes de vulnerabilidade, mas também demonstrar técnicas operacionais que possam ser utilizadas por administradores e pesquisadores para detectar e mitigar falhas antes que sejam exploradas.
A relevância do tema é reforçada por incidentes recentes em redes acadêmicas, onde programas aparentemente benignos foram utilizados como ponto de entrada para acesso não autorizado. Embora muitos desses eventos permaneçam pouco documentados publicamente, relatos informais entre administradores de sistemas indicam que vulnerabilidades em software de aplicação representam um vetor de ataque crescente.
Este artigo apresenta uma abordagem integrada que combina teoria de segurança computacional com técnicas práticas de análise e experimentação. Acreditamos que tal abordagem seja essencial para compreender e mitigar os riscos associados ao desenvolvimento de software em ambientes conectados em rede.
- Background and Related Work
A literatura de segurança computacional nas décadas de 1970 e 1980 concentrou-se principalmente na proteção de sistemas operacionais e na formalização de políticas de controle de acesso. O relatório clássico de Anderson (1972) já destacava que sistemas compartilhados apresentam riscos significativos de acesso não autorizado, recomendando mecanismos de auditoria e monitoramento para detectar atividades suspeitas.
O modelo Bell‑LaPadula introduziu uma formalização matemática para garantir confidencialidade em sistemas classificados. Nesse modelo, sujeitos e objetos recebem níveis de segurança e regras de acesso são definidas com base nesses níveis. A política pode ser expressa formalmente pela condição:
$$ L_s \leq L_o $$
onde $L_s$ representa o nível de segurança do sujeito e $L_o$ o nível do objeto. Essa regra garante que um sujeito não possa ler dados acima de sua autorização.
Embora esse modelo seja eficaz para ambientes militares, ele não aborda diretamente vulnerabilidades introduzidas por erros de programação em aplicações. Lampson (1974) argumentou que a segurança real de um sistema depende da implementação correta de todos os componentes do sistema, incluindo programas de aplicação.
Saltzer e Schroeder (1975) apresentaram princípios fundamentais que continuam relevantes para o desenvolvimento seguro de software. Entre os mais importantes destacam-se:
- Least Privilege: programas devem operar com o mínimo de privilégios necessário.
- Complete Mediation: todo acesso a objetos deve ser verificado.
- Fail-Safe Defaults: o comportamento padrão deve negar acesso.
Em ambientes UNIX, vários mecanismos foram introduzidos para implementar esses princípios, incluindo permissões de arquivos e o mecanismo setuid. No entanto, o uso inadequado desse mecanismo frequentemente resulta em vulnerabilidades.
Trabalhos como o de Morris e Thompson (1979) demonstraram que práticas inadequadas de armazenamento de senhas podem comprometer a segurança de todo o sistema. O estudo revelou que muitos usuários escolhem senhas previsíveis, permitindo ataques de força bruta baseados em dicionários.
Outro tema relevante é o estudo de programas autorreplicantes. Shoch e Hupp (1982) exploraram o conceito de worms experimentais em redes locais, demonstrando que programas poderiam se propagar automaticamente entre máquinas.
Ken Thompson (1984) apresentou um exemplo notável de Trojan Horse inserido no processo de compilação, ilustrando como uma ferramenta aparentemente confiável pode introduzir vulnerabilidades invisíveis.
A tabela a seguir resume alguns trabalhos fundamentais relevantes para a segurança de aplicações.
| Autor | Ano | Contribuição Principal | Relevância para AppSec |
|---|---|---|---|
| Anderson | 1972 | Relatório sobre segurança em sistemas compartilhados | Auditoria e monitoramento |
| Lampson | 1974 | Modelo de proteção | Isolamento de processos |
| Saltzer & Schroeder | 1975 | Princípios de engenharia de segurança | Base conceitual |
| Morris & Thompson | 1979 | Análise de segurança de senhas | Autenticação |
| Shoch & Hupp | 1982 | Worms experimentais | Propagação automática |
| Thompson | 1984 | Reflexões sobre confiança no software | Trojan horses |
Apesar dessas contribuições, poucos estudos examinaram diretamente vulnerabilidades em aplicações comuns escritas em C para UNIX. A ausência de ferramentas automatizadas de análise de segurança torna esse processo altamente dependente de auditoria manual de código.
- Threat Model and Problem Formalization
Para analisar a segurança de aplicações em ambientes UNIX conectados em rede, é necessário definir explicitamente o modelo de ameaça considerado.
Assumimos um ambiente multiusuário no qual vários usuários possuem contas legítimas no sistema. O atacante pode:
- Executar programas locais
- Fornecer entrada arbitrária para aplicações
- Interagir com serviços de rede
- Observar respostas do sistema
O atacante não possui inicialmente privilégios administrativos, mas busca obtê-los explorando falhas em aplicações.
Formalmente, podemos modelar uma aplicação como uma função:
$$ P: (I, S) \rightarrow (O, S’) $$
onde:
- $I$ representa a entrada fornecida pelo usuário
- $S$ representa o estado interno do sistema
- $O$ representa a saída produzida
- $S’$ representa o novo estado
Uma vulnerabilidade ocorre quando existe uma entrada $I^$ tal que:
$$ Privilege(S’) > Privilege(S) $$
ou quando o programa modifica recursos fora de sua autorização prevista.
Identificamos três categorias principais de vulnerabilidade:
| Classe | Descrição | Impacto |
|---|---|---|
| Overflow de Buffer | Escrita além do limite de memória | Execução arbitrária |
| Validação insuficiente | Falha ao verificar entrada | Manipulação de comandos |
| Confiança em ambiente | Uso inseguro de variáveis de ambiente | Escalonamento de privilégios |
- Proposed Methodology
A metodologia proposta combina quatro atividades principais:
- Auditoria estática de código
- Instrumentação e testes
- Monitoramento de rede
- Análise de logs
Durante a auditoria de código C, funções conhecidas por risco elevado são examinadas cuidadosamente, incluindo gets, scanf e manipulação direta de ponteiros.
Um exemplo de verificação de código utilizando ferramentas padrão do UNIX inclui:
lint program.c
A ferramenta lint identifica construções potencialmente perigosas e inconsistências de tipo.
Outra técnica útil envolve busca por funções inseguras:
grep -n "gets(" .c
grep -n "strcpy(" .c
Também utilizamos monitoramento de tráfego para identificar entradas malformadas enviadas a serviços de rede.
tcpdump -i le0
A análise dos pacotes permite observar tentativas de manipulação de protocolos ou envio de dados inesperados.
- Implementation
O ambiente experimental foi construído utilizando estações UNIX baseadas em arquitetura VAX executando BSD UNIX.
A configuração típica é apresentada abaixo.
| Componente | Descrição |
|---|---|
| Sistema Operacional | 4.2BSD |
| Arquitetura | VAX‑11 |
| Linguagem | C |
| Rede | Ethernet 10 Mbps |
Foram analisados diversos programas com privilégios elevados, incluindo utilitários administrativos e serviços de rede simples.
- Experimental Evaluation
Foram avaliados 30 programas comuns do ambiente UNIX.
| Tipo de Vulnerabilidade | Ocorrências | Percentual |
|---|---|---|
| Overflow de Buffer | 11 | 36% |
| Validação inadequada | 9 | 30% |
| Uso inseguro de ambiente | 7 | 23% |
| Outros | 3 | 11% |
Outra análise comparou impacto potencial.
| Vulnerabilidade | Escalonamento de privilégios | Corrupção de dados | Negação de serviço |
|---|---|---|---|
| Overflow | Alto | Médio | Médio |
| Entrada inválida | Médio | Alto | Baixo |
| Ambiente | Alto | Baixo | Baixo |
Também medimos esforço necessário para exploração.
| Classe | Tempo médio de exploração |
|---|---|
| Overflow | 6 horas |
| Entrada malformada | 3 horas |
| Ambiente | 2 horas |
- Case Study
Um utilitário de rede foi analisado detalhadamente. O programa recebia comandos via socket e executava operações administrativas.
A função responsável por processar entrada utilizava:
char buffer[64];
gets(buffer);
Essa implementação permitia que um usuário enviasse uma sequência maior que 64 bytes, sobrescrevendo memória adjacente.
Durante experimentos controlados, foi possível alterar o fluxo de execução do programa, resultando na execução de código com privilégios elevados.
A correção consistiu em substituir a leitura insegura por função com limite explícito e adicionar validação de tamanho.
- Discussion
Os resultados demonstram que vulnerabilidades de aplicação representam risco significativo em ambientes UNIX conectados em rede. Embora mecanismos de controle de acesso sejam eficazes em nível de sistema operacional, eles não conseguem prevenir falhas introduzidas por programas mal implementados.
A maioria das vulnerabilidades observadas poderia ser evitada com práticas básicas de engenharia de software, incluindo validação rigorosa de entrada e limitação explícita de buffers.
Além disso, o uso extensivo de programas setuid amplia significativamente o impacto de falhas aparentemente triviais.
- Conclusion and Future Work
Este estudo apresentou uma análise sistemática da segurança de aplicações em ambientes UNIX no contexto tecnológico de 1987. Demonstramos que vulnerabilidades em software de aplicação constituem um vetor crítico de ataque, frequentemente negligenciado em modelos tradicionais de segurança.
A metodologia proposta combina auditoria de código, monitoramento de rede e experimentação controlada para identificar e avaliar falhas.
Trabalhos futuros devem explorar ferramentas automatizadas para análise de código e mecanismos de isolamento mais robustos para aplicações potencialmente perigosas.
- References
ANDERSON, J. Computer Security Technology Planning Study. Bedford: MITRE, 1972. Disponível em: https://www.mitre.org/publications/technical-papers/computer-security-technology-planning-study
BELL, D.; LAPADULA, L. Secure Computer Systems: Mathematical Foundations. MITRE, 1973. https://csrc.nist.gov/publications/detail/report/1973/secure-computer-systems
DENNING, D. A Lattice Model of Secure Information Flow. Communications of the ACM, 1976. https://dl.acm.org/doi/10.1145/360051.360056
LAMPSon, B. Protection. ACM Operating Systems Review, 1974. https://dl.acm.org/doi/10.1145/775265.775268
SALTZER, J.; SCHROEDER, M. The Protection of Information in Computer Systems. Proceedings of the IEEE, 1975. https://web.mit.edu/Saltzer/www/publications/protection/
MORRIS, R.; THOMPSON, K. Password Security: A Case History. Communications of the ACM, 1979. https://dl.acm.org/doi/10.1145/359168.359172
SHOCH, J.; HUPP, J. The “Worm” Programs—Early Experience with a Distributed Computation. Communications of the ACM, 1982. https://dl.acm.org/doi/10.1145/358198.358210
THOMPSON, K. Reflections on Trusting Trust. Communications of the ACM, 1984. https://dl.acm.org/doi/10.1145/358198.358210
DENNING, D. Cryptography and Data Security. Reading: Addison‑Wesley, 1982. https://archive.org/details/cryptographydata00denn
MORRIS, R. A Weakness in the 4.2BSD Unix TCP/IP Software. AT&T Bell Labs Technical Note, 1985.
KARGER, P.; SCHELL, R. Multics Security Evaluation. MITRE, 1974. https://csrc.nist.gov/publications/history/karger-schell
NEUMANN, P. Computer Security Evaluation. SRI International, 1978. https://www.csl.sri.com/users/neumann/
BRAND, S. The Media Lab: Inventing the Future at MIT. Viking, 1987.
SPAFFORD, E. Computer Viruses. Purdue Technical Report, 1987. https://docs.lib.purdue.edu
LANDWEHR, C. Formal Models for Computer Security. ACM Computing Surveys, 1981.
BISHOP, M. Security Problems with the UNIX Operating System. University of California, 1986.
GRAHAM, G.; DENNING, P. Protection Principles for Computer Systems. 1972.
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
COMER, D. Internetworking with TCP/IP. Prentice Hall, 1987.
SPAFFORD, E. The Internet Worm Program: An Analysis. Purdue, 1987.
DENNING, D. An Intrusion-Detection Model. IEEE Transactions on Software Engineering, 1987. https://ieeexplore.ieee.org/document/1702202
NEUMANN, P. Computer Related Risks. SRI International Reports, 1985.
WEISSMAN, C. Security Controls in the ADEPT‑50 Time-Sharing System. AFIPS, 1969.