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

  1. Acesse o link do repositório: https://github.com/cacio-costa/vollmed
  2. Faça o clone para sua máquina
  3. Explore o projeto
  4. Que tecnologias o projeto usa?
  5. 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...

  1. Corrija o cadastro de endereço com o auxílio do ChatGPT
  2. 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}")

 

 

  1. 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...

  1. Procure por mais entidades que usam o DTO/Request Model para serem instanciadas
  2. Refatore o código com auxílio do ChatGPT

Mão na massa

Criando funcionalidade completa: agendar consulta...

Com auxílio do ChatGPT:

 

  1. Crie a migration para criar a tabela consultas;
  2. Crie o código do caso de uso na classe AgendaConsultaService;
  3. Crie o controller ConsultaController com o mapeamento de URL para cadastrar a consulta.
  4. 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:

 

  1. Crie a consulta para listar as próximas consultar em ConsultaRepository;
  2. Adicione o método no ConsultaController que devolva essa consulta na API;
    • Não esqueça de ordenar pela data.
  3. Teste a funcionalidade por meio do Postman.
  4. Ainda em ConsultaRepository, crie a consulta do relatório de consultas mensais dos médicos;
    1. A consulta retorna DadosRelatorioConsultaMensal.
  5. Adicione o método no ConsultaController que devolva esse relatório.
  6. Teste a funcionalidade por meio do Postman.

Mão na massa

Gerando testes automatizados...

Com auxílio do ChatGPT:

 

  1. Escolha uma classe do projeto e gere testes automatizados para ela.
  2. 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:

 

  1. Escolha um projeto interno da sua organização e forneça o contexto dele no ChatGPT;
    • Cuidado para não informar dados sensíveis.
  2. Informe quais funcionalidades ele já possui e pergunte que outras funcionalidades seriam interessantes dele ter.
  3. Peça para ele organizar as tarefas do projeto e estivar o esforço de desenvolvimento.
  4. 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
  1. Faça a assinatura do GitHub Copilot
  2. Instale o plugin para a sua IDE

Mão na massa

Conhecendo a interface e gerando testes...

  1. Escolha alguma classe do projeto e crie testes de unidade para ela.
  2. 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...

  1. Escolha alguma classe do projeto e crie testes de unidade para ela.
  2. 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:

  1. 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
  1. 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.

  1. Primeiro, implemente a funcionalidade de consultar endereço no VIA CEP
    1. Crie o Service que vai realizar a integração
    2. Crie o Controller e o endpoint que vai tratar a requisição
    • ​​Lembre-se: passo-a-passo
  2. Agora crie o teste para este endpoint
    1. Adicione as dependência do Wiremock no projeto
    2. 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.
  • 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

  1. O usuário vai acessar a página por meio de qualquer navegador.
  2. A API ficará num servidor Linux Debian. Esse servidor é uma VM com 4 cores, 32GB de RAM e 128GB de disco.
  3. A máquina Oracle é um Exadata de alta disponibilidade.
  4. 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:

  1. Nome: Acesso ao formulário de atualização de perfil;
  2. Descrição: Formulário utilizado por médicos e pacientes para atualizar seu cadastro e fazer upload de foto;
  3. 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

  1. Difícil de reproduzir, mesmo com conhecimento total da vulnerabilidade
  2. Reproduzível, mas requer condições específicas ou conhecimento avançado
  3. Facilmente reproduzível em qualquer circunstância

Reproductibility

  1. Dano mínimo, sem impacto significativo
  2. Dano moderado, comprometimento parcial do sistema
  3. Dano severo, comprometimento total do sistema ou perda de dados críticos

Damage

  1. Exploração requer habilidades avançadas e acesso privilegiado
  2. Exploração possível por um atacante com habilidades moderadas
  3. Facilmente explorável, mesmo por atacantes novatos ou scripts automatizados

Exploitability

Classificação

DREAD

  1. Difícil de descobrir, requer análise profunda ou acesso ao código-fonte
  2. Moderadamente difícil de descobrir, pode requerer algum conhecimento do sistema
  3. Facilmente descoberta através de análise básica ou ferramentas automatizadas

Discoverability

  1. Afeta poucos usuários ou apenas usuários específicos
  2. Afeta um grupo significativo de usuários
  3. 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

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).

 

  1. Faça o fork do projeto para a sua conta: https://github.com/cacio-costa/vollmed
  2. Crie o workflow dentro do diretório ".github/workflows".
    • Configure para ser disparado no evento de push
  3. 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 install

Configure o TruffleHog para executar no pre-commit hook do Git.

 

  1. Crie o arquivo .pre-commit-config.yaml na raiz do projeto
  2. Copie a configuração no código ao lado e cole no arquivo
  3. Execute os seguintes comandos:
    1. pip install pre-commit
    2. pre-commit install
  4. 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.

 

  1. 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"
  2. Acesse o Sonar no navegador em http://localhost:9000
  3. Faça login com o usuário admin, senha admin e troque a senha
  4. Na página inicial, clique na opção create a local project e dê o nome de Vollmed
  5. Na tela seguinte, selecione a opção Use the global setting e clique em Create project
  6. Na tela Analysis method, selecione a opção Locally, e na tela seguinte clique no botão Generate
  7. 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.

 

  1. 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