fix(deps): override fflate to 0.8.3, fixing a ZIP64-parsing DoS - #595
Conversation
β¦-px8p-9vwx-vf98) fflate through 0.8.2 hangs in an infinite loop inside unzipSync() when parsing a crafted ZIP archive whose central directory declares the ZIP64 compressed_size sentinel (0xFFFFFFFF) but omits the required ZIP64 extra field -- z64e() reads out of bounds, the result coerces to 0, and the loop condition never becomes false. CVSS 7.5, CVE-2026-45820. Transitive via jspdf (already pinned to the latest 4.2.1, which already declares "fflate": "^0.8.1" -- a range 0.8.3 already satisfies, so no jspdf bump was needed, just forcing pnpm's resolution to the patched version already within range). The advisory was only elevated to GitHub-reviewed status today (2026-09-03T14:58:12Z, confirmed via the GitHub Advisories API) -- it is not something any recent change in this repo introduced; main's own Security Audit job passed clean two hours before this run first caught it.
π€ CodeAnt AI β Review Status
|
Thanks for using CodeAnt! πWe're free for open-source projects. if you're enjoying it, help us grow by sharing. Share on X Β· |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Review limit reachedNext included review available in 1 minute. View limit detailsLimit details: Youβve used the included review currently available. Your 72 included PR review attempts over the past 7 days set your current allowance at 1 review per hour. Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. Review configuration: βοΈ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Essentials Run ID: β Files ignored due to path filters (1)
π Files selected for processing (2)
Comment |
Reviewer's guide (collapsed on small PRs)Reviewer's GuideThis security fix overrides pnpm's transitive fflate resolution to require >=0.8.3, ensuring jspdf uses the patched ZIP64 parser and preventing the unzipSync() infinite-loop DoS; the lockfile and workspace security documentation are updated accordingly. File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
PR Summary
|
|
|
Overall GradeΒ Β |
SecurityΒ Β ReliabilityΒ Β ComplexityΒ Β HygieneΒ Β |
Code Review Summary
| Analyzer | Status | Updated (UTC) | Details |
|---|---|---|---|
| Docker | Sep 3, 2026 4:17p.m. | ReviewΒ β | |
| Python | Sep 3, 2026 4:17p.m. | ReviewΒ β | |
| Rust | Sep 3, 2026 4:17p.m. | ReviewΒ β | |
| Shell | Sep 3, 2026 4:17p.m. | ReviewΒ β |
Important
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
There was a problem hiding this comment.
This PR successfully migrates the project to a pnpm workspace structure. The changes to the lock file and workspace configuration are consistent with this migration, with no blocking issues identified.
The pnpm-lock.yaml has been properly regenerated with lockfileVersion 9.1, and all dependencies maintain their integrity hashes. The workspace configuration in pnpm-workspace.yaml correctly defines the package structure.
You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.
π CodeAnt Quality Gate ResultsCommit: β Overall Status: PASSEDQuality Gate Details
|
There was a problem hiding this comment.
All reported issues were addressed across 2 files
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
Codecov Reportβ All modified and coverable lines are covered by tests. π’ Thoughts on this report? Let us know! |
There was a problem hiding this comment.
2 issues found across 1 file (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid β if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="AUDIT.md">
<violation number="1" location="AUDIT.md:1855">
P3: Because the override accepts every version at or above `0.8.3`, saying βfixed 0.8.3β leaves the safe range ambiguous. Change this to βfixed at or above 0.8.3β to match the documented floor.</violation>
<violation number="2" location="AUDIT.md:1855">
P3: The table preamble now omits `fflate` from its re-verification-date exceptions even though this row records a 2026-09-03 advisory update. Add `fflate` and its 2026-09-03 verification date to that exception list, or update the tableβs verification metadata so the audit record remains accurate.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
β¦e the fixed-version wording
There was a problem hiding this comment.
No application code in the PR β skipped Code Health checks.
See analysis details in CodeScene
Quality Gate Profile: The Bare Minimum
Install CodeScene MCP: safeguard and uplift AI-generated code. Catch issues early with our IDE extension and CLI tool.
* chore(release): bump version to v1.28.4 Patch release reconciling release-truth documentation with everything merged to main since v1.28.3 (62 commits / ~40 PRs, audited against live GitHub state, not assumed from commit subjects): - fix: PWA first-install unprompted reload (#585, PR #613) - fix: shared-origin service-worker cache-read isolation (#514, PR #612) - fix: Factory Reset could reboot into Settings instead of Welcome Portal (PR #592) - fix: preserve-first desktop corruption recovery (PR #542) and a distinct filesystem-I/O recovery action (PR #545) - fix: intentionally cleared project metadata no longer reappears (PR #546) - a11y: Welcome/Home dashboard WCAG AA contrast + reduced-motion cascade fix + default appearance preset change (#565, PR #609); ManuscriptEditor contrast (PR #560) - security: fflate ZIP64-parsing DoS override (PR #595); routine dependency floor bumps (PR #587, #561, #562, #594) - docs: R-15 secure desktop storage design contract admitted (PRs #564, #580, #581, #582, #584) β design only, no implementation yet - tests: visual regression testing repaired β baselines were directory listings, not the application (PR #610); IDB reset-quiescence hardening (PR #596); WelcomePortal E2E navigation made locale-independent (PR #590) Everything classified as pure internal/CI-governance churn (PR-size exception plumbing, dual-graph tooling, toolchain pins) is omitted from CHANGELOG.md as non-user-facing. Version bumped via the existing sync scripts (sync-tauri-version.mjs, sync-sw-version.mjs) across package.json, src-tauri/Cargo.toml, src-tauri/tauri.conf.json, src-tauri/Cargo.lock, AGENTS.md, and public/sw.js's APP_VERSION. CHANGELOG.md and README.md use the established release-candidate marker convention (<!-- release-candidate: v1.28.4 -->) so the dated entry and version badge are truthful before the v1.28.4 tag exists; both markers are removed in a follow-up post-release truth-sync once the tag and GitHub Release are published, matching the v1.28.2/v1.28.3 precedent. TODO.md's Current Sprint section was archived (its final "release cut remains open" bullet is now resolved β v1.28.2 and v1.28.3 both shipped) and replaced with the actual current sprint: this release cut followed by the R-15 desktop at-rest encryption priority program. AUDIT.md is intentionally not touched here β its release-gate entry requires real post-merge CI/CodeQL run evidence that doesn't exist until after this PR merges and the tag is cut, matching how every prior release's AUDIT.md entry was written (a follow-up commit, not part of the release-prep PR itself). * docs(release): correct premature done-marker on the v1.28.4 TODO item TODO.md's Current Sprint marked the release cut as done (checked 'v1.28.4' release cut, reconciling ... AUDIT.md truth ...) while this same PR's own Non-goals section correctly states AUDIT.md is not touched here, and while no tag, GitHub Release, or release artifacts exist yet. Corrected to in-progress language naming PR #615 directly and listing what actually remains pending (tag, release, artifacts, post-release AUDIT.md evidence). * docs(release): correct R-15 gate language and credit PR #596's real fix Two corrections from review, verified against live evidence before fixing: 1. TODO.md's Current Sprint claimed R-15 desktop at-rest encryption implementation was being prioritized now. docs/native/DESKTOP- MIGRATION-ROADMAP-REV3.md explicitly forbids pulling Wave 3/4 R-15 implementation ahead of unresolved Wave 2 authority prerequisites, and CORE-MIGRATION-LEDGER.md row 10 records S5_IMPLEMENTATION_READY=NO. Corrected to state R-15 design is complete but implementation stays gated behind the still-open Wave 2 prerequisite (ledger row 9: the project state-shape compatibility adapter), which is what this sprint's desktop-storage work actually is. 2. CHANGELOG.md listed PR #596 only as generic IDB test hardening under Tests. Verified against its actual diff: deleteDatabase() previously resolved on a genuine onerror or an onblocked event as if deletion succeeded, so wipeAllAppData() could report Factory Reset complete while a database was never actually deleted. onerror now rejects; onblocked waits for the connection to close before giving up. This is a real production data-integrity fix, not test hardening, and now has its own Fixed entry.
Summary
fflatethrough 0.8.2 hangs in an infinite loop insideunzipSync()when parsing a crafted ZIP archive whose central directory declares the ZIP64compressed_sizesentinel (0xFFFFFFFF) but omits the required ZIP64 extra field βz64e()reads out of bounds, the result coerces to0, and the loop condition never becomes false. CVSS 6.6 (GitHub Reviewed, CVSS v4; the same advisory's older CVSS v3.1 vector scores 7.5 β GitHub's live "Moderate" severity classification uses the v4 score as canonical), GHSA-px8p-9vwx-vf98 / CVE-2026-45820.Transitive via
jspdf(already pinned to the latest4.2.1, which already declares"fflate": "^0.8.1"β a range0.8.3already satisfies, so nojspdfbump was needed, just forcing pnpm's resolution to the patched version already within range viapnpm.overrides).Not caused by any recent change here β the advisory was only elevated to GitHub-reviewed status today (
2026-09-03T14:58:12Z, confirmed via the GitHub Advisories API). Main's own Security Audit job passed clean two hours before this run first caught it; it started blocking every PR (including an unrelated governance-config PR, #586) the moment the advisory went live.Test plan
pnpm why fflateβ resolves to0.8.3pnpm audit --audit-level=highβ the fflate finding is gone; only the pre-existing, already-documentedextract-zipadvisory (no fix available, transitive Playwright browser download, no runtime footprint) remainspnpm run lint/pnpm run ci:prepushβ cleanSummary by Sourcery
Pin the transitive fflate dependency to a patched version to prevent denial-of-service attacks from malformed ZIP64 archives.
Bug Fixes:
Enhancements:
Documentation:
Chores: