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:
| Taal | Wordt |
|---|---|
| Go | os.Getenv("NAME"), met "os" zo nodig toegevoegd aan de imports; een const van één regel wordt een var |
| Python | os.environ["NAME"], met import os zo nodig toegevoegd |
| JavaScript, TypeScript | process.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:
| Check | Eigenschap (Terraform / CloudFormation, ARM) | Wordt gezet op |
|---|---|---|
AWS-0086 S3 public access block: block public ACLs | block_public_acls / BlockPublicAcls | true |
AWS-0087 S3 public access block: block public policy | block_public_policy / BlockPublicPolicy | true |
AWS-0091 S3 public access block: ignore public ACLs | ignore_public_acls / IgnorePublicAcls | true |
AWS-0093 S3 public access block: restrict public buckets | restrict_public_buckets / RestrictPublicBuckets | true |
AZU-0008 Azure storage: HTTPS-only transfers | enable_https_traffic_only of https_traffic_only_enabled / supportsHttpsTrafficOnly | true |
AZU-0011 Azure storage: minimum TLS 1.2 | min_tls_version / minimumTlsVersion | TLS1_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 -evoor 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 onderautofix-rule/, met het labelautofix. Hij krijgt geen labelai-generated, omdat er geen AI aan te pas kwam. - Titel
fix(security): read NAME from the environment in <path>voor een secret, offix(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}/fixofPOST /_app/api/v1/orgs/{org}/code-security/iac/findings/{id}/fix, scopefindings:write. Antwoordt202metrequest_id,status: "locating",engine: "rule"en"automerge": false; de pull request volgt binnen een paar minuten. Een weigering isproblem+jsonmettyperule-fix-<reason>en eenreason, bijvoorbeeldrule-fix-check-not-supportedofrule-fix-already-proposed, die ook de bestaande aanvraag bevat. - Fix-aanvragen opvragen
GET /_app/api/v1/orgs/{org}/code-security/fix-requests, scopefindings:read: soort, regel, status, reden, pull request, gewijzigde regels en tijden. Een aanvraag die zonder pull request is geëindigd, vermeldt waarom, bijvoorbeeldsecret_in_template,iac_shape_not_supported,rescan_patched_syntaxofrescan_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
- Secret-scanning en IaC-scans: de bevindingen waar de knop bij staat.
- AI-fix: fixes voor een korte lijst SAST-regels, door het eigen AI-model van je organisatie.
- Beveiligingsfixes: fixes voor kwetsbare afhankelijkheden en base images.