Engenharia de prompt e Copilot 365
(def pessoa {:nome "Cácio José da Costa Silva"
:empresa "Alura"
:cargo "Instrutor e pagodeiro nas horas vagas"})Visão geral
Engenharia de Prompt
Princípios e técnicas para otimizar respostas
Copilot 365
Possibilidades e estado atual das ferramentas
Hype
ou
Real?

Opiniões
"Qualquer um que leve a sério "Prompt Engineering" tá assinando certificado de idiota. #prontofalei"
AKITA, Fábio. x.com.br, 10/01/2023 9h04
Analogias (?)


Analogias (?)
A finalidade do prompt é direcionar o modelo de IA para que ele entregue, o mais próximo possível, o resultado esperado .

Analogias (?)
A finalidade do prompt é direcionar o modelo de IA para que ele entregue, o mais próximo possível, o resultado esperado .
Módulo 1
Engenharia de prompt
IA no desenvolvimento de software...


IA Generativa
Usos no desenvolvimento de software
-
Geração de Código
-
Refatoração e Otimização de Código
-
Automatização de Testes
-
Detecção de Bugs
-
Documentação
-
Design e Arquitetura de Software
-
Análise de Código e Revisão
-
Gerenciamento de Projetos
IA Generativa
Prompts e limitações
- Prompts são instruções que damos ao GPT
- Contexto importa (muito)
-
Resposta nem sempre são perfeitas
-
Treinado com dados da internet
-
Pequenas mudanças no prompt podem gerar resposta diferentes
-
-
Limitações
-
Memória
-
Viés
-
Consistência
-

IA Generativa
Alguns cuidados



Projeto Vollmed
- Acesse o link do repositório: https://github.com/cacio-costa/vollmed
- Faça o clone para sua máquina
- Explore o projeto
- Que tecnologias o projeto usa?
- Escolha algumas classes e peça para que o ChatGPT te explique algum trecho de código dela
- Ex: Tenho uma classe service em uma aplicação Java com Spring Boot. Poderia me explicar linha por linha o que ela faz? E cole a classe CadastroPacienteService
Mão na massa
Um pouco mais sobre prompts...
Prompts
Diretrizes gerais
-
Seja claro
- Se não deixar claro o que quer, não tem como a IA adivinhar corretamente
- Que instruções você daria para alguém?
-
Seja simples
-
Prompts simples funcionarão para a maioria dos caso
-
-
Tenha em mente os critérios de sucesso
-
Se você não sabe até onde quer chegar, vai vagar perdidamente
-
Viés
-
Consistência
-
Prompts
Estrutura
-
Persona:
- Como um especialista em Spring Boot...
-
Tarefa:
gere uma funcionalidade para listar todos os médicos.
-
Etapas:
Crie o Repository, o Service e o Controller para esta funcionalidade.
-
Contexto:
Esta é a entidade Medico que será consultada no banco de dados: CÓDIGO_DA_CLASSE.
-
Restrições:
A consulta deve ser ordenada pelo nome do médico. Ser paginada. E o tamanho da página deve ter 20 registros. O controller receberá o Pageable no método da funcionalidade.
-
Objetivo:
O objetivo é permitir que clientes consultem a a API de médicos.
-
Saída:
Explique as suas decisões na saída.
Detecção e correção de erro...
- Corrija o cadastro de endereço com o auxílio do ChatGPT
- A saída dele foi a mesma durante a demonstração?
Mão na massa
Geração de código e validações...
Suponha que o governo determine uma mudança no formato do número do CRM dos médicos, que a partir de agora deve seguir o seguinte padrão: XXXXXX-XX/UF.
Na classe DadosCadastroMedico, o atributo crm está anotado com @Pattern(regexp = "\\d{4,6}")
- Utilize o ChatGPT para te auxiliar na mudança dessa regex para o novo padrão
Mão na massa
Análise de design de código...
- Procure por mais entidades que usam o DTO/Request Model para serem instanciadas
- Refatore o código com auxílio do ChatGPT
Mão na massa
Criando funcionalidade completa: agendar consulta...
Com auxílio do ChatGPT:
- Crie a migration para criar a tabela consultas;
- Crie o código do caso de uso na classe AgendaConsultaService;
- Crie o controller ConsultaController com o mapeamento de URL para cadastrar a consulta.
- Teste a funcionalidade por meio do Postman.
Como foi? Seria mais fácil fazer sozinho?
Mão na massa
Gerando consultas e relatórios...
Com auxílio do ChatGPT:
- Crie a consulta para listar as próximas consultar em ConsultaRepository;
- Adicione o método no ConsultaController que devolva essa consulta na API;
- Não esqueça de ordenar pela data.
- Teste a funcionalidade por meio do Postman.
- Ainda em ConsultaRepository, crie a consulta do relatório de consultas mensais dos médicos;
- A consulta retorna DadosRelatorioConsultaMensal.
- Adicione o método no ConsultaController que devolva esse relatório.
- Teste a funcionalidade por meio do Postman.
Mão na massa
Gerando testes automatizados...
Com auxílio do ChatGPT:
- Escolha uma classe do projeto e gere testes automatizados para ela.
- Peça para gerar mais cenários de teste.
DESAFIO: Tente acrescentar relatório de cobertura de testes no projeto.
Mão na massa
Prompts de apoio à modelagem...
Sistema de controle de estacionamento
Descrevendo o projeto
"Vou iniciar um projeto de desenvolvimento de um sistema de controle de um estacionamento de veículos. Preciso identificar os requisitos desse sistema entrevistando os futuros usuários. Que perguntas você sugere para um questionário que me ajude a identificar esses requisitos?"
PROMPT:
Sistema de controle de estacionamento
Especificando requisitos não funcionais
"Escreva uma lista de requisitos funcionais para controlar a operação de um estacionamento de veículos."
PROMPT:
Sistema de controle de estacionamento
Refinando requisitos
"Reescreva, considerando que haverá segmentação de veículos por motocicleta, automóvel e caminhão, tanto sem reboque quanto com reboque."
PROMPT:
Sistema de controle de estacionamento
Estimando esforço e prazo
"Considerando uma equipe formada por 1 dev sênior e 2 plenos e que cada dev trabalhará 40 horas por semana, calcule de forma objetiva a estimativa de esforço em meses para desenvolvimento desta aplicação utilizando pontos por caso de uso."
PROMPT:
Sistema de controle de estacionamento
Requisitos não funcionais
"Escreva os requisitos técnicos com dimensionamento e recursos para a operação de um sistema web com base de dados MySQL, backend em Java com Spring Boot e frontend em React, para atender a uma demanda de 10.000 usuários por dia. Considere que o sistema terá 3 páginas estáticas e 10 páginas dinâmicas cujo processamento é de uma média de 3 queries simples indexadas e com um máximo de 50 registros. Não haverá CLOB ou BLOB nas queries.
PROMPT:
Sistema de controle de estacionamento
Diagramas UML
"Escreva um diagrama de casos de uso dos requisitos discutidos acima para o PlantUML."
PROMPT:
Com auxílio do ChatGPT:
-
Escolha um projeto interno da sua organização e forneça o contexto dele no ChatGPT;
- Cuidado para não informar dados sensíveis.
- Informe quais funcionalidades ele já possui e pergunte que outras funcionalidades seriam interessantes dele ter.
- Peça para ele organizar as tarefas do projeto e estivar o esforço de desenvolvimento.
- Tente gerar um diagrama para a funcionalidade.
Mão na massa
Engenharia de prompts...
Engenharia de prompts
Definição
"A engenharia de prompt pode ser vista como um processo que envolve a elaboração, otimização e ajuste de instruções, perguntas e solicitações — os "prompts" — com o intuito de extrair respostas e ações específicas de sistemas embasados em Inteligência Artificial (IA) e Processamento de Linguagem Natural (PLN)."
Fonte: Engenharia de prompt para DEVS : um guia para aprender a usar a IA antes que IA aprenda a usar você. Ricardo Pupo Larguesa e Vivian Matsui. 1ª ediçãoIu
Contexto conversacional
Comunicação eficiente
- Há limite para o tamanho do texto da instrução (definidos em tokens).
- Esse limite se aplica também à conversa inteira.

Contexto conversacional
Síntese resumida
Mantenha uma síntese resumida da conversa após algumas interações.
Módulo 2
Testes e qualidade com GitHub Copilot

GitHub Copilot
O que é?
- Ferramenta que gera código automaticamente
- Precisa ter uma conta no GitHub
- Pago
- Período de testes por 30 dias
- Precisa de plugin instalado na IDE

GitHub Copilot
Vantagens
- Integração com IDEs populares
- Sugestões de código contextualizadas
- Melhoria contínua das sugestões
- Foco em produtividade e qualidade do código
- Assistência em várias etapas do ciclo de desenvolvimento
-
Explicar o código de outra pessoa e sugerir melhorias
-
Propor correções de código
-
Gerar casos de teste
-
Gerar documentação de código
-
etc...
-

GitHub Copilot
Alguns dados


GitHub Copilot
Alguns dados


GitHub Copilot
Alguns dados


GitHub Copilot
Boas práticas de prompt
- Metodologia dos 3S:
- Simple:
- não pedir várias coisas de uma única vez
- construir o código com pequenos passos
- "menos código gerado é menos chance de erro"
- Specific:
- ser bem preciso e específico em questões abertas
- fornecer contexto específico para pedidos mais complexos
- arquivos abertos no editor aumentam a relevância daquele código para o contexto
- VS Code é mais rico para isso que o Intellij IDEA
- Short:
- menos texto é igual a menos ruído
- Simple:

- Faça a assinatura do GitHub Copilot
- Instale o plugin para a sua IDE
Mão na massa
Conhecendo a interface e gerando testes...

- Escolha alguma classe do projeto e crie testes de unidade para ela.
-
Explore vários cenários para aumentar a cobertura de testes
- Se você não configurou o projeto para analisar a cobertura de testes, a hora é agora
DISCUSSÃO: Foi mais simples do que usar o ChatGPT? Quais vantagens notou no uso do Copilot? O que não saiu bem?
Mão na massa
Criando testes mais complexos...

- Escolha alguma classe do projeto e crie testes de unidade para ela.
- Explore vários cenários para aumentar a cobertura de testes
DISCUSSÃO: Foi mais simples do que usar o ChatGPT? Quais vantagens notou no uso do Copilot? O que não saiu bem?
Mão na massa
Testando a API...

Vamos testar a funcionalidade de cadastrar e listar médicos:
- Crie primeiro o teste do endpoint para cadastrar o médico
- Se precisar, analise a requisição do Postman para obter detalhes
- Lembre-se de ir passo-a-passo:
- crie a classe de teste para um controller do Spring Boot
- arranje o cenário do teste
- invoque a funcionalidade
- faça as asserções
- Agora crie o teste da listagem
- Como a consulta é paginada, veja o formado do JSON no Postman
- Também construa o teste passo-a-passo
Mão na massa
Simulando APIs e testando integrações...

Vamos simular a API do VIA CEP para testar a integração com uma API externa.
- Primeiro, implemente a funcionalidade de consultar endereço no VIA CEP
- Crie o Service que vai realizar a integração
- Crie o Controller e o endpoint que vai tratar a requisição
- Lembre-se: passo-a-passo
- Agora crie o teste para este endpoint
- Adicione as dependência do Wiremock no projeto
- Crie o teste para o endpoint
- gere os mapeamentos (Json Mapping Files) do Wiremock no diretório src/test/resource/wiremock/mappings
- crie a classe de teste usando o Wiremock
- Monte o cenário, execute a requisição e assegure os resultado
Mão na massa
Módulo 3
Melhorando a qualidade com SSDLC, SAST e DAST
Desenvolvimento seguro
SSDLC - Desenvolvimento seguro
Princípios
- Por que é importante?
- Ajuda a cumprir requisitos regulatórios.
- Fortalece a confiança e a reputação da marca;
- Identificar problemas precocemente economiza custos;
- Comprovadamente reduz vulnerabilidades e minimiza riscos;
- Princípios:
- Segurança integrada desde o início do desenvolvimento;
- Responsabilidade compartilhada entre todas as equipes;
- Testes e verificações de segurança contínuos;
- Melhoria dos processos de segurança.
SSDLC - Desenvolvimento seguro
Fases, Shift Left e Shift Right

- Shift Left:
- Move as atividades de segurança para as fases de desenvolvimento.
- Shift Right:
- Complementa o Shift Left estendendo as atividades de teste e monitoramento para a etapa de produção.
Atividades e práticas
Atividades e práticas

- Análise de riscos de segurança
- Identificar potenciais ameaças e vulnerabilidades
- Avaliar o impacto e a probabilidade de cada risco
- Exemplo: Para um aplicativo de banco online, a equipe identifica riscos como roubo de credenciais, injeção SQL e ataques de negação de serviço. Eles classificam o roubo de credenciais como alto risco devido ao impacto potencial e à probabilidade de ocorrência.
- Definição de Requisitos de Segurança
- Estabelecer requisitos específicos de segurança
- Alinhar requisitos com padrões estabelecidos (OWASP Top 10, NIST, PCI-DSS)
- Exemplo: Necessário autenticação de dois fatores, logs de auditoria para todas as transações e criptografia em trânsito e em repouso.
Atividades e práticas
Atividades e práticas

- Modelagem de ameaças
- Criar modelos que representem possíveis ataques ao sistema
- Identificar caminhos de ataque e pontos e entrada
- Exemplo: Criação de diagrama mostrando como um atacante poderia explorar um XSS para roubar cookies de sessão.
- Análise de conformidade
- Identificar requisitos regulatórios aplicáveis
- Planejar de definir diretrizes para atingir esses requisitos
- Exemplo: Implementar controles específicos do PCI-DSS para um aplicativo que lida com cartões de crédito.
- E mais... (seleção de ferramentas de segurança, definição de métricas de segurança, requisitos de segurança de terceiros, etc)
Atividades e práticas
Atividades e práticas
- Definição da arquitetura de segurança
- Estabelecer os componentes de segurança do sistema
- Definir controles de segurança em cada nível
- Exemplo: Definir a arquitetura com firewall, IDS e segregação de rede, etc.
- Design de logging e auditoria
- Definir eventos de segurança a serem registrados
- Projetar sistema de coleta e armazenamento de logs, com temporalidade
- Exemplo: Utilização de um centralizador de logs e de tracing distribuído.
- E mais... (criptografia e proteção de dados, autenticação e controle de acesso, design e gerenciamento de sessões, Resiliência e recuperação, etc)

Atividades e práticas
Atividades e práticas
- Revisão de Código
- Realizar revisões de código regulares com foco em segurança
- Utilizar checklist de segurança durante as revisões
- Exemplo: revisões de código pareadas com um desenvolvedor especializado em segurança revisa especificamente as partes do código relacionadas à validação de entrada e controle de acesso.
- Análise Estática de Código
- Utilizar ferramentas de análise estática para identificar vulnerabilidades
- Integrar análise de código no pipeline de CI/CD
- Exemplo: A equipe configura SonarQube para realizar análises automáticas de código a cada commit, identificando potenciais vulnerabilidades como injeção SQL ou XSS.
- E mais... (Codificação segura, gerenciamento de dependências, controles de segurança, etc)

Atividades e práticas
Atividades e práticas
- Testes de Segurança Automatizados
- Integrar testes de segurança automatizados no pipeline de CI/CD
- Executar varreduras de segurança em cada build
- Exemplo: A equipe configura o pipeline para executar o OWASP ZAP, realizando varreduras de segurança básicas e impedir o deploy se vulnerabilidades críticas forem encontradas.
- Testes de Recuperação e Resiliência
- Verificar a capacidade do sistema de se recuperar de falhas de segurança
Testar cenários de recuperação de desastres e continuidade de negócios - Exemplo: A equipe simula um ataque DDoS e verifica se os sistemas de mitigação e recuperação funcionam conforme o esperado.
- Verificar a capacidade do sistema de se recuperar de falhas de segurança
- E mais... (Testes de penetração, testes de controle de acesso, etc)

Atividades e práticas
Atividades e práticas
- Hardening de Sistemas
- Configurar sistemas operacionais e servidores de acordo com as melhores práticas de segurança
- Remover serviços e componentes desnecessários
- Exemplo: Os administradores de sistema aplicam as diretrizes de hardening nos servidores de produção, desativando serviços não essenciais e configurando firewalls adequadamente.
- Backup e Recuperação
- Implementar e testar processos de backup seguros
- Estabelecer procedimentos de recuperação de desastres
- Exemplo: Configuração de backups criptografados automáticos para todos os dados críticos, com testes regulares de restauração em um ambiente isolado.
- E mais... (Plano de resposta a incidente, criptografia e gestão de chaves, etc)

Atividades e práticas
Atividades e práticas
- Gestão de Patches e Atualizações
- Manter um processo regular de aplicação de patches de segurança
- Avaliar e testar atualizações antes da implantação
- Exemplo: Estabelecer um ciclo mensal de patches, no qual as atualizações são primeiro aplicadas em um ambiente de teste, validadas e então implantadas em produção.
- Monitoramento de Desempenho e Disponibilidade
- Monitorar o desempenho do sistema e a disponibilidade dos serviços
- Identificar e resolver problemas que possam impactar a segurança
- Exemplo: Implementação de ferramentas como o Prometheus para monitorar métricas de desempenho e disponibilidade, com alertas configurados para notificar a equipe.
- E mais... (Monitoramento de Ameaças Externas, Gestão de Acesso e Identidade etc)

Cenário
"Você foi contratado por uma empresa para avaliar se o sistema desenvolvido por eles possui problemas de segurança."
Modelagem de ameaças
(Threat modeling)
OWASP
Threat Modeling

Falando a mesma língua...
Terminologias
Common Vulnerabilities and Exposures é uma lista pública de registro de ameaças e vulnerabilidades em software
CVE
Potencial perda, dano ou destruição de algo valioso para a vítima (sistema, reputação, inteligência de negócio, etc)
Risco
Uma fraqueza ou brecha que pode ser explorada
Vulnerabilidade
Conjunto de técnicas e scripts
Exploit
Algo, ou alguém, que pode explorar a vulnerabilidade (criminoso, um funcionário extorquido/subornado, malware, etc)
Ameaça
Funcionalidade para análise

Decompondo a aplicação
Mapear dependências externas

- O usuário vai acessar a página por meio de qualquer navegador.
- A API ficará num servidor Linux Debian. Esse servidor é uma VM com 4 cores, 32GB de RAM e 128GB de disco.
- A máquina Oracle é um Exadata de alta disponibilidade.
- As imagens de perfil dos médicos/pacientes ficam armazenadas num Bucket S3 da AWS e somente a URL é salva no banco de dados.
Fronteiras

Pontos de entrada
Precisamos dizer no documento:
- Nome: Acesso ao formulário de atualização de perfil;
- Descrição: Formulário utilizado por médicos e pacientes para atualizar seu cadastro e fazer upload de foto;
- Nível de confiança: Usuário precisar estar autenticado, ser médico ou paciente.

Pontos de saída
ID da entrada: #1
Descrição:
GET /perfil/form-atualizacao
Host: vollmed.com.br
Authorization: $token
SAÍDA:
Status code: 200
Content-type: text/html
$HTML_FORM_ATUALIZACAO

Níveis de confiança
| ID | NOME | DESCRIÇÃO |
|---|---|---|
| 1 | Médico | Profissional, autenticado, que usa o sistema para atender pacientes. |
| 2 | Paciente | Pessoa, autenticada, que procura por médicos e agenda consulta com eles. |
| 3 | Credenciais de banco | Usuário e senha compartilhados entre desenvolvedores. Possui acesso de leitura e escrita. |
| 4 | Desenvolvedores | Equipe que tem acesso ao ambiente e permissão para modificar o sistema. |
| 5 | Acesso SSH ao servidor | Não sabemos certamente. Mas o GitHub usa para implantar o sistema. |
| 6 | Acesso às imagens do bucket S3 | API acessa para salvar imagens e o navegador consegue exibir na página. |
Itens de interesse
- Representam os ativos que um atacante pode se interessar
- Dados, sistemas, informações, máquinas, etc.
- Não somente os sistemas e informações dentro dele, mas também o que está em posse das pessoas que interagem com ele.
- Um token ou chave criptográfica, dados cadastrais, preferências, etc.
- Classificando ativos:
- ID, nome, descrição e nível de confiança
Elabore o mapeamento de dependências externas para uma funcionalidade "Notificações Push no Sistema de E-commerce", conforme descrito abaixo.
"O sistema de e-commerce implementa um serviço de notificações push para manter os usuários engajados e informados sobre várias atividades e promoções. As principais características desta funcionalidade incluem:
1. Plataformas Suportadas:
- Aplicativos móveis (iOS e Android)
2. Um painel de controle permite que os usuários gerenciem suas preferências de notificação
3. Análise e Métricas:
- O sistema rastreia taxas de abertura, engajamento e conversão das notificações enviadas."
Mão na massa
Identificação e classificação de vulnerabilidades
STRIDE
| Ameaça | Serviço de segurança | |
|---|---|---|
| S | Spoofing | Authentication |
| T | Tampering | Integrity |
| R | Repudiation | Non-repudiation |
| I | Information disclosure | Confidentiality |
| D | Denial of service | Availability |
| E | Elevation of privilege | Authorization |
Categorização da ameaça
STRIDE
Exemplo
"Um atacante consegue alterar o valor do depósito a ser realizado em sua conta."
Tampering => Integridade
STRIDE
Exemplo
"Um usuário mais avançado consegue acessar contracheque de outros trocando o ID na URL."
Information disclosure
=>
Confidencialidade
STRIDE
Exemplo
"Um estelionatário consegue roubar as credenciais de um idoso e realizar um empréstimo."
Spoofing => Autenticação
STRIDE
Exemplo
"Um atacante consegue, via backdoor, executar comandos como root no SO."
Elevation of privilege
=>
Autorização
STRIDE
Exemplo
"Um desenvolvedor coloca, no código, um contador para um loop infinito no décimo acesso de uma página."
Denial of service => Disponibilidade
STRIDE
Exemplo
"Sabendo que o sistema não rastreia algumas atividades, o chefe do RH manda pagar horas extras à sua amante e nega que tenha sido ele."
Repudiation => Irretratabilidade
DREAD
| Critério | |
|---|---|
| D | Damagem (dano) |
| R | Reproductibility (reprodutibilidade) |
| E | Exploitability (explorabilidade) |
| A | Affected users (usuários afetados) |
| D | Discoverability |
- Cada vulnerabilidade recebe uma nota entre 1 (menor risco) e 3 (maior risco)
- A nota final é a soma dos critérios divida por cinco
- 1.0 - 1.5: Risco Baixo
- 1.6 - 2.5: Risco Médio
- 2.6 - 3.0: Risco Alto
Classificação de severidade
DREAD
- Difícil de reproduzir, mesmo com conhecimento total da vulnerabilidade
- Reproduzível, mas requer condições específicas ou conhecimento avançado
- Facilmente reproduzível em qualquer circunstância
Reproductibility
- Dano mínimo, sem impacto significativo
- Dano moderado, comprometimento parcial do sistema
- Dano severo, comprometimento total do sistema ou perda de dados críticos
Damage
- Exploração requer habilidades avançadas e acesso privilegiado
- Exploração possível por um atacante com habilidades moderadas
- Facilmente explorável, mesmo por atacantes novatos ou scripts automatizados
Exploitability
Classificação
DREAD
- Difícil de descobrir, requer análise profunda ou acesso ao código-fonte
- Moderadamente difícil de descobrir, pode requerer algum conhecimento do sistema
- Facilmente descoberta através de análise básica ou ferramentas automatizadas
Discoverability
- Afeta poucos usuários ou apenas usuários específicos
- Afeta um grupo significativo de usuários
- Afeta todos ou a grande maioria dos usuários
Affected users
Classificação
DREAD
Calculando o risco da atualização de perfil
| Critério | Descrição | Nota |
|---|---|---|
| Damage | Conseguimos alterar o ID do perfil atualizado alterando o campo hidden com essa informação | 2 |
| Reproductibiity | Atacante pode reproduzir em qualquer submissão do formulário | 3 |
| Exploitability | Qualquer usuário com conhecimento de HTML e HTTP consegue explorar | 3 |
| Affected users | Potencial para afetar todos os usuários | 3 |
| Discoverability | Uma simples análise do formulário no navegado é suficiente para descobrir | 3 |
| Cáculo | (2 + 3 + 3 + 3 + 3) / 5 | 2.8 |
Considere que o formulário possui um campo hidden com o ID do paciente/médico que terá o perfil atualizado. E que o backend não valide se o ID corresponde ao usuário autenticado no sistema.
Classifique a vulnerabilidade usando STRIDE e calcule sua gravidade com DREAD.
"O nosso banco de dados está exposto para a internet. Imagine que descobriram uma vulnerabilidade na tecnologia que usamos no banco de dados que permite que um atacante roube os dados dele sem precisar de credenciais, apenas executando um script que os criminosos disponibilizaram nas comunidades deles."
Mão na massa
Mitigando riscos
Mitigando riscos
Autenticação
- Cuidados com tokens na API:
- Trafegar token somente no header Authorization, nunca na URL.
- HTTPS é obrigatório
- Assinatura válida?
- Token expirou?
- Trabalhe com mais de um fator de autenticação quando possível
- Procure seguir as diretrizes de https://owasp.org/www-project-application-security-verification-standard/.
Mitigando riscos
Autorização
PUT /api/telefone
Host: vollmed.com.br
Authorization: Bearer $TOKEN
Content-type: application/json
{
userId: 111,
numero: 61984481019
}- Para quê o parâmetro userId se a identidade do usuário está no token?
- O que aconteceria se informássemos um userId diferente do token/
Mitigando riscos
Autorização
/**
* URLs com identificadores numéricos
* pode ser alvos de vulnerabilidades
*/
GET /api/medicos/1234/agenda
/**
* Usuário pode tentar visualizar
* recursos sem autorização
*/
GET /api/medicos/1235/agenda
- Cuidado com identificadores, seja na URL, nos headers ou no corpo da requisição
- Valide sempre no backend se o usuário autenticado tem acesso ao recurso solicitado
Mitigando riscos
Autorização
- Diminua a superfície de ataque ao restringir acesso direto às APIs
- Introduza um proxy reverso ou API gateway para intermediar a conversa.

Mitigando riscos
Proteção de dados
- Política de envio e uso de informações
- Permissão para exibir a imagem do perfil do médico e outros dados sensíveis, etc
- Nunca armazenar senhas em texto claro
- Usar hash e não criptografia
-
Aderir normas para cenários específicos que exigem
- PCI-DSS para tráfego de dados de pagamento, LGPD, etc
-
Separar e restringir acesso a banco de dados
- Usuário específico para a aplicação com somente níveis de acesso necessários, não compartilhar credenciais a serviços, etc
-
Descaracterizar dados em outros ambientes
- Massa de dados de teste/homologação
- Criptografar dados em repouso
- Backups, SGBDs, etc
Mitigando riscos
Validação de dados e integridade
- White list de tags permitidas (se for o caso)
- Previnir e evitar XSS
- Nunca concatenar valores de entrada com comandos SQL
- Previnir e evitar SQL Injection
-
Validar upload de arquivos
- Validar arquivo pelo CONTEÚDO (não confiar em extensões nem no header Content-type)
- Sanitizar o nome do arquivo
- Validar tamanho (processar por partes)
- Validar URL em "upload por url" (file:///etc/password -> SSRF)
Mitigando riscos
Tratamento de erros
- Erros não deve ser expostos para fora do servidor
- Informe status code adequado
{
"error": {
"message": "Algo de errado não está certo.",
"code": "ERR-345"
}
}Mitigando riscos
Logs e auditoria
- Áreas sensíveis do sistema deve ter rastreabilidade com logs imutáveis
- Definir:
- O que guardar
- Por que guardar
- Por quanto tempo
- Nunca logar:
- dados de contato
- dados sigilosos
- dados sensíveis
SAST
SAST
Como funciona
Inspeção do Código-Fonte:
- o SAST analisa o código-fonte em busca de padrões conhecidos associados a vulnerabilidades, como injeção de SQL, Cross-Site Scripting (XSS) e outras ameaças.
Identificação de Anomalias:
- a ferramenta SAST procura por anomalias e erros comuns, como práticas de codificação inseguras, uso inadequado de funções criptográficas e outras fraquezas potenciais.
Geração de Relatórios:
- após a análise, o SAST gera relatórios detalhados, indicando as vulnerabilidades encontradas, sua gravidade e sugestões para correção.
Secret Scanning
Secret Scanning
TruffleHog com Docker e GitHub Actions
name: TruffleHog Scan Test
on:
push:
branches:
- main
jobs:
trufflehog:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup TruffleHog
run: docker pull trufflesecurity/trufflehog:latest
- name: Run TruffleHog
run: |
docker run --rm -v "$PWD:/pwd" trufflesecurity/trufflehog:latest github --repo https://github.com/cacio-costa/vollmed.github/workflows/truffle-hog-scan.yaml
Configure o TruffleHog no projeto (link da documentação).
- Faça o fork do projeto para a sua conta: https://github.com/cacio-costa/vollmed
- Crie o workflow dentro do diretório ".github/workflows".
- Configure para ser disparado no evento de push
- Faça commit e push para o repositório e veja o pipeline sendo executado.
Mão na massa
Secret Scanning
TruffleHog no pre-commit
repos:
- repo: local
hooks:
- id: trufflehog
name: TruffleHog
description: Detect secrets in your data.
entry: bash -c 'docker run --rm -v "$(pwd):/workdir" -i --rm trufflesecurity/trufflehog:latest git file:///workdir --since-commit HEAD --fail'
language: system
stages: ["commit", "push"].pre-commit-config.yaml
Secret Scanning
Habilitando pre-commit
# Ferramenta que ajuda na criação do hook pre-commit
pip install pre-commit
# Cria pre-commit usando o arquivo YAML
pre-commit installConfigure o TruffleHog para executar no pre-commit hook do Git.
- Crie o arquivo .pre-commit-config.yaml na raiz do projeto
- Copie a configuração no código ao lado e cole no arquivo
- Execute os seguintes comandos:
- pip install pre-commit
- pre-commit install
- Altere algum arquivo do projeto e faça commit.
- Veja o TruffleHog executando no terminal
Mão na massa
repos:
- repo: local
hooks:
- id: trufflehog
name: TruffleHog
description: Detect secrets in your data.
entry: bash -c 'docker run --rm -v "$(pwd):/workdir" -i --rm trufflesecurity/trufflehog:latest git file:///workdir --since-commit HEAD --fail'
language: system
stages: ["commit", "push"]Realizar análise do Sonar no projeto.
- Suba o container com SonarQube com o seguinte comando: "docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest"
- Acesse o Sonar no navegador em http://localhost:9000
- Faça login com o usuário admin, senha admin e troque a senha
- Na página inicial, clique na opção create a local project e dê o nome de Vollmed
- Na tela seguinte, selecione a opção Use the global setting e clique em Create project
- Na tela Analysis method, selecione a opção Locally, e na tela seguinte clique no botão Generate
-
No passo 2, selecione Maven, copie o comando e execute no terminal
- Troque o comando mvn para mvnw para utilizar o wrapper do Maven
Mão na massa
Teste de API e Nuclei
Realize o teste de varredura de API com o Nuclei.
- Suba a API e execute o seguinte comando docker run --rm --network host projectdiscovery/nuclei:latest -u http://172.70.0.146:8080 -no-mhe
Mão na massa
Engenharia de prompt
By cacio-costa
Engenharia de prompt
- 5