Correctifs à base de règles
Ouvrir une demande de correctif sur un résultat de secret ou un résultat d’IaC ouvre une pull request qui le corrige. C’est une règle fixe qui effectue la modification, pas un modèle :
- Secrets : l’identifiant codé en dur devient une lecture d’une variable d’environnement.
- IaC : une propriété d’une ressource reçoit sa valeur sûre.
Le bouton se trouve dans la colonne Correctif sous Sécurité › Résultats › Analyse des secrets et Sécurité › Résultats › IaC. Une personne clique dessus pour un résultat donné. Rien n’est proposé automatiquement, et aucun paramètre ne permet de l’activer.
Rien ne quitte fremforge
Aucun modèle d’IA n’intervient : aucun code n’est envoyé à un fournisseur et aucune clé d’IA n’est nécessaire. Le fichier est lu depuis votre dépôt au commit sur lequel le résultat a été signalé, modifié en mémoire, réanalysé par les propres scanners de fremforge, puis réécrit sous forme de branche dans votre dépôt. L’enregistrement de la demande de correctif conserve les identifiants, les décomptes et le résultat, jamais le fichier, le diff ni l’identifiant secret.
Secrets : lecture depuis l’environnement
L’identifiant trouvé par le scanner est remplacé par une lecture d’une variable d’environnement, dans la même expression :
| Langage | Devient |
|---|---|
| Go | os.Getenv("NAME"), avec "os" ajouté aux imports si nécessaire ; une const sur une ligne devient une var |
| Python | os.environ["NAME"], avec import os ajouté si nécessaire |
| JavaScript, TypeScript | process.env.NAME |
NAME est dérivé de la variable ou de la clé à laquelle la valeur est affectée, en majuscules séparées par des tirets bas (apiToken devient API_TOKEN), ou à défaut de la règle. Les fichiers JSX et TSX, et tous les autres types de fichiers, ne reçoivent pas de correctif : la cellule affiche un tiret, avec la raison pour les lecteurs d’écran et au survol.
Aucun correctif n’est proposé lorsque l’identifiant ne se trouve pas dans une simple chaîne littérale sur une seule ligne : une valeur sur plusieurs lignes, un gabarit de chaîne ou une f-string, ou un bloc const Go.
Déplacer l’identifiant ne le rend pas sûr. Il reste dans l’historique du dépôt. La pull request le précise et, lorsqu’une vérification de validité a trouvé l’identifiant actif, sa première ligne est ROTATE NOW: this credential is live. La pull request ne contient jamais l’identifiant, ni aucune partie de celui-ci. Renouvelez-le à sa source, puis définissez la variable d’environnement partout où le code s’exécute.
IaC : une propriété, une valeur sûre
Seuls les contrôles pour lesquels une propriété a une unique valeur sûre reçoivent un correctif, dans les modèles Terraform, CloudFormation et ARM :
| Contrôle | Propriété (Terraform / CloudFormation, ARM) | Valeur |
|---|---|---|
AWS-0086 Blocage de l’accès public S3 : bloquer les ACL publiques | block_public_acls / BlockPublicAcls | true |
AWS-0087 Blocage de l’accès public S3 : bloquer les politiques publiques | block_public_policy / BlockPublicPolicy | true |
AWS-0091 Blocage de l’accès public S3 : ignorer les ACL publiques | ignore_public_acls / IgnorePublicAcls | true |
AWS-0093 Blocage de l’accès public S3 : restreindre les buckets publics | restrict_public_buckets / RestrictPublicBuckets | true |
AZU-0008 Stockage Azure : transferts HTTPS uniquement | enable_https_traffic_only ou https_traffic_only_enabled / supportsHttpsTrafficOnly | true |
AZU-0011 Stockage Azure : TLS 1.2 minimum | min_tls_version / minimumTlsVersion | TLS1_2 |
AZU-0059 (transfert sécurisé) est corrigé via celui des contrôles AZU-0008 et AZU-0011 qui s’applique sur sa ligne. La propriété doit déjà être écrite avec sa valeur non sûre sur la ligne signalée par le scanner. Un correctif n’ajoute jamais de propriété ni de ressource. Tous les autres contrôles affichent un tiret dans la colonne Correctif ; leur texte de remédiation indique ce qu’il faut modifier.
Ce qui est vérifié avant qu’une pull request existe
- Un seul fichier, celui du résultat, et uniquement les lignes que la règle modifie, plus un import pour un correctif de secret.
- Jamais un test, une configuration de CI,
CODEOWNERS, un fichier de suppression ou un manifeste de dépendances. - Vérification syntaxique : le fichier corrigé doit s’analyser comme avant (
gofmt -epour Go, une compilation pour Python, une analyse syntaxique pour JavaScript et TypeScript), afin qu’un correctif ne puisse pas casser le build par sa syntaxe. - Réanalyse : le même scanner et les mêmes règles que pour le résultat (gitleaks pour les secrets, Trivy pour l’IaC) s’exécutent sur le fichier d’origine et sur le fichier corrigé. Le résultat doit être présent dans l’original, absent du fichier corrigé, et aucun nouveau résultat ne doit apparaître.
La pull request
- Ouverte par le bot AutoFix de votre organisation,
<org>-fremforge-bot-autofix, sur une nouvelle branche sousautofix-rule/, avec le labelautofix. Elle ne porte pas de labelai-generated, puisqu’aucune IA ne l’a produite. - Titre
fix(security): read NAME from the environment in <path>pour un secret, oufix(security): <check title> in <path>pour l’IaC. La description indique ce qui a changé, comment cela a été vérifié et ce qu’il faut contrôler avant de fusionner. - Jamais armée pour la fusion automatique. Vos approbations et vérifications obligatoires s’appliquent comme pour toute pull request. Une personne la relit et la fusionne.
Limites
- Une seule demande en cours par résultat. Redemandez après 10 minutes si une demande s’est terminée sans pull request.
- Au plus 3 pull requests de correctif à base de règles ouvertes par dépôt et 20 demandes par organisation sur toute période de 24 heures. Ces limites utilisent les mêmes paramètres que AI fix, avec leur propre compteur. Les régler sur 0 désactive les correctifs à base de règles.
- Un résultat signalé par la vérification d’une pull request n’existe que sur la branche de cette pull request : corrigez-le dans la pull request elle-même.
API
- Demander un correctif
POST /_app/api/v1/orgs/{org}/code-security/secrets/findings/{id}/fixouPOST /_app/api/v1/orgs/{org}/code-security/iac/findings/{id}/fix, portéefindings:write. Répond202avecrequest_id,status: "locating",engine: "rule"et"automerge": false; la pull request suit en quelques minutes. Un refus est unproblem+jsonavec letyperule-fix-<reason>et unreason, par exemplerule-fix-check-not-supportedourule-fix-already-proposed, qui renvoie aussi la demande existante. - Lister les demandes de correctif
GET /_app/api/v1/orgs/{org}/code-security/fix-requests, portéefindings:read: type, règle, statut, motif, pull request, lignes modifiées et horodatages. Une demande terminée sans pull request en indique la raison, par exemplesecret_in_template,iac_shape_not_supported,rescan_patched_syntaxourescan_finding_still_present.
Audit
Les demandes figurent dans le journal d’audit sous autofix.proposed, autofix.pr_opened, autofix.rejected, autofix.merged et autofix.closed, avec engine: rule.
Voir aussi
- Analyse des secrets et analyse IaC : les résultats sur lesquels se trouve le bouton.
- AI fix : des correctifs pour une courte liste de règles SAST, par le propre modèle d’IA de votre organisation.
- Correctifs de sécurité : des correctifs pour les dépendances et images de base vulnérables.