Programação Segura C/C++

Objetivo: O treinamento tem como objetivo capacitar o treinando a:
• Conhecer os principais vetores de ataque a sistemas de software em execução, a explicação por trás dessas brechas, as consequências e complexidade dos potenciais ataques e as respectivas defesas;
• Conhecer as principais técnicas de programação defensiva;
• Conhecer as principais ferramentas de depuração de software e localização de brechas;
• Conhecer os mecanismos automáticos de proteção contra falhas existentes nos compiladores modernos;
• Conhecer os mecanismos de sanitização de resíduos de execução, de especial importância para software que envolva dados sensíveis, como softwares de criptografia;
• Compreender as potenciais consequências decorrentes da exploração de falhas ou de circunstâncias de execução extremas (corner cases), evitáveis ou não, em software e hardware.

Consulte nosso calendário de Treinamentos

Carga horária: 20 horas

Pré-requisitos: Conhecimento amplo da linguagem C ou C++. Conhecimento superficial de linguagem de montagem (assembly) para a arquitetura IA-32 (processadores da família Intel). Experiência com desenvolvimento de software. Conhecimento básico de arquiteturas de computadores e sistemas operacionais.

Metodologia de ensino: Exposição teórica seguida de aplicação de exercícios práticos para fixação do conteúdo. 

Conteúdo programático:

1. Definição do conceito de programação segura: uma analogia direta para com direção segura;
2. Breve visão histórica acerca da importância da programação segura ou defensiva:
  • As primeiras falhas: origem do termo bug;
  • As falhas mais catastróficas e emblemáticas ocorridas na indústria de software e hardware;
  • Análise dos prejuízos, e até mesmo vítimas, decorrentes de falhas e fragilidades de software.
3. Introdução às máquinas abstratas ou modelos de execução das diversas linguagens de programação atuais;
4. Análise cuidadosa das vantagens e desvantagens dos diversos modelos de execução e seus mecanismos de tratamento de erros;
5. Delineação precisa do conceito de comportamento não-definido (undefined behavior) nas linguagens C e C++:
  • A origem do conceito e a razão pela qual ele foi criado;
  • As (muitas) condições de ocorrência de comportamento não-definido;
  • As consequências (inócuas e catastróficas) da invocação de comportamento não-definido em diferentes compiladores, sistemas operacionais e arquiteturas;
  • Blindando o código contra comportamento não-definido através de programação defensiva.
6. Estudo de casos de programas contendo falhas sus e graves de programação, com respectivos ataques (exploits) ao programa;
7. Estudo de técnicas de prospecção de falhas utilizando ferramentas de instrumentação, depuração e cobertura de código, e ferramentas de profiling;
8. Programação defensiva no contexto de linguagens interpretadas, linguagens de script e execução em máquinas virtuais;
9. Técnicas de sanitização e verificação robusta de entrada de dados;
10. Técnicas de simplificação de testes através de canonicalização de dados;
11. Técnicas de reescrita (refatoração) de código para aumentar a compreensibilidade e diminuir a carga cognitiva do texto;
12. Técnicas de sanização de memória volátil e não-volátil, com breve introdução às respectivas normas de auditoria;
13. Outros assuntos relacionados de interesse.