#!/usr/bin/env bash # OPS-06 Pruefung 1: beweist, dass govulncheck und npm audit eine absichtlich # verwundbare Testabhaengigkeit tatsaechlich ERKENNEN (nicht nur irgendeinen # Fehler werfen) und mit Exit-Code != 0 enden (= wuerden den Merge blockieren). # Laeuft auf dem Testhost (Go/npm noetig), nicht auf der Entwicklungsmaschine. # # Wichtig: ein Exit-Code != 0 allein ist KEIN Beweis — ein fehlendes Tool # ("command not found", exit 127) sieht fuer ein reines Exit-Code-Gate genauso # aus wie ein echter Fund. Deshalb prueft dieses Skript zusaetzlich, dass die # erwartete Advisory-Kennung tatsaechlich in der Ausgabe steht. set -uo pipefail # "go install" legt Binaries in $(go env GOPATH)/bin ab — auf frischen Hosts # ist das nicht zwangslaeufig im PATH (gefunden 2026-08-28 auf dem Testhost: # govulncheck installierte erfolgreich, "command -v govulncheck" schlug danach # trotzdem fehl, weil /root/go/bin nicht im PATH stand). Defensiv ergaenzen, # statt stillschweigend als "Werkzeug fehlt" fehlzuschlagen. export PATH="$PATH:$(go env GOPATH 2>/dev/null)/bin" fail=0 echo "=== Go-Fixture: golang.org/x/text v0.3.7, GO-2022-1059 (Symbolpfad language.ParseAcceptLanguage) ===" if ! command -v govulncheck >/dev/null 2>&1; then echo "govulncheck fehlt, installiere..." # @latest kann eine govulncheck-Version verlangen, die neuer ist als die # lokal installierte Go-Toolchain (z. B. "requires go >= 1.25.0"). Feste, # bekannt kompatible Version statt @latest, damit die Installation nicht # von der jeweiligen Go-Version des Hosts abhaengt. if ! go install golang.org/x/vuln/cmd/govulncheck@v1.1.3; then echo "FEHLER: govulncheck konnte nicht installiert werden — Pruefung nicht durchfuehrbar, kein Ersatz-'OK'." fail=1 fi fi if command -v govulncheck >/dev/null 2>&1; then go_output=$(cd testdata/vulnfixture-go && go mod tidy && govulncheck ./... 2>&1) go_exit=$? echo "$go_output" if [ "$go_exit" -eq 0 ]; then echo "FEHLER: govulncheck hat die bekannte Schwachstelle NICHT erkannt (exit 0 erwartet != 0)" fail=1 elif ! grep -q "GO-2022-1059" <<<"$go_output"; then echo "FEHLER: exit code $go_exit ist != 0, aber die erwartete Advisory GO-2022-1059 steht NICHT in der Ausgabe — das ist vermutlich ein Werkzeugfehler (z. B. fehlendes govulncheck, Netzwerkproblem), kein echter Fund. Kein 'OK'." fail=1 else echo "OK: govulncheck hat GO-2022-1059 tatsaechlich als Fund gemeldet, exit code $go_exit (!= 0, Gate wuerde blockieren)" fi else # Bug (gefunden 2026-08-28): dieser Zweig druckte vorher nur eine Meldung, # setzte aber "fail" NICHT — das Skript endete trotzdem mit Exit-Code 0 und # "PRUEFUNG 1 BESTANDEN", obwohl der Go-Teil real nicht lief. Exakt derselbe # Fehlerklasse (Werkzeugfehler zaehlt als Erfolg), nur eine Ebene hoeher. echo "FEHLER: govulncheck weiterhin nicht verfuegbar — Go-Teil der Pruefung nicht durchgefuehrt, kein Ersatz-'OK'." fail=1 fi echo echo "=== npm-Fixture: lodash 4.17.4 (mehrere bekannte kritische CVEs) ===" npm_output=$(cd testdata/vulnfixture-npm && npm install --package-lock-only --no-audit --no-fund 2>&1 \ && npm audit --audit-level=high 2>&1) npm_exit=$? echo "$npm_output" if [ "$npm_exit" -eq 0 ]; then echo "FEHLER: npm audit hat die bekannte Schwachstelle NICHT erkannt (exit 0 erwartet != 0)" fail=1 elif ! grep -qiE "severity|vulnerabilit" <<<"$npm_output"; then echo "FEHLER: exit code $npm_exit ist != 0, aber die Ausgabe enthaelt keinen erkennbaren Schwachstellen-Hinweis — vermutlich ein Werkzeugfehler (z. B. fehlendes npm, Netzwerkproblem), kein echter Fund. Kein 'OK'." fail=1 else echo "OK: npm audit hat die Schwachstelle tatsaechlich gemeldet, 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 inhaltlich (nicht nur per Exit-Code) und wuerden blockieren." else echo "PRUEFUNG 1 FEHLGESCHLAGEN: siehe FEHLER oben." fi exit $fail