Aller au contenu principal

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 :

LangageDevient
Goos.Getenv("NAME"), avec "os" ajouté aux imports si nécessaire ; une const sur une ligne devient une var
Pythonos.environ["NAME"], avec import os ajouté si nécessaire
JavaScript, TypeScriptprocess.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ôlePropriété (Terraform / CloudFormation, ARM)Valeur
AWS-0086 Blocage de l’accès public S3 : bloquer les ACL publiquesblock_public_acls / BlockPublicAclstrue
AWS-0087 Blocage de l’accès public S3 : bloquer les politiques publiquesblock_public_policy / BlockPublicPolicytrue
AWS-0091 Blocage de l’accès public S3 : ignorer les ACL publiquesignore_public_acls / IgnorePublicAclstrue
AWS-0093 Blocage de l’accès public S3 : restreindre les buckets publicsrestrict_public_buckets / RestrictPublicBucketstrue
AZU-0008 Stockage Azure : transferts HTTPS uniquementenable_https_traffic_only ou https_traffic_only_enabled / supportsHttpsTrafficOnlytrue
AZU-0011 Stockage Azure : TLS 1.2 minimummin_tls_version / minimumTlsVersionTLS1_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 -e pour 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 sous autofix-rule/, avec le label autofix. Elle ne porte pas de label ai-generated, puisqu’aucune IA ne l’a produite.
  • Titre fix(security): read NAME from the environment in <path> pour un secret, ou fix(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}/fix ou POST /_app/api/v1/orgs/{org}/code-security/iac/findings/{id}/fix, portée findings:write. Répond 202 avec request_id, status: "locating", engine: "rule" et "automerge": false ; la pull request suit en quelques minutes. Un refus est un problem+json avec le type rule-fix-<reason> et un reason, par exemple rule-fix-check-not-supported ou rule-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ée findings: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 exemple secret_in_template, iac_shape_not_supported, rescan_patched_syntax ou rescan_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