Gå til hovedinnhold

Regelbaserte rettelser

Åpne PR med rettelse på et secret-funn eller et IaC-funn åpner en pull request som retter det. En fast regel gjør endringen, ikke en modell:

  • Secrets: det hardkodede legitimasjonselementet blir til en lesing av en miljøvariabel.
  • IaC: én egenskap ved en ressurs settes til sin sikre verdi.

Knappen står i kolonnen Rettelse under Sikkerhet › Funn › Skanning etter secrets og Sikkerhet › Funn › IaC. En person klikker på den for ett funn om gangen. Ingenting foreslås automatisk, og det finnes ingen innstilling som slår det på.

Ingenting forlater fremforge

Ingen AI-modell er involvert, så ingen kode sendes til noen leverandør, og ingen AI-nøkkel trengs. Filen leses fra repositoryet ditt ved den commiten funnet ble meldt på, endres i minnet, skannes på nytt med fremforges egne skannere og skrives tilbake som en branch i repositoryet ditt. Posten for rettingsforespørselen beholder ID-er, antall og utfallet, aldri filen, diffen eller legitimasjonen.

Secrets: les fra miljøet

Legitimasjonen som skanneren fant, erstattes med en lesing av en miljøvariabel, i det samme uttrykket:

SpråkBlir
Goos.Getenv("NAME"), med "os" lagt til i importene om nødvendig; en const på én linje blir en var
Pythonos.environ["NAME"], med import os lagt til om nødvendig
JavaScript, TypeScriptprocess.env.NAME

NAME hentes fra variabelen eller nøkkelen som verdien tilordnes, i store bokstaver med understrek (apiToken blir API_TOKEN), eller ellers fra regelen. JSX- og TSX-filer, og alle andre filtyper, får ingen rettelse: cellen viser en strek, med begrunnelsen for skjermlesere og når du holder musepekeren over.

Ingen rettelse foreslås når legitimasjonen ikke står inne i én vanlig strengliteral på én linje: en verdi over flere linjer, en malstreng eller f-streng, eller en Go-const-blokk.

Å flytte legitimasjonen gjør den ikke trygg. Den ligger fortsatt i repositoryets historikk. Pull requesten sier dette, og når en gyldighetssjekk fant ut at legitimasjonen er aktiv, er den første linjen ROTATE NOW: this credential is live. Pull requesten inneholder aldri legitimasjonen eller noen del av den. Roter den hos kilden, og sett deretter miljøvariabelen der koden kjører.

IaC: én egenskap, én sikker verdi

Bare sjekker der én egenskap har én enkelt sikker verdi, får en rettelse, i Terraform, CloudFormation og ARM-maler:

SjekkEgenskap (Terraform / CloudFormation, ARM)Settes til
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 eller https_traffic_only_enabled / supportsHttpsTrafficOnlytrue
AZU-0011 Azure storage: minimum TLS 1.2min_tls_version / minimumTlsVersionTLS1_2

AZU-0059 (sikker overføring) rettes gjennom den av AZU-0008 og AZU-0011 som gjelder på linjen. Egenskapen må allerede være skrevet med sin usikre verdi på linjen som skanneren meldte. En rettelse legger aldri til en egenskap eller en ressurs. Alle andre sjekker viser en strek i kolonnen Rettelse; utbedringsteksten deres sier hva som skal endres.

Hva som sjekkes før en pull request finnes

  • Én fil, funnets egen, og bare linjene som regelen endrer, pluss en import for en secret-rettelse.
  • Aldri en test, CI-konfigurasjon, CODEOWNERS, en undertrykkelsesfil eller et avhengighetsmanifest.
  • Syntakssjekk: den endrede filen må kunne parses som før (gofmt -e for Go, en kompilering for Python, en parsing for JavaScript og TypeScript), så en rettelse kan ikke ødelegge bygget med sin syntaks.
  • Ny skanning: den samme skanneren og de samme reglene som for funnet (gitleaks for secrets, Trivy for IaC) kjøres på den opprinnelige og den endrede filen. Funnet må finnes i originalen, være borte fra den endrede filen, og ingen nye funn kan dukke opp.

Pull requesten

  • Åpnes av organisasjonens AutoFix-bot, <org>-fremforge-bot-autofix, på en ny branch under autofix-rule/, med etiketten autofix. Den har ingen ai-generated-etikett, fordi ingen AI laget den.
  • Tittelen er fix(security): read NAME from the environment in <path> for en secret, eller fix(security): <check title> in <path> for IaC. Beskrivelsen sier hva som ble endret, hvordan det ble sjekket, og hva du bør sjekke før merge.
  • Settes aldri opp for automatisk merge. De påkrevde godkjenningene og sjekkene dine gjelder som for enhver pull request. En person går gjennom og merger den.

Begrensninger

  • Én aktiv forespørsel per funn. Spør igjen etter 10 minutter hvis en forespørsel endte uten en pull request.
  • Høyst 3 åpne pull requests med regelbaserte rettelser per repository og 20 forespørsler per organisasjon i løpet av 24 timer. Disse bruker de samme innstillingene som AI-rettelse, med sin egen teller. Setter du dem til 0, slås regelbaserte rettelser av.
  • Et funn som pull request-sjekken meldte, finnes bare på den pull requestens branch: rett det i selve pull requesten.

API

  • Be om en rettelse POST /_app/api/v1/orgs/{org}/code-security/secrets/findings/{id}/fix eller POST /_app/api/v1/orgs/{org}/code-security/iac/findings/{id}/fix, scope findings:write. Svarer 202 med request_id, status: "locating", engine: "rule" og "automerge": false; pull requesten følger innen noen minutter. Et avslag er problem+json med type rule-fix-<reason> og en reason, for eksempel rule-fix-check-not-supported eller rule-fix-already-proposed, som også har med den eksisterende forespørselen.
  • List rettingsforespørsler GET /_app/api/v1/orgs/{org}/code-security/fix-requests, scope findings:read: type, regel, status, begrunnelse, pull request, endrede linjer og tidspunkter. En forespørsel som endte uten en pull request, sier hvorfor, for eksempel secret_in_template, iac_shape_not_supported, rescan_patched_syntax eller rescan_finding_still_present.

Revisjon

Forespørsler står i revisjonsloggen som autofix.proposed, autofix.pr_opened, autofix.rejected, autofix.merged og autofix.closed, med engine: rule.

Se også