Open Source SAST com Horusec
Posted on July 14, 2024 (Last modified on August 15, 2024) • 10 min read • 1,992 wordsMais um manual e casos de uso atualizados dessa ótima solução de scans de vulnerabilidades em código fonte.
Horusec é uma ferramenta de Análise Estática de Segurança de Aplicações (SAST) que auxilia no processo de desenvolvimento seguro de software. Projeto todo conduzido e mantido pelo pessoal da ZupIT.
Desenvolvido com o objetivo de identificar vulnerabilidades em código-fonte de forma automatizada, o Horusec se destaca por sua eficiência e integração com diversas tecnologias.
Além disso, a documentação oficial do Horusec é abrangente e detalhada, fornecendo guias passo a passo para instalação, configuração e uso da ferramenta. Há também tutoriais e exemplos práticos que ajudam os usuários a entender melhor como tirar proveito das funcionalidades oferecidas.
Horusec tem sido amplamente adotado por equipes de desenvolvimento que buscam incorporar práticas de segurança em seu fluxo de trabalho. Aqui estão alguns exemplos de como a ferramenta pode ser utilizada:
Abordaremos alguns casos de uso mais comuns, lembrando que o objetivo destes tutoriais é para o uso local de desenvolvedores e em pipelines simples em Github Actions. Cenários mais complexos serão trazido mais adiante.
Nos laboratórios abaixo, utilizaremos os seguintes recursos:
O plugin do Horusec pode ser encontrado na loja de extensões do VsCode. Apesar de há muito sem atualizações, tudo ainda funciona muito bem.
Procure pelo Horusec no Marketplace de plugins do VsCode.
Uma vez instalado, abra a pasta do seu projeto e execute o scan.
Análise no projeto em Python VamPI.
Análise no projeto em .NET VulnerableLightApp.
Realize o download do binário do acessando o repositório no Github ou baixe via linha de comando.
Nos exemplos abaixo o teste é realizado em ambiente Windows, o que não muda nada para as demais arquiteturas.
#x64
curl "https://github.com/ZupIT/horusec/releases/download/v2.9.0-beta.3/horusec_windows_amd64.exe" -o "./horusec.exe"
#arm64
curl "https://github.com/ZupIT/horusec/releases/download/v2.9.0-beta.3/horusec_windows_arm64.exe" -o "./horusec.exe"
#Linux x64
wget https://github.com/ZupIT/horusec/releases/download/v2.9.0-beta.3/horusec_mac_amd64 -O horusec ; \
chmod +x horusec
#Mac M1/M2
wget https://github.com/ZupIT/horusec/releases/download/v2.9.0-beta.3/horusec_mac_arm64 -O -O horusec ; \
chmod +x horusec
Se preferir, mova os arquivos em seguida para a pasta de binários:
sudo mv horusec /usr/local/bin/
O Horusec foi muitas possibilidades de configuração, caso queira gerar um arquivo com todas as possibilidades de condifuração, execute com a opção generate
.
.\horusec.exe generate
O arquivo horusec-config.json
será gerado, como o abaixo.
Nada muda muito do exemplo acima (sem Docker), com excessão da permanência padrão da opção de uso de todos os recursos dependentes do Docker.
horusec start -G -o="sarif" -O="horusec_report.sarif" -p="vulnerable_apps/VulnerableLightApp"
Comparação entre o uso sem e com o Docker.
Utilizando as outras engines solicitadas via Docker, foram encontradas 13 vulnerabilidades, enquanto com as engines padrões apenas 3. As engines default do Horusec são as seguintes:
Na página de documentação deles é possível visualizar a lista das ferramentas auxiliares, linguagens cobertas e suas versões.
Para começar, entre no diretório do projeto a ser analisado e execute o seguinte comando:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/src/horusec \
horuszup/horusec-cli:v2.9.0-beta.3 horusec start -p /src/horusec -P $(pwd)
Você pode encorpar seu script com diversas variáveis, isso será muito útil para a as integrações nas pipelines. Copie e cole o script abaixo em seu terminal caso esteja em ambiente Linux ou Mac:
#CRIA PASTA DE RELATÓRIO
mkdir reports; \
#CONFIGURAÇÃO DE PARÂMETROS DO HORUSEC
#image="0xtiago/horusec-cli"; \
image="horuszup/horusec-cli:v2.9.0-beta.3"; \
severity_exception="LOW,UNKNOWN,INFO"; \
report_type="json"; \
report_directory="reports" ;\
report_file="horusec_report.json" ;\
ignore="**/tmp/**,
**/.vscode/**,\
**/.venv/**, \
**/.env/**, \
**/tests/**, \
**/test/**, \
**/test/, \
**/*.Tests/**, \
**/*.Test/**, \
**/test_*, \
**/appsettings.*.json, \
**/bin/Debug/*/appsettings.*.json, \
**/*.yml, \
**/bin/Debug/*/appsettings.json, \
**/*.sarif" ;\
# EXECUTA CONTAINER DO HORUSEC REMOVENDO-O AO FIM DA EXECUÇÃO
docker pull $image ;\
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/src/horusec $image horusec start \
-p /src/horusec -P $(pwd) \
-o="$report_type" \
-O="/src/horusec/$report_directory/$report_file" \
-s=$severity_exception \
--ignore=$ignore \
--information-severity=true
Em Mac ou Linux, pode executar diretamente o seguinte script em seu terminal:
bash <(curl -s https://raw.githubusercontent.com/0xtiago/opensource-devsecops/main/tools/horusec/horusec_linux.sh)
Se estiver em ambiente Windows, basta copiar e copiar o seguinte script no powershell:
# CONFIGURAÇÃO DE PARÂMETROS DO HORUSEC
$image = "horuszup/horusec-cli:v2.9.0-beta.3"
$severity_exception = "LOW,UNKNOWN,INFO"
$report_type = "json"
$report_directory = "reports"
$report_path = "reports/horusec_report.json"
$ignore = @(
"**/tmp/**",
"**/.vscode/**",
"**/.venv/**",
"**/.env/**",
"**/tests/**",
"**/test/**",
"**/test/",
"**/*.Tests/**",
"**/*.Test/**",
"**/test_*",
"**/appsettings.*.json",
"**/bin/Debug/*/appsettings.*.json",
"**/*.yml",
"**/bin/Debug/*/appsettings.json",
"**/*.sarif"
) -join ','
# CRIA PASTA DE RELATÓRIO
if (-Not (Test-Path -Path reports)) {
New-Item -ItemType Directory -Path $report_directory
}
# EXECUTA CONTAINER DO HORUSEC REMOVENDO-O AO FIM DA EXECUÇÃO
docker pull $image
docker run --rm `
-v /var/run/docker.sock:/var/run/docker.sock `
-v ${PWD}:/src/horusec $image horusec start `
-p /src/horusec -P ${PWD} `
-o="$report_type" `
-O="$report_directory/$report_path" `
-s="$severity_exception" `
--ignore="$ignore" `
--information-severity=$true
Ou, pode executar diretamente o seguinte script em seu terminal algumas das alternativas abaixo:
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/0xtiago/opensource-devsecops/main/tools/horusec/horusec_docker_windows.ps1" -OutFile "horusec_docker_windows.ps1"; .\horusec_docker_windows.ps1; Remove-Item "horusec_docker_windows.ps1"
Ou…
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/0xtiago/opensource-devsecops/main/tools/horusec/horusec_docker_windows.ps1'))
Valores do DockerHub no mês de 07/2024.
O Horusec por CLI possui tipos de relatório voltados para visualização em cli (text) ou para que sejam importados para outra soluções (json, sarif, sonarqube), porém não há opções visuais para para uso na pipeline como artefato ou localmente como nos exemplos anteriores. Para ajudar nesta necessidade, podemos adotar o uso de scrips customizados para tratar estas informações e converter para um markdown.
Dada a seguinte estrutura do json vigente na versão v2.9.0-beta.3
, utilizaremos o Python 3 e a biblioteca grip
para ajudar na visualização do Markdown.
{
"version": "v2.9.0-beta.3",
"id": "af2cf885-da12-4eaf-b277-bacb4b514efa",
"repositoryID": "00000000-0000-0000-0000-000000000000",
"repositoryName": "",
"workspaceID": "00000000-0000-0000-0000-000000000000",
"workspaceName": "",
"status": "success",
"errors": "",
"createdAt": "2024-07-22T19:07:43.491963638Z",
"finishedAt": "2024-07-22T19:07:50.525841211Z",
"analysisVulnerabilities": [
{
"vulnerabilityID": "00000000-0000-0000-0000-000000000000",
"analysisID": "af2cf885-da12-4eaf-b277-bacb4b514efa",
"createdAt": "2024-07-22T19:07:50.525846794Z",
"vulnerabilities": {
"vulnerabilityID": "0e9ac1d1-d971-40b6-93ab-f049ac5c5c7d",
"line": "12",
"column": "21",
"confidence": "MEDIUM",
"file": "config.py",
"code": "vuln_app.app.config['SECRET_KEY'] = 'random'",
"details": "DESCRIÇÃO DA VULNERABILIDADE",
"securityTool": "HorusecEngine",
"language": "Leaks",
"severity": "CRITICAL",
"type": "Vulnerability",
"commitAuthor": "-",
"commitEmail": "-",
"commitHash": "-",
"commitMessage": "-",
"commitDate": "-",
"rule_id": "HS-LEAKS-25",
"vulnHash": "9e117a0e8c29e2cfa26ebae8f4c2e40c97dbc0d408d0bc2b77809a127c4f7380",
"deprecatedHashes": [
"6ed75629a18be6d8b4b1303a4c6d3bc7adec12975e75351573d476206d6ccecb",
"15b8662ec5d7866e1a8e32608dbfdd34c9d2f8d3f200a4572879fdb71b0f8679"
],
"securityToolVersion": "",
"securityToolInfoUri": ""
}
},
{
"vulnerabilityID": "00000000-0000-0000-0000-000000000000",
"analysisID": "af2cf885-da12-4eaf-b277-bacb4b514efa",
"createdAt": "2024-07-22T19:07:50.525851877Z",
"vulnerabilities": {
"vulnerabilityID": "29dca9c1-2af3-4909-8e6f-51bddfce806d",
"line": "48",
"column": "70",
"confidence": "MEDIUM",
"file": "models/user_model.py",
"code": "payload = jwt.decode(auth_token, vuln_app.app.config.get('SECRET_KEY'), algorithms=[\"HS256\"])",
"details": "DESCRIÇÃO DA VULNERABILIDADE",
"securityTool": "HorusecEngine",
"language": "Leaks",
"severity": "CRITICAL",
"type": "Vulnerability",
"commitAuthor": "-",
"commitEmail": "-",
"commitHash": "-",
"commitMessage": "-",
"commitDate": "-",
"rule_id": "HS-LEAKS-25",
"vulnHash": "8f2fccfa6177367da180c79a2c6c9f030a338a8c464e08bda9483bca266b9276",
"deprecatedHashes": [
"ebc728f3e0cd90b6495ffc5b0adaa1d3f669b33a8d9e10f02830ff15f61918c2",
"6073e224d1a70921ed541833dfc3a51a1123ba3e7df368054c8f027f23614eae"
],
"securityToolVersion": "",
"securityToolInfoUri": ""
}
}
]
}
Considerando que o horusec_report.json está no mesmo diretório de execução, você pode baixar o script horusec_json2md.py
e executar passando os argumentos da seguinte forma:
#Baixe o script
wget https://raw.githubusercontent.com/0xtiago/opensource-devsecops/main/tools/horusec/horusec_json2md/horusec_json2md.py ;
pip install colorama
#Execute passando os argumentos com o local do json e o destino do markdown
./horusec_json2md.py horusec_report.json horusec_report.md
Opcionalmente, instale o colorama (pip install colorama
) para exibir cores do output quando houver ou não vulnerabilidades.
Após a execução, você pode utilizar a biblioteca grip ou qualquer outra aplicação para visualizar o markdown, como o Typora ou o VsCode.
#Instale o grip
pip install grip
# Abra o markdown
grip horusec_report.md
# ou caso o seu ambiente nao encontro o grip apos a instação\
python -m grip horusec_report.md
Acesse a URL gerada pelo grip através do Flask:
http://localhost:6419/
Visualizando no VsCode:
Você pode visualizar um exemplo do markdown clicando aqui.
Para facilitar com one-liners, abaixo exemplos em Linux/Mac e Windows que utilizaremos mais tarde na documentação do report na pipeline, usando a mesma premissa que o arquivo json está no mesmo diretório de execução e o arquivo markdown será gerado no mesmo local:
#Linux ou Mac
wget -qO- https://raw.githubusercontent.com/0xtiago/opensource-devsecops/main/tools/horusec/horusec_json2md/horusec_json2md.py | python3 - horusec_report.json horusec_report.md
#Windows
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/0xtiago/opensource-devsecops/main/tools/horusec/horusec_json2md/horusec_json2md.py" -OutFile "horusec_json2md.py" ; python horusec_json2md.py horusec_report.json horusec_report.md
Assim como qualquer outra solução por linha de comando, podemos utilizar o Horusec nas pipelines de desenvolvimento.
No marketplace do Github há uma solução pronta, mas como quero customizar um pouco o processo, você pode utilizar como exemplo o script abaixo, onde o scan é realizado, é gerado um relatório em markdown do arquivo json, o artefato é disponibilizado como artefato e é adicionado ao sumário para analise imediata do desenvolvedor.
name: Run Horusec (SAST), Generate Script and Save Artifact
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
run-scripts:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: SAST - Horusec Run 🐞
run: |
curl -sL https://raw.githubusercontent.com/0xtiago/opensource-devsecops/main/tools/horusec/horusec_docker_linux.sh| bash
- name: SAST - Horusec Report Generation 📊
run: |
cd reports
curl -sL https://raw.githubusercontent.com/0xtiago/opensource-devsecops/main/tools/horusec/horusec_json2md/horusec_json2md.py -o horusec_json2md.py
python3 horusec_json2md.py horusec_report.json horusec_report.md
- name: SAST - Horusec Upload Report Artifact 💾
uses: actions/upload-artifact@v3
with:
name: SAST - Horusec Scan
path: reports/horusec_report.md
- name: SAST - Horusec Results In Summary 💁🏽
run: cat reports/horusec_report.md >> $GITHUB_STEP_SUMMARY
Adicione o arquivo em .github/workflows/nome_do_workflow.yml
na raiz do seu projeto mantido no Github. Aqui chamo meu arquivo de sast-horusec.yml
Abaixo um resumo do processo na pipeline.
A implementação de testes de segurança estática (SAST) é essencial para qualquer desenvolvedor comprometido com a criação de software seguro e confiável. Esses testes permitem a identificação precoce de vulnerabilidades no código-fonte, antes mesmo da execução do programa, garantindo a mitigação de riscos e a conformidade com normas de segurança. Além disso, ao integrar SAST no ciclo de desenvolvimento, os desenvolvedores podem melhorar continuamente suas práticas de codificação, reduzindo custos e evitando potenciais falhas de segurança que poderiam comprometer a integridade dos sistemas. Portanto, a adoção de SAST é um passo crucial para garantir a segurança e a robustez das aplicações modernas.
Outros artigos serão publicado por este que vos fala, complementando todo o ciclo de testes de segurança no deploy de uma aplicação.
Até mais.
👾