Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions security/reports/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Security HTML reports

Tracked outputs from the multi-scanner CVE automation:

- `cve-report.html` — consolidated scanner status and findings
- `human-review.html` — FIX/IGNORE recommendations for items that need code or process changes

Machine-readable JSON/SBOM artifacts are written to the `security-reports/` directory (ignored by Git) locally via `make security-scan`.
OpenVEX acceptances live in `security/vex/fastworkflow.openvex.json`.
108 changes: 108 additions & 0 deletions security/reports/cve-report.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>fastWorkflow CVE Report — 2026-08-08 19:57 UTC</title>
<style>
:root { --bg:#f6f7f9; --card:#fff; --ink:#1a1d23; --muted:#5c6570; --line:#d8dee6; --ok:#0b6b3a; --skip:#8a6d00; --fail:#9b1c1c; }
body { margin:0; font-family: "IBM Plex Sans", "Source Sans 3", "Segoe UI", sans-serif; color:var(--ink); background:linear-gradient(180deg,#eef2f6,#f8f6f2 40%,#f6f7f9); }
header { padding:2.5rem 2rem 1.5rem; border-bottom:1px solid var(--line); background:radial-gradient(1200px 400px at 10% -10%, #d9e7f5, transparent), #fff; }
h1 { margin:0 0 .4rem; font-size:1.8rem; letter-spacing:-0.02em; }
.sub { color:var(--muted); max-width:70ch; line-height:1.45; }
main { padding:1.5rem 2rem 3rem; display:grid; gap:1.25rem; }
section { background:var(--card); border:1px solid var(--line); border-radius:12px; padding:1.25rem 1.4rem; box-shadow:0 1px 0 rgba(16,24,40,.03); }
h2 { margin:0 0 .8rem; font-size:1.15rem; }
table { width:100%; border-collapse:collapse; font-size:.92rem; }
th,td { text-align:left; padding:.55rem .5rem; border-bottom:1px solid var(--line); vertical-align:top; }
th { color:var(--muted); font-weight:600; font-size:.8rem; text-transform:uppercase; letter-spacing:.04em; }
.badge { display:inline-block; padding:.15rem .5rem; border-radius:999px; font-size:.75rem; font-weight:600; }
.badge.ok { background:#e5f6ec; color:var(--ok); }
.badge.skipped { background:#fff3cd; color:var(--skip); }
.badge.failed { background:#fde8e8; color:var(--fail); }
.kpi { display:flex; flex-wrap:wrap; gap:1rem; }
.kpi div { min-width:140px; padding:.8rem 1rem; background:#f3f6fa; border-radius:10px; }
.kpi strong { display:block; font-size:1.4rem; }
.note { color:var(--muted); font-size:.9rem; }
code { background:#f0f3f7; padding:.1rem .35rem; border-radius:4px; }
</style>
</head>
<body>
<header>
<h1>fastWorkflow multi-scanner CVE report</h1>
<p class="sub">Generated 2026-08-08 19:57 UTC against branch <code>cursor/cve-report-and-remediation-88cc</code> (post PR #59 / v2.30.1). Tools: Trivy, Grype, Syft, Snyk, Docker Scout, Dockle, Dive, osv-scanner (+ pip-audit corroboration).</p>
</header>
<main>
<section>
<h2>Executive summary</h2>
<div class="kpi">
<div><strong>1</strong>Python advisory (diskcache)</div>
<div><strong>0</strong>Fixable via pyproject.toml</div>
<div><strong>0</strong>Open Python vulns after OpenVEX</div>
<div><strong>24</strong>Proxy-image High/Critical (not product)</div>
</div>
<p class="note" style="margin-top:1rem">Easy third-party package bumps: <strong>none</strong>. Full OSV sweep of 142 locked PyPI packages found only <code>diskcache==5.6.3</code>, and PyPI still has no patched release (latest remains 5.6.3). Existing floors in <code>pyproject.toml</code> already cover prior CVE sets (litellm, multipart, starlette, cryptography, etc.).</p>
</section>
<section>
<h2>Scanner run status</h2>
<table>
<thead><tr><th>Tool</th><th>Status</th><th>Notes</th></tr></thead>
<tbody><tr><td>Syft</td><td><span class='badge ok'>OK</span></td><td>SBOM generated from poetry.lock (JSON/table/SPDX)</td></tr>
<tr><td>Trivy</td><td><span class='badge ok'>OK</span></td><td>FS/lockfile scan: 1 MEDIUM (diskcache), suppressed via OpenVEX → 0 open</td></tr>
<tr><td>Grype</td><td><span class='badge ok'>OK</span></td><td>SBOM scan: 1 MEDIUM (diskcache); with OpenVEX → 0 matches (1 ignoredMatch)</td></tr>
<tr><td>osv-scanner</td><td><span class='badge ok'>OK</span></td><td>poetry.lock: 1 MEDIUM (diskcache / CVE-2025-69872 / PYSEC-2026-2447); no fixed version</td></tr>
<tr><td>pip-audit</td><td><span class='badge ok'>OK</span></td><td>Corroborates diskcache PYSEC-2026-2447; no patched release on PyPI</td></tr>
<tr><td>Snyk</td><td><span class='badge skipped'>SKIPPED</span></td><td>SNYK_TOKEN not configured (CLI installed)</td></tr>
<tr><td>Docker Scout</td><td><span class='badge skipped'>SKIPPED</span></td><td>Docker Hub login required for scout CLI (plugin v1.24.0 installed)</td></tr>
<tr><td>Dockle</td><td><span class='badge ok'>OK (proxy image)</span></td><td>python:3.12-slim-bookworm — CIS warn CIS-DI-0001 (root user); info HEALTHCHECK/content-trust; no first-party Dockerfile</td></tr>
<tr><td>Dive</td><td><span class='badge ok'>OK (proxy image)</span></td><td>python:3.12-slim-bookworm efficiency≈0.969; repo has no first-party Dockerfile</td></tr></tbody>
</table>
</section>
<section>
<h2>Python / poetry.lock findings (pre-VEX)</h2>
<table>
<thead><tr><th>CVE / ID</th><th>Package</th><th>Version</th><th>Severity</th><th>Fixed in</th><th>Summary</th><th>Detected by</th></tr></thead>
<tbody><tr><td>CVE-2025-69872</td><td>diskcache</td><td>5.6.3</td><td>MEDIUM</td><td>None (no release)</td><td>DiskCache has unsafe pickle deserialization</td><td>osv-scanner, trivy, grype, pip-audit</td></tr></tbody>
</table>
<p class="note">With <code>security/vex/fastworkflow.openvex.json</code>, Trivy and Grype report a clean poetry.lock. See human-review report for Fix/Ignore decision.</p>
</section>
<section>
<h2>Proxy image High/Critical (python:3.12-slim-bookworm)</h2>
<p class="note">Included because Dockle/Dive/Scout/image scanners require an image and this repo has no Dockerfile. These are distro CVEs in a stand-in base image — not shipped by fastWorkflow.</p>
<p class="note">Severity totals — Critical: 6, High: 18 (unique HIGH/CRITICAL package findings listed below)</p>
<table>
<thead><tr><th>Sev</th><th>ID</th><th>Package</th><th>Installed</th><th>Fixed</th><th>Title</th></tr></thead>
<tbody>
<tr><td>CRITICAL</td><td>CVE-2023-45853</td><td>zlib1g</td><td>1:1.2.13.dfsg-1</td><td>—</td><td>zlib: integer overflow and resultant heap-based buffer overflow in zipOpenNewFileInZip4_6</td></tr>
<tr><td>CRITICAL</td><td>CVE-2025-7458</td><td>libsqlite3-0</td><td>3.40.1-2+deb12u2</td><td>—</td><td>sqlite: SQLite integer overflow</td></tr>
<tr><td>CRITICAL</td><td>CVE-2026-13221</td><td>perl-base</td><td>5.36.0-7+deb12u3</td><td>—</td><td>Perl versions through 5.43.9 produce silently incorrect regular expres ...</td></tr>
<tr><td>CRITICAL</td><td>CVE-2026-42496</td><td>perl-base</td><td>5.36.0-7+deb12u3</td><td>—</td><td>perl-archive-tar: perl-archive-tar: Path traversal via crafted symlinks allows arbitrary file access</td></tr>
<tr><td>CRITICAL</td><td>CVE-2026-57433</td><td>perl-base</td><td>5.36.0-7+deb12u3</td><td>—</td><td>Storable versions before 3.41 for Perl have a signed integer overflow ...</td></tr>
<tr><td>CRITICAL</td><td>CVE-2026-8376</td><td>perl-base</td><td>5.36.0-7+deb12u3</td><td>—</td><td>perl: Perl: Heap buffer overflow when compiling regular expressions on 32-bit builds</td></tr>
<tr><td>HIGH</td><td>CVE-2025-69720</td><td>libncursesw6</td><td>6.4-4</td><td>—</td><td>ncurses: ncurses: Buffer overflow vulnerability may lead to arbitrary code execution.</td></tr>
<tr><td>HIGH</td><td>CVE-2025-69720</td><td>libtinfo6</td><td>6.4-4</td><td>—</td><td>ncurses: ncurses: Buffer overflow vulnerability may lead to arbitrary code execution.</td></tr>
<tr><td>HIGH</td><td>CVE-2025-69720</td><td>ncurses-base</td><td>6.4-4</td><td>—</td><td>ncurses: ncurses: Buffer overflow vulnerability may lead to arbitrary code execution.</td></tr>
<tr><td>HIGH</td><td>CVE-2025-69720</td><td>ncurses-bin</td><td>6.4-4</td><td>—</td><td>ncurses: ncurses: Buffer overflow vulnerability may lead to arbitrary code execution.</td></tr>
<tr><td>HIGH</td><td>CVE-2026-41992</td><td>gzip</td><td>1.12-1</td><td>—</td><td>GNU gzip contains a global buffer overflow vulnerability in the LZH de ...</td></tr>
<tr><td>HIGH</td><td>CVE-2026-42497</td><td>perl-base</td><td>5.36.0-7+deb12u3</td><td>—</td><td>perl-Archive-Tar: perl-Archive-Tar: Arbitrary file modification via crafted hardlinks during archive extraction</td></tr>
<tr><td>HIGH</td><td>CVE-2026-48962</td><td>perl-base</td><td>5.36.0-7+deb12u3</td><td>—</td><td>perl-IO-Compress: perl-IO-Compress: Arbitrary code execution via attacker-controlled output glob</td></tr>
<tr><td>HIGH</td><td>CVE-2026-53615</td><td>bsdutils</td><td>1:2.38.1-5+deb12u3</td><td>—</td><td>[Integer Overflow or Wraparound in libblkid/src/partitions/dos.c]</td></tr>
<tr><td>HIGH</td><td>CVE-2026-53615</td><td>libblkid1</td><td>2.38.1-5+deb12u3</td><td>—</td><td>[Integer Overflow or Wraparound in libblkid/src/partitions/dos.c]</td></tr>
<tr><td>HIGH</td><td>CVE-2026-53615</td><td>libmount1</td><td>2.38.1-5+deb12u3</td><td>—</td><td>[Integer Overflow or Wraparound in libblkid/src/partitions/dos.c]</td></tr>
<tr><td>HIGH</td><td>CVE-2026-53615</td><td>libsmartcols1</td><td>2.38.1-5+deb12u3</td><td>—</td><td>[Integer Overflow or Wraparound in libblkid/src/partitions/dos.c]</td></tr>
<tr><td>HIGH</td><td>CVE-2026-53615</td><td>libuuid1</td><td>2.38.1-5+deb12u3</td><td>—</td><td>[Integer Overflow or Wraparound in libblkid/src/partitions/dos.c]</td></tr>
<tr><td>HIGH</td><td>CVE-2026-53615</td><td>mount</td><td>2.38.1-5+deb12u3</td><td>—</td><td>[Integer Overflow or Wraparound in libblkid/src/partitions/dos.c]</td></tr>
<tr><td>HIGH</td><td>CVE-2026-53615</td><td>util-linux</td><td>2.38.1-5+deb12u3</td><td>—</td><td>[Integer Overflow or Wraparound in libblkid/src/partitions/dos.c]</td></tr>
<tr><td>HIGH</td><td>CVE-2026-53615</td><td>util-linux-extra</td><td>2.38.1-5+deb12u3</td><td>—</td><td>[Integer Overflow or Wraparound in libblkid/src/partitions/dos.c]</td></tr>
<tr><td>HIGH</td><td>CVE-2026-54369</td><td>libacl1</td><td>2.3.1-3</td><td>—</td><td>acl: Symlink traversal privilege escalation via libacl functions</td></tr>
<tr><td>HIGH</td><td>CVE-2026-57432</td><td>perl-base</td><td>5.36.0-7+deb12u3</td><td>—</td><td>perl: Perl: Information disclosure via integer overflow in pack/unpack operations</td></tr>
<tr><td>HIGH</td><td>CVE-2026-9538</td><td>perl-base</td><td>5.36.0-7+deb12u3</td><td>—</td><td>perl-Archive-Tar: perl-Archive-Tar: Denial of Service via crafted tar header with large entry size</td></tr>
</tbody>
</table>
</section>
<section>
<h2>Artifacts</h2>
<p class="note">Machine-readable outputs were written under gitignored <code>security-reports/</code> (Syft SBOM, Trivy/Grype/OSV JSON, Dockle/Dive JSON, status notes for Snyk/Scout). Tracked HTML lives in <code>security/reports/</code>.</p>
</section>
</main>
</body>
</html>
70 changes: 70 additions & 0 deletions security/reports/human-review.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>fastWorkflow vulnerability human review — 2026-08-08 19:57 UTC</title>
<style>
body { margin:0; font-family:"IBM Plex Sans","Source Sans 3","Segoe UI",sans-serif; color:#1a1d23; background:linear-gradient(180deg,#f3efe8,#f7f8fa); }
header { padding:2.5rem 2rem 1.25rem; background:#fff; border-bottom:1px solid #d8dee6; }
h1 { margin:0 0 .4rem; font-size:1.7rem; }
.sub { color:#5c6570; max-width:70ch; line-height:1.45; }
main { padding:1.5rem 2rem 3rem; display:grid; gap:1rem; }
article { background:#fff; border:1px solid #d8dee6; border-radius:12px; padding:1.2rem 1.4rem; }
.rec { display:inline-block; font-weight:700; letter-spacing:.04em; padding:.25rem .65rem; border-radius:6px; margin-bottom:.6rem; }
h3 { margin:.2rem 0 .6rem; }
h4 { margin:1rem 0 .35rem; font-size:.95rem; color:#3b4450; }
p { margin:.35rem 0; line-height:1.5; }
.meta { color:#5c6570; font-size:.92rem; }
.legend { display:flex; gap:1rem; margin-top:1rem; flex-wrap:wrap; }
.legend span { padding:.2rem .55rem; border-radius:6px; font-weight:600; font-size:.8rem; }
</style>
</head>
<body>
<header>
<h1>Vulnerabilities requiring human review</h1>
<p class="sub">Findings that cannot be closed by an easy <code>pyproject.toml</code> version bump. Each item has a recommendation of <strong>FIX</strong> or <strong>IGNORE</strong> with documented rationale. Generated 2026-08-08 19:57 UTC (post PR #59 / v2.30.1).</p>
<div class="legend">
<span style="background:#e5f6ec;color:#0b6b3a">IGNORE = accept / already VEX’d / out of product scope</span>
<span style="background:#fde8e8;color:#9b1c1c">FIX = code or process change required</span>
</div>
</header>
<main>

<article>
<div class="rec" style="background:#e5f6ec;color:#0b6b3a">IGNORE</div>
<h3>Unsafe pickle deserialization in DiskCache</h3>
<p class="meta"><strong>ID:</strong> CVE-2025-69872 / GHSA-w8v5-vhqr-4h9v / PYSEC-2026-2447<br/>
<strong>Component:</strong> diskcache 5.6.3 (transitive via dspy)</p>
<h4>Why a code / process change (not pyproject alone)</h4>
<p>No patched PyPI release exists (latest still 5.6.3 as of 2026-08-08 19:57 UTC). A pyproject.toml bump cannot remediate. Mitigation would require application changes (disable DSPy disk cache, relocate/harden cache dir permissions, or wait for upstream non-pickle default).</p>
<h4>Rationale</h4>
<p>Already documented in security/vex/fastworkflow.openvex.json as not_affected with justification vulnerable_code_cannot_be_controlled_by_adversary. Exploitation requires write access to the process-local DSPy cache directory; remote API/MCP clients cannot write that path. An adversary who can write as the service user already has equivalent privilege to pickle RCE. Re-evaluate if cache directory is shared across trust boundaries or world-writable. When upstream ships a fix, add a floor constraint in pyproject.toml.</p>
</article>
<article>
<div class="rec" style="background:#e5f6ec;color:#0b6b3a">IGNORE</div>
<h3>6 Critical / 18 High findings on proxy scan image</h3>
<p class="meta"><strong>ID:</strong> Proxy base image OS CVEs (Trivy on python:3.12-slim-bookworm)<br/>
<strong>Component:</strong> Debian bookworm packages in python:3.12-slim-bookworm (not shipped by this repo)</p>
<h4>Why a code / process change (not pyproject alone)</h4>
<p>This repository has no Dockerfile. Image CVEs are in distro packages (perl, libc, sqlite, etc.) and cannot be fixed via pyproject.toml. Remediation would mean publishing and maintaining a hardened runtime image, then refreshing base tags / applying distro patches.</p>
<h4>Rationale</h4>
<p>fastWorkflow is distributed as a PyPI package, not a container image. Proxy image scan was performed only to exercise Dockle/Dive/Trivy-image as required by the automation. Do not treat these OS CVEs as product vulnerabilities until a first-party image is published. If/when a Dockerfile is added, pin a maintained base and rebuild on distro security updates.</p>
</article>
<article>
<div class="rec" style="background:#e5f6ec;color:#0b6b3a">IGNORE</div>
<h3>Container runs as root; no HEALTHCHECK; content trust unset</h3>
<p class="meta"><strong>ID:</strong> Dockle CIS-DI-0001 (and related INFO findings)<br/>
<strong>Component:</strong> python:3.12-slim-bookworm proxy image</p>
<h4>Why a code / process change (not pyproject alone)</h4>
<p>Requires Dockerfile USER/HEALTHCHECK instructions and deployment content-trust policy — not addressable in pyproject.toml.</p>
<h4>Rationale</h4>
<p>Findings apply to the proxy base image used for scanner coverage, not a shipped fastWorkflow image. Track as image-hardening requirements when a first-party Dockerfile is introduced.</p>
</article>
<section style="background:#fff;border:1px solid #d8dee6;border-radius:12px;padding:1.2rem 1.4rem">
<h3>pyproject.toml easy-fix outcome</h3>
<p>No third-party package vulnerability in the locked graph had a fixed version available on PyPI. Therefore this PR does <em>not</em> change dependency pins for CVE remediation. Prior release work (v2.25–v2.30.1) already raised floors for litellm, python-multipart, starlette, cryptography, aiohttp, urllib3, requests, setuptools, and related packages.</p>
<p class="meta">Optional follow-ups (not done here): add <code>SNYK_TOKEN</code> / Docker Hub auth for Scout; publish a first-party runtime Dockerfile if container CVEs should become product backlog. Supersedes the scan snapshot in open PR #58 by re-running against post-#59 main (Dive succeeded in this environment).</p>
</section>
</main>
</body>
</html>
Loading