Follow-up from #6.
This is not a claim that a vulnerability exists. It is an investigation with a
measurement step before any design step.
Scope
FilePass budgets PNG metadata decompression directly: one DecompressionBudget per file,
16 MiB total, enforced in src/core/png.ts. PDF parsing has no equivalent. pdf.ts and
verify-pdf.ts contain no decompression call of their own — the work happens inside
pdf-lib and pdfjs-dist, outside FilePass's own resource accounting. Whether that is
reachable, bounded by the libraries themselves, or a real gap is unknown.
Known bound today: the 50 MB input ceiling in sniff.ts. That caps the compressed input,
not what it expands to.
Done when
- the PDF decompression paths FilePass actually reaches are mapped — inspection, cleaning,
the independent pdfjs-dist check, and the raw-byte backstop each count separately;
- existing library and browser limits are identified rather than assumed absent;
- adversarial cases are constructed only for reachable paths;
- the cost is measured before any architecture is proposed;
- the outcome is classified as one of: no issue / bounded risk / real gap;
- if a real gap turns out to be broader than a surgical fix, stop and scope a separate
design instead of expanding this one.
Explicitly out of scope
- crawler-style fuzzing dumps;
- replacing
pdf-lib or pdfjs-dist merely because they are dependencies;
- generalising the PNG budget into a global resource framework before evidence justifies it.
Severity
P2 investigation initially. Re-classify on findings.
🤖 Generated with Claude Code
Follow-up from #6.
This is not a claim that a vulnerability exists. It is an investigation with a
measurement step before any design step.
Scope
FilePass budgets PNG metadata decompression directly: one
DecompressionBudgetper file,16 MiB total, enforced in
src/core/png.ts. PDF parsing has no equivalent.pdf.tsandverify-pdf.tscontain no decompression call of their own — the work happens insidepdf-libandpdfjs-dist, outside FilePass's own resource accounting. Whether that isreachable, bounded by the libraries themselves, or a real gap is unknown.
Known bound today: the 50 MB input ceiling in
sniff.ts. That caps the compressed input,not what it expands to.
Done when
the independent
pdfjs-distcheck, and the raw-byte backstop each count separately;design instead of expanding this one.
Explicitly out of scope
pdf-liborpdfjs-distmerely because they are dependencies;Severity
P2 investigation initially. Re-classify on findings.
🤖 Generated with Claude Code