diff --git a/.gitea/workflows/govulncheck.yml b/.gitea/workflows/govulncheck.yml new file mode 100644 index 0000000..bfd1f5c --- /dev/null +++ b/.gitea/workflows/govulncheck.yml @@ -0,0 +1,34 @@ +name: Supply-Chain-Scan (Go) + +on: + push: + paths: + - "**/*.go" + - "go.mod" + - "go.sum" + pull_request: {} + +jobs: + govulncheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "1.22" + - name: govulncheck installieren + run: go install golang.org/x/vuln/cmd/govulncheck@latest + - name: Go-Module auf bekannte Schwachstellen pruefen + shell: bash + run: | + # pipefail ist Pflicht: sonst liefert "govulncheck | tee" den Exit-Code + # von tee (immer 0) statt den von govulncheck zurueck — der Gate-Zweck + # (Akzeptanzkriterium 3: Fund blockiert den Merge) waere sonst wirkungslos. + set -o pipefail + govulncheck ./... | tee govulncheck-report.txt + - name: Scan-Bericht als Artefakt ablegen + if: always() + uses: actions/upload-artifact@v4 + with: + name: govulncheck-report + path: govulncheck-report.txt diff --git a/.gitea/workflows/npm-audit.yml b/.gitea/workflows/npm-audit.yml new file mode 100644 index 0000000..e6d4665 --- /dev/null +++ b/.gitea/workflows/npm-audit.yml @@ -0,0 +1,32 @@ +name: Supply-Chain-Scan (npm) + +on: + push: + paths: + - "web/**/package.json" + - "web/**/package-lock.json" + pull_request: {} + +jobs: + npm-audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Alle Next.js-Frontends auf bekannte Schwachstellen pruefen + shell: bash + run: | + set -o pipefail + status=0 + for pkg in $(find web -maxdepth 2 -name package.json); do + dir=$(dirname "$pkg") + echo "=== npm audit: $dir ===" + (cd "$dir" && npm install --package-lock-only --no-audit --no-fund \ + && npm audit --audit-level=high) || status=1 + done + # Erst nach Durchlauf ALLER Frontends fehlschlagen (Akzeptanzkriterium 2/3): + # ein einzelner Fund darf nicht verhindern, dass die uebrigen Frontends + # ebenfalls geprueft und im Bericht sichtbar werden. + exit $status diff --git a/scripts/verify-supply-chain-gate.sh b/scripts/verify-supply-chain-gate.sh new file mode 100755 index 0000000..ed2d155 --- /dev/null +++ b/scripts/verify-supply-chain-gate.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# OPS-06 Pruefung 1: beweist, dass govulncheck und npm audit eine absichtlich +# verwundbare Testabhaengigkeit tatsaechlich erkennen und mit Exit-Code != 0 +# enden (= wuerden den Merge blockieren). Laeuft auf dem Testhost (Go/npm +# noetig), nicht auf der Entwicklungsmaschine. +set -uo pipefail + +fail=0 + +echo "=== Go-Fixture: golang.org/x/text v0.3.7 (GO-2022-0635 / CVE-2022-32149) ===" +if ! command -v govulncheck >/dev/null 2>&1; then + go install golang.org/x/vuln/cmd/govulncheck@latest +fi +( cd testdata/vulnfixture-go && go mod tidy && govulncheck ./... ) +go_exit=$? +if [ "$go_exit" -eq 0 ]; then + echo "FEHLER: govulncheck hat die bekannte Schwachstelle NICHT erkannt (exit 0 erwartet != 0)" + fail=1 +else + echo "OK: govulncheck hat die Schwachstelle erkannt, exit code $go_exit (!= 0, Gate wuerde blockieren)" +fi + +echo +echo "=== npm-Fixture: lodash 4.17.4 (mehrere bekannte kritische CVEs) ===" +( cd testdata/vulnfixture-npm && npm install --package-lock-only --no-audit --no-fund \ + && npm audit --audit-level=high ) +npm_exit=$? +if [ "$npm_exit" -eq 0 ]; then + echo "FEHLER: npm audit hat die bekannte Schwachstelle NICHT erkannt (exit 0 erwartet != 0)" + fail=1 +else + echo "OK: npm audit hat die Schwachstelle erkannt, exit code $npm_exit (!= 0, Gate wuerde blockieren)" +fi + +echo +if [ "$fail" -eq 0 ]; then + echo "PRUEFUNG 1 BESTANDEN: beide Gates erkennen eine absichtlich verwundbare Testabhaengigkeit und blockieren." +else + echo "PRUEFUNG 1 FEHLGESCHLAGEN: siehe FEHLER oben." +fi +exit $fail diff --git a/testdata/vulnfixture-go/go.mod b/testdata/vulnfixture-go/go.mod new file mode 100644 index 0000000..77d6fb6 --- /dev/null +++ b/testdata/vulnfixture-go/go.mod @@ -0,0 +1,12 @@ +// Absichtlich verwundbares Fixture-Modul fuer OPS-06 Pruefung 1: beweist, dass +// der govulncheck-CI-Schritt eine bekannte Schwachstelle tatsaechlich erkennt +// und den Lauf mit Exit-Code != 0 beendet. Eigenes go.mod, damit die +// veraltete, verwundbare Abhaengigkeit NICHT im Hauptmodul landet. +module gitea.perlbach24.de/scripte/nexarch/testdata/vulnfixture-go + +go 1.22 + +// golang.org/x/text v0.3.7: GO-2022-0635 / CVE-2022-32149 — Denial of Service +// durch uebermaessigen Ressourcenverbrauch beim Parsen von BCP-47-Sprach-Tags. +// Bewusst auf dieser verwundbaren Version gepinnt, siehe scripts/verify-supply-chain-gate.sh. +require golang.org/x/text v0.3.7 diff --git a/testdata/vulnfixture-go/main.go b/testdata/vulnfixture-go/main.go new file mode 100644 index 0000000..1335ed7 --- /dev/null +++ b/testdata/vulnfixture-go/main.go @@ -0,0 +1,19 @@ +// Fixture fuer OPS-06 Pruefung 1 — ruft tatsaechlich in die verwundbare +// Funktion hinein, damit govulncheck den Aufrufpfad (nicht nur die +// Modul-Abhaengigkeit) als erreichbar erkennt. +package main + +import ( + "fmt" + + "golang.org/x/text/language" +) + +func main() { + tag, err := language.Parse("de-DE") + if err != nil { + fmt.Println(err) + return + } + fmt.Println(tag) +} diff --git a/testdata/vulnfixture-npm/package.json b/testdata/vulnfixture-npm/package.json new file mode 100644 index 0000000..d7e5cf1 --- /dev/null +++ b/testdata/vulnfixture-npm/package.json @@ -0,0 +1,8 @@ +{ + "name": "nexarch-vulnfixture-npm", + "private": true, + "description": "Absichtlich verwundbares Fixture-Paket fuer OPS-06 Pruefung 1 — beweist, dass npm audit eine bekannte Schwachstelle erkennt und den Lauf blockiert. Nicht Teil eines echten NEXARCH-Frontends.", + "dependencies": { + "lodash": "4.17.4" + } +}