Naar de hoofdinhoud

Fixes op basis van regels

Fix-PR openen bij een secretbevinding of een IaC-bevinding opent een pull request die haar oplost. Een vaste regel maakt de wijziging, geen model:

  • Geheimen: de hardgecodeerde inloggegeven wordt het uitlezen van een omgevingsvariabele.
  • IaC: één eigenschap van een resource wordt op haar veilige waarde gezet.

De knop staat in de kolom Fix onder Beveiliging › Bevindingen › Secret-scanning en Beveiliging › Bevindingen › IaC. Een persoon klikt erop voor één bevinding. Er wordt niets automatisch voorgesteld, en er is geen instelling om het aan te zetten.

Er verlaat niets fremforge

Er komt geen AI-model aan te pas, dus er gaat geen code naar een provider en je hebt geen AI-sleutel nodig. Het bestand wordt uit je repository gelezen op de commit waarop de bevinding is ontstaan, in het geheugen aangepast, opnieuw gescand op de eigen scanners van fremforge en als branch teruggeschreven naar je repository. Het record van de fix-aanvraag bewaart id’s, aantallen en de uitkomst, nooit het bestand, de diff of de inloggegeven.

Secrets: uitlezen uit de omgeving

De inloggegeven die de scanner vond, wordt in dezelfde expressie vervangen door het uitlezen van een omgevingsvariabele:

TaalWordt
Goos.Getenv("NAME"), met "os" zo nodig toegevoegd aan de imports; een const van één regel wordt een var
Pythonos.environ["NAME"], met import os zo nodig toegevoegd
JavaScript, TypeScriptprocess.env.NAME

NAME komt van de variabele of sleutel waaraan de waarde wordt toegekend, in upper snake case (apiToken wordt API_TOKEN), en anders van de regel. JSX- en TSX-bestanden, en elk ander bestandstype, krijgen geen fix: de cel toont een streepje, met de reden voor schermlezers en bij hover.

Er wordt geen fix voorgesteld als de inloggegeven niet in één gewone stringliteral op één regel staat: een waarde over meerdere regels, een template string of f-string, of een Go-blok const.

De inloggegeven verplaatsen maakt hem niet veilig. Hij staat nog steeds in de geschiedenis van de repository. De pull request zegt dat ook, en als een geldigheidscontrole de inloggegeven actief vond, is de eerste regel ROTATE NOW: this credential is live. De pull request bevat nooit de inloggegeven of een deel ervan. Roteer hem bij de bron en stel daarna de omgevingsvariabele in overal waar de code draait.

IaC: één eigenschap, één veilige waarde

Alleen checks waarbij één eigenschap één veilige waarde heeft, krijgen een fix, in Terraform, CloudFormation en ARM-templates:

CheckEigenschap (Terraform / CloudFormation, ARM)Wordt gezet op
AWS-0086 S3 public access block: block public ACLsblock_public_acls / BlockPublicAclstrue
AWS-0087 S3 public access block: block public policyblock_public_policy / BlockPublicPolicytrue
AWS-0091 S3 public access block: ignore public ACLsignore_public_acls / IgnorePublicAclstrue
AWS-0093 S3 public access block: restrict public bucketsrestrict_public_buckets / RestrictPublicBucketstrue
AZU-0008 Azure storage: HTTPS-only transfersenable_https_traffic_only of https_traffic_only_enabled / supportsHttpsTrafficOnlytrue
AZU-0011 Azure storage: minimum TLS 1.2min_tls_version / minimumTlsVersionTLS1_2

AZU-0059 (secure transfer) wordt opgelost via welke van AZU-0008 en AZU-0011 ook op zijn regel van toepassing is. De eigenschap moet al met haar onveilige waarde op de regel staan die de scanner meldde. Een fix voegt nooit een eigenschap of resource toe. Elke andere check toont een streepje in de kolom Fix; de hersteltekst ervan zegt wat je moet aanpassen.

Wat er wordt gecontroleerd voordat er een pull request is

  • Eén bestand, dat van de bevinding zelf, en alleen de regels die de regel aanpast, plus een import bij een secretfix.
  • Nooit een test, CI-configuratie, CODEOWNERS, een suppressiebestand of een dependency-manifest.
  • Syntaxiscontrole: het aangepaste bestand moet net zo parsen als ervoor (gofmt -e voor Go, een compile voor Python, een parse voor JavaScript en TypeScript), zodat een fix de build niet via de syntaxis kan breken.
  • Nieuwe scan: dezelfde scanner en regels als bij de bevinding (gitleaks voor secrets, Trivy voor IaC) draaien op het oorspronkelijke en het aangepaste bestand. De bevinding moet in het origineel staan, uit het aangepaste bestand verdwenen zijn, en er mag geen nieuwe bevinding verschijnen.

De pull request

  • Geopend door de AutoFix-bot van je organisatie, <org>-fremforge-bot-autofix, op een nieuwe branch onder autofix-rule/, met het label autofix. Hij krijgt geen label ai-generated, omdat er geen AI aan te pas kwam.
  • Titel fix(security): read NAME from the environment in <path> voor een secret, of fix(security): <check title> in <path> voor IaC. De beschrijving vertelt wat er is veranderd, hoe het is gecontroleerd en wat je moet nakijken voordat je samenvoegt.
  • Nooit ingesteld op automatisch samenvoegen. Je verplichte goedkeuringen en checks gelden zoals bij elke pull request. Een persoon reviewt en voegt hem samen.

Limieten

  • Eén lopende aanvraag per bevinding. Is een aanvraag geëindigd zonder pull request, vraag dan na 10 minuten opnieuw.
  • Maximaal 3 openstaande pull requests met fixes op basis van regels per repository en 20 aanvragen per organisatie per 24 uur. Ze gebruiken dezelfde instellingen als AI-fix, met een eigen teller. Zet je ze op 0, dan staan fixes op basis van regels uit.
  • Een bevinding die door de pull-request-check is gemeld, bestaat alleen op de branch van die pull request: los haar op in de pull request zelf.

API

  • Een fix aanvragen POST /_app/api/v1/orgs/{org}/code-security/secrets/findings/{id}/fix of POST /_app/api/v1/orgs/{org}/code-security/iac/findings/{id}/fix, scope findings:write. Antwoordt 202 met request_id, status: "locating", engine: "rule" en "automerge": false; de pull request volgt binnen een paar minuten. Een weigering is problem+json met type rule-fix-<reason> en een reason, bijvoorbeeld rule-fix-check-not-supported of rule-fix-already-proposed, die ook de bestaande aanvraag bevat.
  • Fix-aanvragen opvragen GET /_app/api/v1/orgs/{org}/code-security/fix-requests, scope findings:read: soort, regel, status, reden, pull request, gewijzigde regels en tijden. Een aanvraag die zonder pull request is geëindigd, vermeldt waarom, bijvoorbeeld secret_in_template, iac_shape_not_supported, rescan_patched_syntax of rescan_finding_still_present.

Audit

Aanvragen staan in de auditlog als autofix.proposed, autofix.pr_opened, autofix.rejected, autofix.merged en autofix.closed, met engine: rule.

Zie ook