Gå til hovedindhold

SAST

fremforge kører OpenGrep på hver pull request og på hvert repositorys standardbranch. Det kører på fremforges egne scannere, så der er ingen workflow-fil at tilføje. En pull request får statussen fremforge/sast og en kommentar. Fund listes under Sikkerhed › Fund › SAST (/<org>/_admin/security/findings/sast).

Sprog

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

Regler

Fire regelsæt er bygget ind i scannerens image. Intet hentes, mens en scanning kører:

  • GitLab sast-rules: kun mapperne med regler pr. sprog, til C#, Go, Java, JavaScript, Python og Scala. De er MIT, bortset fra Go-reglerne, som er afledt af gosec og er Apache-2.0;
  • 0xdea-reglerne til C og C++, MIT;
  • fremforges egne regler, MIT, til JavaScript og TypeScript, Bash, PHP, Ruby, Rust, Kotlin og Swift;
  • fremforges egne taint-regler, MIT, til Python, JavaScript og TypeScript, Java, C# og Go.

GitLab-repositoriet indeholder også indhold under andre licenser, som fremforge ikke leverer. Byggeriet af imaget beholder et tilladt sæt, mapperne med regler pr. sprog, og sletter resten. Derefter tjekker det hver fil, det har beholdt, og fejler, hvis nogen af dem har en anden licens end MIT, Apache-2.0 eller BSD.

Taint-regler

fremforges taint-regler følger data fra en request fra det sted, hvor de kommer ind i din kode (en query-parameter, et formularfelt, en header, en cookie, en request-body), til det sted, hvor de kan gøre skade, og rapporterer stien mellem dem. De dækker SQL-injection, kommando- og kodeinjection, path traversal, server-side request forgery, cross-site scripting og usikker deserialisering i Python, JavaScript og TypeScript, Java, C# og Go. De kender request-objekterne i Flask, Django, FastAPI, aiohttp, Express, Koa, Hono, Next.js, Servlet, Spring, JAX-RS, ASP.NET Core, net/http, gin, echo og fiber. En værdi, der på vejen passerer gennem en sanitizer (en HTML-escape, en reduktion til et filnavn, en bundet SQL-parameter, en konvertering til tal), rapporteres ikke.

Hvad de følger, og hvad de ikke følger:

  • data inden for en funktion og mellem funktioner i samme fil;
  • ikke data, der forlader én fil og kommer tilbage i en anden;
  • ikke hvilken gren af en if der kører, eller hvilken nøgle i et map eller indeks i en liste der indeholder en værdi: en værdi, der er beskyttet af et tjek, som altid går igennem, kan stadig blive rapporteret;
  • ingen modeller af tredjepartsbiblioteker ud over de kilder, sinks og sanitizers, reglerne navngiver;
  • test- og spec-filer udelades.

Hvert fund indeholder stien fra kilde til sink. De er slået til for fremforges egne organisationer og fra for andre, mens deres andel af falske positiver måles, og deres fund listes, men blokerer aldrig en merge, uanset alvorlighed. Hvor et taint-fund og et fund fra en anden regel ligger på samme linje for samme svaghed (CWE), listes kun taint-fundet. Slå dem til eller fra med indstillingen taint_rules nedenfor.

Dine egne regler

En organisation kan tilføje sine egne OpenGrep-regler. fremforge/sast kører dem sammen med de indbyggede regelsæt på hver pull request og på hvert repositorys standardbranch, med samme tilstand og blokeringsalvorlighed, og på en pull request blokerer kun det, den tilføjer.

Tilføj dem under Sikkerhed › Politikker › SAST-regler, via API’et eller med Terraform (nedenfor). Hver regel er YAML med præcis én regel under rules: og et testeksempel: kode, reglen skal finde.

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 skal have:

  • et id på 2 til 63 små bogstaver, cifre og bindestreger, unikt i organisationen (dens fund vises som custom/<id>);
  • en message, en severity (ERROR, WARNING eller INFO, vist som Høj, Middel og Lav) 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.

Kun nøgler for mønstre, metavariabler, taint, paths, fix, options og metadata er tilladt, så en regel ikke kan nå uden for sig selv. YAML-ankre og -aliasser afvises. Højst 50 regler pr. organisation, 16 KiB hver, med et testeksempel på højst 16 KiB.

En gemt regel står som Kontrolleres, indtil scanneren har kørt den med samme opengrep, i samme afgrænsede miljø som dine scanninger, på dens eget testeksempel. Den bliver Aktiv, når den kan parses, finder noget i eksemplet og bliver færdig inden for 30 sekunder (5 sekunder pr. fil); ellers bliver den Afvist med årsagen. Kun en aktiv regel, der ikke er slået fra, kører. Ændrer du en regel eller dens eksempel, kontrolleres den igen; indtil da kører den ikke. Du kan slå en regel fra uden at slette den.

Fund fra dine regler vises sammen med de indbyggede, i tjekket på pull requesten og under Sikkerhed › Fund › SAST, mærket Tilpasset med reglens navn. De blokerer som indbyggede fund: efter deres alvorlighed set i forhold til blokeringsalvorligheden nedenfor.

Regler gemmes i fremforge og køres derfra. Scanneren henter aldrig regler fra en URL eller et registry, og kontrollen af en regel foretager intet netværkskald. Indstillingen custom_rules_url er udfaset: den læses ikke længere, og en anden værdi end null eller "" afvises 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}

Listning kræver findings:read; ændringer kræver policy:write. En ny eller ændret regel kommer tilbage med status pending; scannerens vurdering sætter den til valid eller invalid med status_code (for eksempel no-match eller parse), status_detail (opengreps egen besked, når der er en) og status_reason (en sætning). En regel, som API’et kan afvise, før scanneren ser den, besvares med 400 og årsagen (for eksempel one-rule eller unknown-key); et id, der er i brug, giver duplicate-id, og regel nummer 51 giver limit-reached, begge 409. Hver ændring står i revisionsloggen.

Terraform og OpenTofu

Hver regel er en fremforge_sast_custom_rule (provider 0.5.0 og senere). En apply venter på scannerens vurdering og fejler med årsagen, når reglen afvises; sæt wait_for_verdict = false for at springe ventetiden over.

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 forældet og sendes ikke længere; fjern den.

Indstillinger

Under Sikkerhed › Fund › SAST eller med GET og PUT /_app/api/v1/orgs/{org}/code-security/sast/settings (PUT kræver policy:write):

IndstillingVærdierStandard
SAST aktiveret for denne organisationtil, fratil
Blokeringsalvorlighedinfo, warning, error: fund på eller over den får fremforge/sast til at fejleerror
Taint-regler (taint_rules)default, on, off. default er slået til for fremforges egne organisationer og fra for andre. Deres fund blokerer aldrigdefault

Om et fejlende tjek blokerer en merge, afhænger også af tjekkets tilstand under Sikkerhed › Prioritér › Pull request-tjek og af branch protection. På en pull request blokerer kun fund, som pull requesten introducerer: et fund, der blot er flyttet til en anden linje, er ikke nyt.

Fund

Fund rangeres efter sikkerhed, derefter alvorlighed, derefter om scanneren sporede data fra en kilde som brugerinput til fundet, og derefter alder. Fund i tests, eksempler, tredjeparts- eller genereret kode og fund fra en regel, som folk ofte afviser, listes længere nede; de afvises ikke. Afvis et fund med en begrundelse, ét ad gangen eller samlet, eller med POST .../code-security/sast/findings/{id}/dismiss. Listen findes også på GET /_app/api/v1/orgs/{org}/code-security/sast/findings.

AI-rettelser

For en kort liste af regler beder AI-rettelse din organisations egen AI-model om en pull request med en rettelse. Den er slået fra som standard; slå den til under Sikkerhed › Ret › AI-rettelse. Se AI-rettelser til SAST-fund.

Se også