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
10 changes: 10 additions & 0 deletions security/reports/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Security scan reports

Generated 2026-08-08 18:58 UTC on branch `cursor/cve-report-and-remediation-6925`.

| Report | Description |
|--------|-------------|
| [cve-report.html](cve-report.html) | Multi-scanner CVE summary (Trivy, Grype, Syft, Snyk, Scout, Dockle, Dive, osv-scanner) |
| [human-review.html](human-review.html) | Findings needing code/process changes with FIX or IGNORE recommendations |

Machine-readable scanner outputs remain local/gitignored under `security-reports/` (see makefile `security-scan` targets). Accepted Python finding: `diskcache` CVE-2025-69872 via [`../vex/fastworkflow.openvex.json`](../vex/fastworkflow.openvex.json).
75 changes: 75 additions & 0 deletions security/reports/cve-report.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>fastWorkflow CVE Report — 2026-08-08 18:58 UTC</title>
<style>
Comment on lines +4 to +6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Add a viewport meta tag for better mobile and small-screen rendering.

The page currently lacks a <meta name="viewport">, so it will appear zoomed out with small text on mobile. Please add a tag like:

<meta name="viewport" content="width=device-width, initial-scale=1" />

to improve readability on smaller screens.

Suggested implementation:

<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>fastWorkflow CVE Report — 2026-08-08 18:58 UTC</title>

None needed beyond this insertion; the existing CSS will automatically adapt better on small screens once the viewport is correctly set.

:root { --bg:#f6f7f9; --card:#fff; --ink:#1a1d23; --muted:#5c6570; --line:#d8dee6; --ok:#0b6b3a; --skip:#8a6d00; --fail:#9b1c1c; --med:#9a5b00; }
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 18:58 UTC against branch <code>cursor/cve-report-and-remediation-6925</code> (post PR #57 / v2.30.0). 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. 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 (CycloneDX/SPDX/JSON)</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 → No vulnerabilities found</td></tr><tr><td>osv-scanner</td><td><span class='badge ok'>OK</span></td><td>poetry.lock: 1 MEDIUM (diskcache / CVE-2025-69872); no fixed version</td></tr><tr><td>pip-audit</td><td><span class='badge ok'>OK</span></td><td>venv audit: 1 known vulnerability (diskcache); requirements.txt install-audit blocked by platform markers</td></tr><tr><td>Snyk</td><td><span class='badge skipped'>SKIPPED</span></td><td>SNYK_TOKEN not configured</td></tr><tr><td>Docker Scout</td><td><span class='badge skipped'>SKIPPED</span></td><td>Docker Hub login required for scout CLI</td></tr><tr><td>Dockle</td><td><span class='badge ok'>OK (proxy image)</span></td><td>Scanned python:3.12-slim-bookworm (no first-party Dockerfile); CIS warnings only</td></tr><tr><td>Dive</td><td><span class='badge failed'>FAILED (env)</span></td><td>Layer fetch failed in nested containerd; not a project defect</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.</p>
<p class="note">Severity totals — Critical: 6, High: 18, Medium: 70, Low: 97</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 JSON, status notes for Snyk/Scout/Dive). 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 18:58 UTC</title>
<style>
Comment on lines +4 to +6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Mirror the viewport meta tag here to keep the human-review report mobile-friendly as well.

Without a viewport meta tag, this page will render poorly on phones and narrow viewports. Please add the same standard viewport meta line used in the CVE report to improve readability and keep the reports consistent.

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; }
.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 18:58 UTC.</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). 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/Grype 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/Grype-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) 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.</p>
</section>
</main>
</body>
</html>
Loading