Skip to content
Draft
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`.
87 changes: 87 additions & 0 deletions security/reports/cve-report.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>fastWorkflow CVE Report — 2026-08-09 00:03 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-09 00:03 UTC against branch <code>cursor/cve-report-and-remediation-f918</code> (post PR #61 / v2.31.0 — sqlite3 / Python 3.13+). 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 rows (not product)</div>
</div>
<p class="note" style="margin-top:1rem">Easy third-party package bumps: <strong>none</strong>. Full OSV sweep of 141 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.). v2.31.0 dependency graph change (speedict→sqlite3 stdlib) introduced no new PyPI advisories.</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>PyPI advisory service reports clean (OSV/GHSA still flag diskcache; service lag). Corroborates no other PyPI vulns.</td></tr>
<tr><td>Snyk</td><td><span class='badge skipped'>SKIPPED</span></td><td>SNYK_TOKEN not configured (CLI v1.1306.3 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.13-slim-bookworm — CIS-DI-0001 (WARN), CIS-DI-0005 (INFO), CIS-DI-0006 (INFO), CIS-DI-0008 (INFO); no first-party Dockerfile</td></tr>
<tr><td>Dive</td><td><span class='badge ok'>OK (proxy image)</span></td><td>python:3.13-slim-bookworm efficiency≈96.8651%; 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</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.13-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. Image tag updated to Python 3.13 to match the v2.31.0 runtime floor.</p>
<p class="note">Severity totals — Critical: 6 rows / 6 unique CVEs; High: 18 rows / 8 unique CVEs</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-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</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-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 (gitignored): <code>security-reports/</code> — syft/grype/trivy/osv-scanner/dockle/dive JSON+text. Tracked OpenVEX: <code>security/vex/fastworkflow.openvex.json</code>. Human-review HTML: <code>security/reports/human-review.html</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-09 00:03 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-09 00:03 UTC (post PR #61 / v2.31.0).</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-09 00:03 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 / 8 High unique CVEs on proxy scan image</h3>
<p class="meta"><strong>ID:</strong> Proxy base image OS CVEs (Trivy on python:3.13-slim-bookworm)<br/>
<strong>Component:</strong> Debian bookworm packages in python:3.13-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. Note: proxy image was updated from 3.12 to 3.13-slim-bookworm to align with the Python 3.13+ requirement from PR #61.</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.13-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 (through v2.31.0) already raised floors for litellm, python-multipart, starlette, cryptography, aiohttp, urllib3, requests, setuptools, and related packages. The PR #61 speedict→sqlite3 migration removed a third-party dependency and did not introduce new PyPI advisories.</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. Refresh after merge of PR #61 (v2.31.0).</p>
</section>
</main>
</body>
</html>
6 changes: 3 additions & 3 deletions security/vex/fastworkflow.openvex.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
"@id": "https://github.com/radiantlogicinc/fastworkflow/security/vex/fastworkflow.openvex.json",
"author": "fastworkflow maintainers <drawal@radiantlogic.com>",
"role": "document creator",
"timestamp": "2026-08-08T14:55:09Z",
"version": 2,
"timestamp": "2026-08-09T00:03:00Z",
"version": 3,
"statements": [
{
"vulnerability": {
Expand All @@ -19,7 +19,7 @@
"status": "not_affected",
"justification": "vulnerable_code_cannot_be_controlled_by_adversary",
"impact_statement": "Alias CVE-2025-69872. fastWorkflow uses diskcache only as DSPy's on-disk LM response cache (via dspy.configure_cache). Exploitation requires an attacker to write attacker-controlled pickle bytes into the process-local DSPy cache directory (default under the service account home, e.g. ~/.dspy_cache) and then have the process deserialize them. Remote API/MCP clients cannot write that directory. An adversary who can already write arbitrary files as the service user has equivalent or greater privilege than pickle RCE would grant. There is no patched diskcache release on PyPI as of this VEX; the finding remains accepted under this justification.",
"status_notes": "Code review 2026-08-08 (Dependabot alert #48). diskcache is transitive via dspy; not imported directly by fastworkflow. Cache path is not a multi-tenant shared volume in supported deployments. Re-evaluate if a deployment mounts the DSPy disk cache directory as world-writable or shares it across trust boundaries. Dual-stated as CVE-2025-69872 below for scanners that key on CVE IDs."
"status_notes": "Code review 2026-08-08 (Dependabot alert #48); re-verified 2026-08-09 after PR #61 / v2.31.0 (OSV/Trivy/Grype still report diskcache 5.6.3 with no PyPI fix). diskcache is transitive via dspy; not imported directly by fastworkflow. Cache path is not a multi-tenant shared volume in supported deployments. Re-evaluate if a deployment mounts the DSPy disk cache directory as world-writable or shares it across trust boundaries. Dual-stated as CVE-2025-69872 below for scanners that key on CVE IDs."
},
{
"vulnerability": {
Expand Down
Loading