Gå til hovedindhold

Regelbaserede rettelser

Åbn rettelses-PR på et fund af en secret eller et IaC-fund åbner en pull request, der retter det. Ændringen laves af en fast regel, ikke af en model:

  • Secrets: den hårdkodede legitimationsoplysning erstattes af en læsning af en miljøvariabel.
  • IaC: én egenskab på en ressource sættes til sin sikre værdi.

Knappen står i kolonnen Rettelse under Sikkerhed › Fund › Hemmelighedsscanning og Sikkerhed › Fund › IaC. En person klikker på den for ét fund ad gangen. Intet foreslås automatisk, og der er ingen indstilling, der slår det til.

Intet forlader fremforge

Der indgår ingen AI-model, så ingen kode sendes til nogen udbyder, og der er ikke brug for en AI-nøgle. Filen læses fra dit repository ved det commit, fundet blev rejst på, ændres i hukommelsen, scannes igen på fremforges egne scannere og skrives tilbage som en branch i dit repository. Registreringen af rettelsesanmodningen gemmer id’er, antal og udfaldet, aldrig filen, diffen eller legitimationsoplysningen.

Secrets: læs fra miljøet

Den legitimationsoplysning, scanneren fandt, erstattes af en læsning af en miljøvariabel i det samme udtryk:

SprogBliver til
Goos.Getenv("NAME"), med "os" tilføjet til imports om nødvendigt; en const på én linje bliver til en var
Pythonos.environ["NAME"], med import os tilføjet om nødvendigt
JavaScript, TypeScriptprocess.env.NAME

NAME tages fra den variabel eller nøgle, værdien tildeles, skrevet i store bogstaver med understreger (apiToken bliver til API_TOKEN), og ellers fra reglen. JSX- og TSX-filer og alle andre filtyper får ingen rettelse: cellen viser en tankestreg, med begrundelsen til skærmlæsere og ved hover.

Der foreslås ingen rettelse, når legitimationsoplysningen ikke står i én almindelig strengliteral på én linje: en værdi over flere linjer, en template-streng eller f-streng eller en const-blok i Go.

At flytte legitimationsoplysningen gør den ikke sikker. Den ligger stadig i repositoriets historik. Det står i pull requesten, og når et gyldighedstjek har fundet legitimationsoplysningen aktiv, er første linje ROTATE NOW: this credential is live. Pull requesten indeholder aldrig legitimationsoplysningen eller nogen del af den. Rotér den ved kilden, og sæt derefter miljøvariablen overalt, hvor koden kører.

IaC: én egenskab, én sikker værdi

Kun tjek, hvor én egenskab har en enkelt sikker værdi, får en rettelse, i Terraform, CloudFormation og ARM-skabeloner:

TjekEgenskab (Terraform / CloudFormation, ARM)Sættes 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: kun HTTPS-overførslerenable_https_traffic_only eller https_traffic_only_enabled / supportsHttpsTrafficOnlytrue
AZU-0011 Azure storage: mindst TLS 1.2min_tls_version / minimumTlsVersionTLS1_2

AZU-0059 (sikker overførsel) rettes via den af AZU-0008 og AZU-0011, der gælder på dens linje. Egenskaben skal allerede stå med sin usikre værdi på den linje, scanneren rapporterede. En rettelse tilføjer aldrig en egenskab eller en ressource. Alle andre tjek viser en tankestreg i kolonnen Rettelse; deres afhjælpningstekst siger, hvad der skal ændres.

Hvad der tjekkes, før en pull request findes

  • Én fil, fundets egen, og kun de linjer, reglen ændrer, plus en import ved en rettelse af en secret.
  • Aldrig en test, CI-konfiguration, CODEOWNERS, en undertrykkelsesfil eller et afhængighedsmanifest.
  • Syntakstjek: den patchede fil skal kunne parses, som den kunne før (gofmt -e for Go, en kompilering for Python, en parsing for JavaScript og TypeScript), så en rettelse ikke kan ødelægge buildet med sin syntaks.
  • Genscanning: den samme scanner og de samme regler som fundet (gitleaks for secrets, Trivy for IaC) køres på den oprindelige og den patchede fil. Fundet skal være i den oprindelige fil og væk fra den patchede, og intet nyt fund må dukke op.

Pull requesten

  • Åbnes af din organisations AutoFix-bot, <org>-fremforge-bot-autofix, på en ny branch under autofix-rule/, med labelen autofix. Den har ingen ai-generated-label, fordi ingen AI har lavet den.
  • Titlen er fix(security): read NAME from the environment in <path> for en secret eller fix(security): <check title> in <path> for IaC. Beskrivelsen fortæller, hvad der blev ændret, hvordan det blev tjekket, og hvad du skal tjekke før merge.
  • Sættes aldrig til automatisk merge. Dine påkrævede godkendelser og tjek gælder som for enhver anden pull request. En person reviewer og merger den.

Grænser

  • Én aktiv anmodning pr. fund. Spørg igen efter 10 minutter, hvis en anmodning sluttede uden en pull request.
  • Højst 3 åbne pull requests med regelbaserede rettelser pr. repository og 20 anmodninger pr. organisation inden for 24 timer. De bruger de samme indstillinger som AI-rettelse, med deres egen tæller. Sættes de til 0, slås regelbaserede rettelser fra.
  • Et fund, der er rejst af tjekket på en pull request, findes kun på den pull requests branch: ret det i selve pull requesten.

API

  • Anmod 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 inden for få minutter. Et afslag er problem+json med type rule-fix-<reason> og en reason, fx rule-fix-check-not-supported eller rule-fix-already-proposed, som også indeholder den eksisterende anmodning.
  • List rettelsesanmodninger GET /_app/api/v1/orgs/{org}/code-security/fix-requests, scope findings:read: type, regel, status, begrundelse, pull request, ændrede linjer og tidspunkter. En anmodning, der sluttede uden en pull request, oplyser hvorfor, fx secret_in_template, iac_shape_not_supported, rescan_patched_syntax eller rescan_finding_still_present.

Revision

Anmodninger står i revisionsloggen som autofix.proposed, autofix.pr_opened, autofix.rejected, autofix.merged og autofix.closed, med engine: rule.

Se også