| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| |
| |
| |
| set -euo pipefail |
|
|
| cd "$(dirname "$0")/.." |
| REQ="${1:-requirements.txt}" |
| OUT="security" |
| mkdir -p "$OUT" |
| STAMP="$(date -u +%Y%m%dT%H%M%SZ)" |
|
|
| [[ -f "$REQ" ]] || { echo "error: '$REQ' not found" >&2; exit 1; } |
|
|
| |
| if command -v uv >/dev/null 2>&1; then |
| echo "==> CycloneDX SBOM -> $OUT/sbom.json" |
| uvx --from cyclonedx-bom cyclonedx-py requirements "$REQ" --of JSON -o "$OUT/sbom.json" |
| else |
| echo "WARN: uv not found; skipping SBOM (install from https://docs.astral.sh/uv/)" >&2 |
| fi |
|
|
| |
| |
| |
| REQ_NOGIT="$(mktemp)"; trap 'rm -f "$REQ_NOGIT"' EXIT |
| grep -v "git+" "$REQ" > "$REQ_NOGIT" |
|
|
| |
| |
| |
| PYBIN="" |
| for cand in python3.13 python3.12 python3.11 python3; do |
| command -v "$cand" >/dev/null 2>&1 || continue |
| td="$(mktemp -d)"; if "$cand" -m venv "$td/probe" >/dev/null 2>&1; then PYBIN="$cand"; rm -rf "$td"; break; fi |
| rm -rf "$td" |
| done |
| if [[ -z "$PYBIN" ]]; then |
| echo "WARN: no Python >=3.11 with a working venv found; skipping pip-audit." >&2 |
| echo " SBOM was still generated at $OUT/sbom.json." >&2 |
| exit 0 |
| fi |
|
|
| VENV="$OUT/.audit-venv" |
| if [[ ! -x "$VENV/bin/pip-audit" ]]; then |
| echo "==> setting up audit venv ($PYBIN)" |
| "$PYBIN" -m venv "$VENV" |
| "$VENV/bin/python" -m pip install -q --upgrade pip pip-audit |
| fi |
|
|
| echo "==> pip-audit (known CVEs in $REQ, git dep excluded)" |
| set +e |
| "$VENV/bin/python" -m pip_audit --requirement "$REQ_NOGIT" --no-deps \ |
| --format columns | tee "$OUT/pip-audit-$STAMP.txt" |
| AUDIT_RC=${PIPESTATUS[0]} |
| "$VENV/bin/python" -m pip_audit --requirement "$REQ_NOGIT" --no-deps \ |
| --format json --output "$OUT/pip-audit-$STAMP.json" >/dev/null 2>&1 || true |
| set -e |
|
|
| echo |
| if [[ "$AUDIT_RC" -eq 0 ]]; then |
| echo "OK: no known vulnerabilities. SBOM at $OUT/sbom.json" |
| else |
| echo "FINDINGS: pip-audit reported vulnerabilities (rc=$AUDIT_RC)." |
| echo "Review $OUT/pip-audit-$STAMP.txt. Note: some pins (gradio, mcp) are" |
| echo "constrained by the HF Space sdk_version and can't be freely bumped." |
| fi |
| exit "$AUDIT_RC" |
|
|