Atualmente, é uma prática muito comum integrar verificações de segurança durante a fase de integração contínua e entrega contínua (CI/CD) do desenvolvimento de software. Isso traz o benefício de fornecer detecção precoce de defeitos de segurança, potencialmente bloqueando a entrega da aplicação quando um problema crítico é encontrado. Um dos scanners estáticos mais famosos atualmente é o Semgrep.
É uma ferramenta de análise estática de código aberto usada para encontrar bugs e aplicar padrões de codificação. Ele pode ser executado em vários níveis do ciclo de desenvolvimento de software, incluindo a fase de CI/CD. Pode ser configurado para ser executado a cada pull request ou quando um push é feito em branchs e arquivos específicos. No modo CI, ele retornará um código de status diferente e, dependendo do que acontece durante a execução, quando um bug ter critério bloqueador seja encontrado ou aconteça algum erro interno.
A Conviso Platform [5, 6] é nossa plataforma de Software como Serviço (SaaS) que suporta todo o ciclo de vida de segurança no desenvolvimento de software. Um dos benefícios do Conviso Platform é ajudar a centralizar a comunicação entre equipes de segurança e desenvolvimento, por meio da integração de ferramentas.
Neste post, mostraremos como configurar o Semgrep para ser executado por meio do GitHub Actions e enviar os resultados encontrados pelo scan para a Conviso Platform.
Semgrep no GitHub Actions
O GitHub Actions é uma plataforma de CI/CD que permite automatizar tarefas para o seu projeto. O workflow é definido em arquivos YAML que são criados no diretório `.github/workflows` do repositório. Nesses arquivos, você pode definir workflows que são acionados quando certos eventos ocorrem (por exemplo, pull requests). Você pode escrever fluxos de trabalho (i.e., workflows) por conta própria ou pode usar alguns do marketplace do GitHub (por exemplo, semgrep-action).
Uma configuração simples pode ser vista abaixo:
name: Semgrep
on:
pull_request: {}
push:
branches:
- main
- master
paths:
- .github/workflows/semgrep.yml
schedule:
- cron: '0 0 * * 0'
workflow_dispatch: {}
jobs:
semgrep:
name: Scan
runs-on: ubuntu-20.04
env:
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
container:
image: returntocorp/semgrep
steps:
- uses: actions/checkout@v3
- name: Semgrep scan
id: scan
run: semgrep ci --config=auto --sarif -o result.sarif
- name: Upload results
if: failure() && steps.scan.outcome == 'failure'
uses: actions/upload-artifact@v3
with:
name: result.sarif
path: result.sarif
Ele executará o workflow do Semgrep uma vez por semana, a cada pull request, e também quando alguma alteração for acionada nas branchs main ou master. O workflow também salvará o resultado da verificação do Semgrep no formato SARIF.
O que são Artifacts
Um artifact é um arquivo ou conjunto de arquivos produzidos durante a execução de um workflow. Os artifacts também podem ser usados para compartilhar dados com vários jobs em seu workflow. No GitHub Actions, existem duas ações prontas para lidar com artifacts. Quando um job precisa disponibilizar dados para outro job, ele pode usar a ação action/upload-artifact para fazer o upload de um arquivo. Quando o upload é concluído, o outro job pode usar a ação actions/download-artifact para baixar o arquivo e fazer o que for necessário com ele.
Como se comunicar com a API da Conviso Platform
É possível interagir com a Conviso Platform por meio do Conviso CLI e você pode usar essa funcionalidade para importar os resultados de um arquivo SARIF e criar os resultados em um projeto na Conviso Platform. Como exemplo, escrevemos um workflow do GitHub Actions que obtém o arquivo SARIF gerado pelo Semgrep, extrai os resultados e as envia para a Conviso Platform para fazer a gestão lá.
As informações necessárias para o workflow são: `FLOW_API_KEY`, `FLOW_PROJECT_CODE` e `OUTPUT_FILEPATH`. Você pode armazená-las como Action Secrets no seu repositório do GitHub (Configurações > Segurança/Secrets > Actions).
O arquivo de configuração final para enviar as questões enontradas durante uma verificação pode ser visto abaixo:
name: Semgrep + Conviso Platform
on:
workflow_dispatch:
push:
branches:
- main
jobs:
# You can change the Scanner here to anyone who performs SARIF output
scan:
name: Security Scan
runs-on: ubuntu-20.04
container:
image: returntocorp/semgrep
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Semgrep scan
id: scan
run: semgrep --config=auto --sarif -o ${{secrets.OUTPUT_FILEPATH}}
- name: Upload results
uses: actions/upload-artifact@v3
with:
name: ${{secrets.OUTPUT_FILEPATH}}
path: ${{secrets.OUTPUT_FILEPATH}}
submit_findings:
name: Conviso Findings Importation
needs: scan
runs-on: ubuntu-20.04
container:
image: convisoappsec/flowcli:1.12.0-rc.2
env:
FLOW_API_KEY: ${{secrets.FLOW_API_KEY}}
FLOW_PROJECT_CODE: ${{secrets.FLOW_PROJECT_CODE}}
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Download result from previous scan
uses: actions/download-artifact@v3
with:
name: ${{secrets.OUTPUT_FILEPATH}}
- name: SARIF Importation
run: |
conviso findings import-sarif --input-file ${{secrets.OUTPUT_FILEPATH}}
O workflow possui dois jobs. Um é responsável por executar o Semgrep e gerar o arquivo SARIF, e o outro enviará os resultados para a Conviso Platform. Os resultados serão denominados “findings” na Conviso.
Os Findings na Conviso Platform
Esta tela mostra os Findings agrupadas por título:

E esta tela mostra um Finding individual:

Conclusão
Neste post, demonstramos apenas uma maneira de integrar os resultados do scanner Semgrep, executando no modo CI, com a nossa plataforma. A Conviso Platform suporta diferentes tipos de integrações e possui muitos recursos para ajudar você a aprimorar a segurança do seu negócio.
Referências
- Understanding GitHub Actions
- Semgrep Action
- Upload-Artifact v3
- Download-Artifact v3
- Conviso Platform
- Conviso Platform: A complete DevSecOps platform
Autores:
Gabriel Quadros – Analista de Segurança
Ricardo Silva – Analista de Segurança
Tradução: Anderson Bosa – Engenheiro Backend
