fix(quick-261009-p0m): Review-Befunde WR-01/02/04/05, IN-01/02/03/04 (Abbild-Bau, Semgrep im Container, Zeitbudget, ZAP-Haken)
- WR-01: prisma generate als eigener Schritt mit Pruefung im api-Abbild, Bau scheitert ohne Client; Startprobe als .gitea/scripts/image-start-check.sh versioniert - WR-02: Semgrep im offiziellen Container, per Digest angepinnt (kein pipx/PyPI mehr) - WR-04: Zeitbudget 1500 s, Limits je Werkzeug, Ergebniszeile sofort nach jedem Werkzeug - WR-05: Authorization-Ersetzung der ZAP-Pruefung nur fuer das Ziel - IN-01: yarn/npm per Platzhalter entfernt und Abwesenheit geprueft (api und web) - IN-02: Kommentar zu doppelten Kopfzeilen in next.config.ts richtiggestellt - IN-03: Berichtsordner Modus 700, Zugangsdaten nur als base64 (keine curl-Konfiguration) - IN-04: flacher Klon wird bei gitleaks als unvollstaendig gemeldet Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -28,7 +28,11 @@
|
||||
# Entwicklungsrechner aus eine Anmeldung (401) verlangt. Der
|
||||
# Kopf geht ueber eine temporaere Umgebungsdatei (Modus 0600,
|
||||
# wird beim Beenden entfernt) in den Container, nie auf eine
|
||||
# Befehlszeile und in keine Ausgabe.
|
||||
# Befehlszeile und in keine Ausgabe. Der Haken schickt ihn NUR an
|
||||
# das Ziel (ZAP_TARGET), nie an andere Adressen. Sonderzeichen im
|
||||
# Passwort (" oder \) sind erlaubt.
|
||||
#
|
||||
# Berichtsordner: Modus 700 (nur der ZAP-Benutzer mit Kennung 1000 schreibt, niemand sonst liest).
|
||||
#
|
||||
# Hinweis: Wird die Anmeldedatei benutzt, enthaelt der Bericht die gesendeten Kopfzeilen
|
||||
# und damit die Zugangsdaten. Dann den Berichtsordner nicht weitergeben.
|
||||
@@ -64,10 +68,18 @@ if [ "${1:-}" = "--print-plan" ]; then
|
||||
fi
|
||||
|
||||
TMP_FILES=""
|
||||
RUN_LOG=""
|
||||
# Entfernt die temporaeren Dateien mit dem Kopf (Zugangsdaten).
|
||||
cleanup() {
|
||||
for f in $TMP_FILES; do rm -f "$f"; done
|
||||
TMP_FILES=""
|
||||
}
|
||||
trap cleanup EXIT HUP INT TERM PIPE
|
||||
# Beim Beenden (auch bei Abbruch) zusaetzlich das Zwischenprotokoll entfernen.
|
||||
cleanup_all() {
|
||||
cleanup
|
||||
[ -n "$RUN_LOG" ] && rm -f "$RUN_LOG"
|
||||
}
|
||||
trap cleanup_all EXIT HUP INT TERM PIPE
|
||||
|
||||
echo "ZAP-Grundpruefung gegen $TARGET (nur passiv, keine Formulare, keine Angriffe)"
|
||||
|
||||
@@ -84,19 +96,22 @@ case "$CODE" in
|
||||
echo "benutzer:passwort, und rufen Sie das Skript mit ZAP_BASIC_AUTH_FILE=Pfad auf." >&2
|
||||
exit 4
|
||||
fi
|
||||
CRED=$(head -n 1 "$ZAP_BASIC_AUTH_FILE" | tr -d '\r\n')
|
||||
CURL_CFG=$(mktemp) || exit 4
|
||||
# Die Zugangsdaten gehen nur als base64-Text weiter (enthaelt keine Anfuehrungszeichen,
|
||||
# Rueckstriche oder Leerzeichen), also nie durch einen Parser, der Sonderzeichen deutet:
|
||||
# weder curl-Konfiguration noch Befehlszeile. Passwoerter mit " oder \ sind unkritisch.
|
||||
B64=$(head -n 1 "$ZAP_BASIC_AUTH_FILE" | tr -d '\r\n' | base64 | tr -d '\n')
|
||||
HDR_FILE=$(mktemp) || exit 4
|
||||
ENV_FILE=$(mktemp) || exit 4
|
||||
TMP_FILES="$CURL_CFG $ENV_FILE"
|
||||
chmod 600 "$CURL_CFG" "$ENV_FILE"
|
||||
printf 'user = "%s"\n' "$CRED" > "$CURL_CFG"
|
||||
CODE2=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 20 -K "$CURL_CFG" "$TARGET/login" 2>/dev/null) || CODE2=000
|
||||
TMP_FILES="$HDR_FILE $ENV_FILE"
|
||||
chmod 600 "$HDR_FILE" "$ENV_FILE"
|
||||
printf 'Authorization: Basic %s\n' "$B64" > "$HDR_FILE"
|
||||
printf 'ZAP_BASIC_AUTH=Basic %s\n' "$B64" > "$ENV_FILE"
|
||||
B64=""
|
||||
CODE2=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 20 -H "@$HDR_FILE" "$TARGET/login" 2>/dev/null) || CODE2=000
|
||||
if [ "$CODE2" != "200" ]; then
|
||||
echo "Mit den hinterlegten Zugangsdaten antwortet das Ziel mit Status $CODE2, Abbruch." >&2
|
||||
exit 4
|
||||
fi
|
||||
printf 'ZAP_BASIC_AUTH=Basic %s\n' "$(printf '%s' "$CRED" | base64 | tr -d '\n')" > "$ENV_FILE"
|
||||
CRED=""
|
||||
;;
|
||||
*)
|
||||
echo "Das Ziel antwortet auf /login nicht mit Status 200 (Status $CODE), Abbruch." >&2
|
||||
@@ -106,9 +121,24 @@ case "$CODE" in
|
||||
esac
|
||||
|
||||
# --- Berichtsordner: der Container laeuft als Benutzer zap (Kennung 1000) ---------
|
||||
# Nur dieser eine Benutzer darf schreiben (Modus 700), kein anderer Benutzer des Rechners
|
||||
# darf lesen -- der Bericht kann die Zugangsdaten enthalten. Hat Ihr Konto die Kennung
|
||||
# 1000 (der Normalfall), genuegt chmod; sonst uebergibt ein kurzer Container-Aufruf den
|
||||
# Ordner an die Kennung 1000 und danach wieder an Sie zurueck.
|
||||
mkdir -p "$REPORT_DIR" || exit 3
|
||||
REPORT_DIR=$(cd "$REPORT_DIR" && pwd)
|
||||
chmod 777 "$REPORT_DIR"
|
||||
chmod 700 "$REPORT_DIR"
|
||||
ME_UID=$(id -u)
|
||||
ME_GID=$(id -g)
|
||||
HANDOVER=no
|
||||
if [ "$ME_UID" != "1000" ]; then
|
||||
if docker run --rm --user 0:0 -v "$REPORT_DIR:/zap/wrk:rw" "$IMAGE" chown 1000:1000 /zap/wrk >/dev/null 2>&1; then
|
||||
HANDOVER=yes
|
||||
else
|
||||
echo "Der Berichtsordner konnte nicht an den ZAP-Benutzer (Kennung 1000) uebergeben werden." >&2
|
||||
exit 3
|
||||
fi
|
||||
fi
|
||||
|
||||
set -- docker run --rm
|
||||
[ -n "${ZAP_DOCKER_NETWORK:-}" ] && set -- "$@" --network "$ZAP_DOCKER_NETWORK"
|
||||
@@ -119,10 +149,20 @@ set -- "$@" -v "$REPORT_DIR:/zap/wrk:rw" -v "$HOOK_FILE:$HOOK_IN_CONTAINER:ro" "
|
||||
|
||||
# Exit-Codes von ZAP (0 ok, 1 Fehler, 2 Warnung, 3 Fehlstart) sind hier nicht
|
||||
# entscheidend: es zaehlt, ob der Bericht entstanden ist.
|
||||
"$@" > "$REPORT_DIR/zap-lauf.log" 2>&1
|
||||
# Das Protokoll geht zuerst in eine eigene Datei: der Berichtsordner gehoert waehrend des
|
||||
# Laufs eventuell der Kennung 1000, nicht Ihrem Konto.
|
||||
RUN_LOG=$(mktemp) || exit 3
|
||||
"$@" > "$RUN_LOG" 2>&1
|
||||
# Die Umgebungsdatei mit dem Kopf wird nur fuer den Lauf gebraucht: sofort entfernen.
|
||||
cleanup
|
||||
TMP_FILES=""
|
||||
if [ "$HANDOVER" = yes ]; then
|
||||
# Ordner samt Inhalt zurueck an das eigene Konto, damit Sie den Bericht lesen koennen.
|
||||
docker run --rm --user 0:0 -v "$REPORT_DIR:/zap/wrk:rw" "$IMAGE" chown -R "$ME_UID:$ME_GID" /zap/wrk >/dev/null 2>&1 ||
|
||||
echo "Hinweis: Der Berichtsordner gehoert noch der Kennung 1000; mit sudo chown -R $ME_UID:$ME_GID uebernehmen." >&2
|
||||
fi
|
||||
cat "$RUN_LOG" > "$REPORT_DIR/zap-lauf.log" 2>/dev/null
|
||||
rm -f "$RUN_LOG"
|
||||
RUN_LOG=""
|
||||
echo "ZAP-Lauf beendet (Protokoll: $REPORT_DIR/zap-lauf.log)"
|
||||
|
||||
if [ ! -s "$REPORT_DIR/zap.json" ]; then
|
||||
|
||||
Reference in New Issue
Block a user