Gå til hovedinnhold

SAST

fremforge kjører OpenGrep på hver pull request og på standardbranchen i hvert repository. Det kjører på fremforges egne skannere, så det er ingen workflow-fil å legge til. En pull request får statusen fremforge/sast og en kommentar. Funnene vises under Sikkerhet › Funn › SAST (/<org>/_admin/security/findings/sast).

Språk

C, C++, C#, Go, Java, JavaScript og TypeScript, Kotlin, PHP, Python, Ruby, Rust, Scala, Swift og Bash.

Regler

Fire regelsett er bygget inn i skanner-imaget. Ingenting hentes mens en skanning kjører:

  • GitLab sast-rules: bare regelmappene per språk, for C#, Go, Java, JavaScript, Python og Scala. De er MIT, bortsett fra Go-reglene, som er avledet fra gosec og er Apache-2.0;
  • 0xdea-reglene for C og C++, MIT;
  • fremforges egne regler, MIT, for JavaScript og TypeScript, Bash, PHP, Ruby, Rust, Kotlin og Swift;
  • fremforges egne taint-regler, MIT, for Python, JavaScript og TypeScript, Java, C# og Go.

GitLab-repositoryet inneholder også innhold under andre lisenser, som fremforge ikke leverer. Byggingen av imaget beholder et sett på en tillatelsesliste, regelmappene per språk, og sletter resten. Deretter sjekker den hver fil den beholdt, og feiler hvis noen av dem har en annen lisens enn MIT, Apache-2.0 eller BSD.

Taint-regler

fremforges taint-regler følger data fra forespørsler der de kommer inn i koden din (en spørringsparameter, et skjemafelt, en header, en informasjonskapsel, en forespørselskropp) til der de kan gjøre skade, og rapporterer stien mellom dem. De dekker SQL-injeksjon, kommando- og kodeinjeksjon, path traversal, server-side request forgery, cross-site scripting og usikker deserialisering i Python, JavaScript og TypeScript, Java, C# og Go. De kjenner forespørselsobjektene i Flask, Django, FastAPI, aiohttp, Express, Koa, Hono, Next.js, Servlet, Spring, JAX-RS, ASP.NET Core, net/http, gin, echo og fiber. En verdi som passerer en sanitiserer på veien (HTML-escaping, reduksjon til et filnavn, en bundet SQL-parameter, en tallkonvertering), rapporteres ikke.

Hva de følger, og hva de ikke følger:

  • data innenfor en funksjon, og mellom funksjoner i samme fil;
  • ikke data som forlater én fil og kommer tilbake i en annen;
  • ikke hvilken gren av en if som kjører, eller hvilken nøkkel i et map eller indeks i en liste som holder en verdi: en verdi som er beskyttet av en sjekk som alltid slår til, kan fortsatt bli rapportert;
  • ingen modeller av tredjepartsbiblioteker ut over kildene, slukene og sanitisererne reglene navngir;
  • test- og spec-filer holdes utenfor.

Hvert funn har med stien fra kilde til sluk. Reglene er på for fremforges egne organisasjoner og av for andre mens andelen falske positiver måles, og funnene deres vises, men blokkerer aldri en merge, uansett alvorlighetsgrad. Der et taint-funn og et funn fra en annen regel står på samme linje for samme svakhet (CWE), vises bare taint-funnet. Slå dem av eller på med innstillingen taint_rules under.

Dine egne regler

En organisasjon kan legge til sine egne OpenGrep-regler. fremforge/sast kjører dem sammen med de innebygde regelsettene på hver pull request og på standardbranchen i hvert repository, med samme modus og blokkeringsterskel, og på en pull request er det bare det den legger til som blokkerer.

Legg dem til under Sikkerhet › Policyer › SAST-regler, via API-et eller med Terraform (se under). Hver regel er YAML med nøyaktig én regel under rules:, og et testeksempel: kode regelen må finne.

rules:
  - id: acme-no-eval
    message: Do not pass data to eval(); use ast.literal_eval or a parser.
    severity: ERROR
    languages: [python]
    pattern: eval(...)

En regel må ha:

  • en id på 2 til 63 små bokstaver, sifre og bindestreker, unik i organisasjonen (funnene vises som custom/<id>);
  • en message, en severity (ERROR, WARNING eller INFO, vist som High, Medium og Low) og 1 til 5 languages: Bash, C, C++, C#, Dockerfile, generic, Go, HTML, Java, JavaScript, JSON, Kotlin, PHP, Python, Ruby, Rust, Scala, Swift, Terraform, TypeScript eller YAML;
  • et mønster: pattern, patterns, pattern-either eller pattern-regex, eller mode: taint med pattern-sources og pattern-sinks.

Bare nøkler for mønstre, metavariabler, taint, paths, fix, options og metadata er tillatt, så en regel kan ikke nå utenfor seg selv. YAML-ankere og -aliaser avvises. Høyst 50 regler per organisasjon, 16 KiB hver, med et testeksempel på høyst 16 KiB.

En lagret regel er Kontrolleres til skanneren har kjørt den med samme opengrep, i det samme avgrensede miljøet som skanningene dine, på regelens eget testeksempel. Den blir Aktiv når den kan parses, finner noe i eksempelet og blir ferdig innen 30 sekunder (5 sekunder per fil); ellers blir den Avvist, med årsaken. Bare en aktiv regel som ikke er slått av, kjører. Endrer du en regel eller eksempelet, sjekkes den på nytt; inntil da kjører den ikke. Du kan slå av en regel uten å slette den.

Funn fra reglene dine vises sammen med de innebygde, i sjekken på pull requesten og under Sikkerhet › Funn › SAST, merket Tilpasset med navnet på regelen. De blokkerer som innebygde funn: ut fra alvorlighetsgraden sammenlignet med blokkeringsterskelen under.

Reglene lagres i fremforge og kjøres derfra. Skanneren henter aldri regler fra en URL eller et register, og sjekken av en regel gjør ingen nettverkskall. Innstillingen custom_rules_url er pensjonert: den leses ikke lenger, og en annen verdi enn null eller "" avvises med custom-rules-url-removed.

API

GET    /_app/api/v1/orgs/{org}/code-security/sast/custom-rules
GET    /_app/api/v1/orgs/{org}/code-security/sast/custom-rules/{id}
POST   /_app/api/v1/orgs/{org}/code-security/sast/custom-rules       { "name": "No eval", "source": "<yaml>", "sample": "<code>", "enabled": true }
PUT    /_app/api/v1/orgs/{org}/code-security/sast/custom-rules/{id}
DELETE /_app/api/v1/orgs/{org}/code-security/sast/custom-rules/{id}

Listing krever findings:read; endringer krever policy:write. En ny eller endret regel kommer tilbake med status pending; skannerens vurdering setter den til valid eller invalid, med status_code (for eksempel no-match eller parse), status_detail (opengreps egen melding, når det finnes en) og status_reason (en setning). En regel API-et kan avvise før skanneren ser den, besvares med 400 og årsaken (for eksempel one-rule eller unknown-key); en id som allerede er brukt, gir duplicate-id, og regel nummer 51 gir limit-reached, begge 409. Hver endring står i revisjonsloggen.

Terraform og OpenTofu

Hver regel er en fremforge_sast_custom_rule (provider 0.5.0 og nyere). En apply venter på skannerens vurdering og feiler med årsaken når regelen avvises; sett wait_for_verdict = false for å hoppe over ventingen.

resource "fremforge_sast_custom_rule" "no_eval" {
  org    = "acme"
  name   = "No eval"
  source = file("sast/no-eval.yaml")
  sample = file("sast/no-eval.sample.py")
}

custom_rules_url på fremforge_sast_settings er utfaset og sendes ikke lenger; fjern den.

Innstillinger

Under Sikkerhet › Funn › SAST, eller GET og PUT /_app/api/v1/orgs/{org}/code-security/sast/settings (PUT krever policy:write):

InnstillingVerdierStandard
SAST enabled for this orgpå, avpå
Block severityinfo, warning, error: funn på eller over dette nivået får fremforge/sast til å feileerror
Taint-regler (taint_rules)default, on, off. default er på for fremforges egne organisasjoner og av for andre. Funnene deres blokkerer aldridefault

Om en sjekk som feiler, blokkerer en merge, avhenger også av sjekkens modus under Sikkerhet › Prioriter › Sjekker for pull requests og av branchbeskyttelsen. På en pull request er det bare funn som pull requesten introduserer, som blokkerer: et funn som bare er flyttet til en annen linje, er ikke nytt.

Funn

Funnene rangeres etter sikkerhet i vurderingen, deretter alvorlighetsgrad, deretter om skanneren sporet data fra en kilde som brukerinndata fram til funnet, og deretter alder. Funn i tester, eksempler, tredjepartskode eller generert kode, og funn fra en regel folk ofte avviser, havner lenger ned; de avvises ikke. Avvis et funn med en begrunnelse, ett om gangen eller mange samtidig, eller med POST .../code-security/sast/findings/{id}/dismiss. Listen finnes også på GET /_app/api/v1/orgs/{org}/code-security/sast/findings.

AI-rettelser

For en kort liste med regler ber AI-rettelse organisasjonens egen AI-modell om en pull request med en rettelse. Den er av som standard; slå den på under Sikkerhet › Utbedre › AI-rettelse. Se AI-rettelser for SAST-funn.

Se også