Objetivo
Este treinamento é destinado a desenvolvedores de software que desejam aprender conceitos de segurança aplicados a sistemas com o kernel Linux.
Embora o foco principal seja Linux embarcado, os conceitos e técnicas abordadas neste treinamento são aplicáveis a diferentes plataformas, incluindo sistemas bare-metal, dispositivos baseados em RTOS, Android, e outros.
Os participantes explorarão uma ampla gama de tópicos, incluindo fundamentos de segurança, práticas de programação segura, conceitos de criptografia, encriptação de dados, boot seguro, mecanismos de controle de acesso, sandboxing e isolamento, Trusted Execution Environment (TEE), segurança de rede, estratégias de atualização de firmware (Over-the-Air updates), segurança de hardware, etc.
Conteúdo programático
- Introdução aos conceitos de segurança: uma visão geral dos conceitos fundamentais de segurança, incluindo confidencialidade, integridade, autenticidade, privacidade e não-repúdio. A sessão apresenta também noções de gerenciamento de riscos, categorias comuns de ameaças e princípios de design seguro (privilégio mínimo, defesa em profundidade, etc). Serão explorados os tipos de atacantes (script kiddies, hacktivistas, agentes estatais, etc), modelos de ameaças de hardware e software, e vetores de ataque comuns em sistemas embarcados. Os participantes também aprenderão técnicas de modelagem de ameaças como STRIDE/DREAD e MITRE EMB3D™, com exemplos práticos aplicados a dispositivos reais.
- Programação segura I - explorando vulnerabilidades: este módulo ensina como atacantes exploram vulnerabilidades de software em sistemas embarcados baseados em C/C++. Tópicos incluem estouro de buffer, uso após liberação (use-after-free), vulnerabilidades de formatação de strings e outros bugs de corrupção de memória. Os participantes explorarão shellcode, noções básicas de desenvolvimento de exploits, retorno à libc e return-oriented programming (ROP). Demonstrações práticas com GDB e ferramentas de testes de penetração irão reforçar como essas falhas podem ser exploradas.
- Programação segura II - técnicas de mitigação: aborda mitigações de segurança em tempo de compilação e em tempo de execução para proteção contra vulnerabilidades comuns. Inclui ASLR, stack canaries, DEP/NX, RELRO, FORTIFY, proteção contra estouro de pilha (SSP) e outras técnicas de mitigação. Discute também o uso de sanitizers como AddressSanitizer e Electric Fence para detecção de bugs em tempo de execução. A sessão inclui uma visão geral das opções de hardening do kernel Linux, normas de codificação segura do CERT C, MISRA C e ISO/IEC TS 17961, além de ferramentas de análise estática, fuzzing e o papel de linguagens seguras como Rust e Ada no desenvolvimento de software para sistemas embarcados.
- Conceitos de criptografia: introdução prática aos fundamentos da criptografia, incluindo criptografia simétrica (AES, ChaCha20) e assimétrica (RSA, ECC). Aborda infraestrutura de chave pública (PKI), certificados X.509, assinaturas digitais, funções de hash e geração segura de números randômicos. A seção fecha com fundamentos de gerenciamento de chaves (geração com RNG seguro, armazenamento em HSM/TPM/TEE/KMS, rotação e revogação), uma visão introdutória de criptografia pós-quântica e um panorama das principais entidades e padrões (NIST/FIPS, IETF e ISO/IEC) que orientam escolhas e compliance.
- Armazenamento seguro de dados: técnicas para proteção de dados em sistemas embarcados. Cobre criptografia baseada em arquivos (eCryptFS, fscrypt, etc) e criptografia de partições (dm-crypt, LUKS, etc). Discute boas práticas para armazenar credenciais, segredos e logs, como gerenciar chaves de criptografia com segurança e como integrar esses mecanismos no desenvolvimento de sistemas embarcados.
- Boot seguro: compreensão do processo de boot seguro, incluindo verificação de integridade no boot e cadeia de confiança (chain-of-trust) desde o código ROM do SoC até o espaço de usuário de um sistema Linux. Tópicos incluem root-of-trust no nível do SoC, provisionamento de chaves, assinatura de bootloaders e kernel (U-Boot com imagens FIT), e proteção do sistema de arquivos usando dm-verity, IMA/EVM e fs-verity. Também discute implementações específicas de plataformas de hardware baseadas em processadores de arquitetura x86 e ARM.
- Mecanismos de controle de acesso: análise aprofundada do controle de acesso no Linux, incluindo Discretionary Access Control (DAC), permissões POSIX, gerenciamento de senhas e credenciais, Linux capabilities, etc. Aborda Access Control Lists (ACLs) e atributos estendidos, seguido de uma visão geral dos Módulos de Segurança do Linux (LSMs), como SELinux, AppArmor e SMACK. Também cobre auditoria e logs via auditd e journald.
- Sandboxing e isolamento: técnicas para isolar aplicações e reduzir a superfície de ataque. Cobre chroot, seccomp-bpf, namespaces (PID, rede, pontos de montagem, etc). Introduz conteinerização com LXC, Docker e systemd-nspawn, além de ferramentas de varredura e hardening como Lynis e OpenSCAP para uso em desenvolvimento/CI. O tópico fecha com recomendações práticas para autenticação segura, redução de privilégios, configuração correta de permissões e monitoramento contínuo em produção.
- Trusted Execution Environment (TEE): cobre a necessidade de TEEs em sistemas embarcados e seus casos de uso típicos. Os participantes aprenderão sobre implementações populares como OP-TEE, Google Trusty e Keystone (RISC-V). Exploração aprofundada do OP-TEE e da arquitetura ARM TrustZone, separação entre o mundo seguro e mundo normal, mecanismos de comunicação e etapas para portar e usar o OP-TEE em plataformas com Linux embarcado.
- Segurança de rede: foco na proteção de dados em trânsito usando SSL/TLS, HTTPS, IPsec e VPNs. Discussão sobre ataques de rede comuns como MitM, DoS e varredura de portas, e como mitigá-los. Aprenda a proteger serviços de rede em sistemas embarcados (sshd, httpd, brokers MQTT, etc), configurar firewalls com iptables, nftables, ufw e firewalld, e integrar sistemas de detecção de intrusão como Snort ou Suricata.
- Atualização de firmware: explora mecanismos seguros de atualização de firmware (offline ou OTA), desde abordagens baseadas em imagem completa até baseadas em deltas. Aprenda sobre verificações de autenticidade e integridade das imagens de atualização e proteção contra rollback. Visão geral de frameworks open source como Mender, SWUpdate, RAUC, OSTree e Hawkbit, além de boas práticas para rastreamento de CVEs e aplicação de patches de segurança.
- Segurança de hardware: esta sessão explora a dimensão física da segurança em sistemas embarcados. Tópicos incluem proteção contra violação física (fuses, anti-tamper, etc), resistência à engenharia reversa e o papel de TPMs e Secure Elements. Aprenda a identificar e restringir interfaces de depuração (JTAG, UART) e entenda as ameaças representadas por ataques de side-channel (timing, power analysis, etc) e suas técnicas de mitigação.
- Encerramento: concluímos o treinamento reforçando os princípios de defesa em profundidade e security-by-design, conectando-os aos tópicos vistos ao longo do curso. Em seguida, abrimos espaço para dúvidas e comentários finais e discutimos próximos passos para continuar se aprofundando no assunto.
Para mais detalhes sobre o conteúdo, você pode consultar a agenda e os slides do treinamento.
Informações adicionais
Estudantes, engenheiros, desenvolvedores e líderes de equipes de desenvolvimento de software para sistemas embarcados.
Experiência no desenvolvimento de software para sistemas embarcados (bare-metal, RTOS, Linux embarcado), familiaridade com o ambiente de shell do Linux, compreensão da arquitetura de sistemas Linux (espaço de usuário vs espaço de kernel), sólido conhecimento das linguagens de programação C e C++, familiaridade com compilação cruzada e sistemas de build (GCC, Make, Buildroot, Yocto Project, etc).
O material de estudo é composto pelos slides das apresentações, o livro de atividades e exercícios, os guias de referência e documentos de estudo adicionais. Todo o material será fornecido de forma eletrônica no início do treinamento.
Os exercícios do treinamento são realizados em um ambiente emulado com o QEMU. Se necessário, e dependendo dos requisitos da empresa contratante, o treinamento também pode ser adaptado para rodar em outra plataforma de hardware.
O treinamento pode ser apresentado nos seguintes idiomas: Português brasileiro e Inglês.
Se você planeja capacitar a sua equipe, considere um treinamento na sua empresa. Nos treinamentos in-company, a empresa contratante é responsável por fornecer os recursos necessários para a realização do treinamento, incluindo sala, projetor e máquinas de desenvolvimento para os alunos. Esse modelo traz grande economia para a empresa, já que o custo do transporte e estadia de vários funcionários é reduzido apenas ao do instrutor. Caso a empresa contratante tenha alguma necessidade específica, podemos estudar a criação de um conteúdo programático especial, como preparar o treinamento para uma plataforma de hardware específica ou desenvolver algum conteúdo adicional. Não hesite em entrar em contato por e-mail ou pela página de contato .
Os treinamentos em turmas abertas são realizados em um ambiente agradável, com um laboratório devidamente equipado e acesso à Internet. As aulas são normalmente ministradas em período integral, com uma parada para o almoço e um coffee-break pela manhã. Caso tenha interesse em participar de um treinamento mas não exista uma turma disponível, envie uma mensagem pela página de contato que avisamos assim que uma nova turma for aberta.
Este treinamento pode ser realizado de forma online. Os treinamentos online são apresentados ao vivo em uma plataforma de reunião virtual como o Google Meet ou o Zoom. Na modalidade online, os alunos utilizam o emulador (QEMU) para realizar as atividades práticas.
Galeria de fotos
Algumas fotos dos treinamentos já realizados: