Repository navigation
Bump @fastify/busboy from 3.2.0 to 3.2.4 [SECURITY] - #1129
Open
superbot-helper wants to merge 1 commit into
Open
superbot-helper wants to merge 1 commit into
superbot-helper wants to merge 1 commit into
Conversation
superbot-helper
requested review from
RitaChen609,
jonmille,
ngodugu-marklogic,
rjdew-progress and
rjrudin
as code owners
October 31, 2026 22:52
Contributor
There was a problem hiding this comment.
🟢 Approval recommended
No active review issues were identified for the @fastify/busboy 3.2.4 dependency update.
No open issues 🎉
What changed in this PR
Updates @fastify/busboy from 3.2.0 to 3.2.4 to address security advisories affecting the multipart parser used for MarkLogic HTTP responses.
Changes:
- Preserves exact dependency pinning while upgrading to 3.2.4.
- Synchronizes the lockfile’s root dependency, resolved package URL, and integrity hash with the new version.
| File | Description |
|---|---|
package.json |
Updates the exact @fastify/busboy pin to 3.2.4. |
package-lock.json |
Aligns the dependency specification and locked package metadata with 3.2.4. |
Review effort: Balanced
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
@fastify/busboy3.2.0 is pinned exactly inpackage.jsonand resolved to 3.2.0 inpackage-lock.json. Three published advisories cover that version. This pull request moves the pin and the one lock entry to 3.2.4.Two files change, because the dependency is pinned exactly:
package.json"@fastify/busboy": "3.2.0"becomes"3.2.4"(same exact-pin form, no range widening), and inpackage-lock.jsonthenode_modules/@fastify/busboyentry plus the lock's own root""dependency spec.git diff --statis 2 files, 5 insertions, 5 deletions; one lock entry moves (the root""key excluded by construction). A lock-only edit is not installable here:npm cirefuses it withEUSAGE: Invalid: lock file's @fastify/busboy@3.2.4 does not satisfy @fastify/busboy@3.2.0, so the manifest moves with it.The advisories
>= 3.1.0, < 3.2.1__proto__orconstructorresolves to an inherited non-array value and the parser throwsTypeError: this.header[h].push is not a function. Range>= 1.0.0, < 3.2.1Content-Dispositionfilename. Range< 3.2.2OSV returns three advisories for 3.2.0, one for 3.2.1, and none for 3.2.2, 3.2.3 and 3.2.4.
Where this parser sits in this library
This is a client library, so the multipart body it parses is an HTTP response from the MarkLogic REST server. The package is imported directly, not through
multipart-stream:lib/responder.js:7—const Dicer = require('@fastify/busboy/deps/dicer/lib/Dicer');— the only import of@fastify/busboyin the tree.lib/responder.js:48selects the multipart dispatcher when the responseContent-Typestarts withmultipart/mixed;:92buildsMultipartDispatcher;:617constructsnew Dicer({boundary});:626pipes the response into it. The same pattern repeats for the stream modes at:688and:878.lib/documents.js:619exposesdocuments.read();:703asks forAccept: multipart/mixedwhen more than one URI is read, andlib/requester.js:260-261hands the response toresponder.responseDispatcher.multipart-stream(lib/requester.js:8) only builds request bodies (:487,:500); its dependencies areinherits,is-streamandsandwich-stream, and it never loads busboy. The vulnerable parser is reached through the direct deep import of the vendored Dicer.What was measured
The library's own entry point (
lib/marklogic.js, the packagemain) was required by a child process and pointed at a local mock REST server that answersGET /v1/documentswith onemultipart/mixedbody.documents.read(['/doc1.json','/doc2.json']).result()was driven once per arm, one process per arm. Every response was HTTP 200; the rows differ in whether the client's parse resolves, rejects, or never returns.@fastify/busboyloads atrequiretime, before any request — theModule._loadhook and a positive/negative control are inevidence/gates/.__proto__: pollutedandconstructor: alsoTypeError: this.header[h].push is not a functionatdeps/dicer/lib/HeaderParser.js:95:20filename="a\rb\nc.json"(raw CR then LF)A, false delimiter prefix cut at its firstB: 20,625 bytes, 150 ms pause, 4,262 bytesA parser-only probe of the same bytes (Dicer, no HTTP) reproduces the two defects at the library level:
__proto__throws onwritein 0.75 ms on 3.2.0 and finishes in 1.18 ms on 3.2.4; the fragmented 252-byte boundary never returns on 3.2.0 (killed at 5,000 ms) and finishes in 152.24 ms on 3.2.4; the one-write variant finishes in 2.57 ms and 1.75 ms; the control and CRLF arms finish on both.The CRLF arm is the one where the client's outcome does not change: this path uses only
Content-Type, and Dicer's header event differs (3.2.0 yields acontent-dispositionvalue containing byte 13 then byte 10; 3.2.4 drops that malformed header line) without changing the resolved result. The 3.2.2 fix in busboy's own multipartContent-Dispositionhandling is not on this path, and this pull request does not claim an injection consequence here.Limits
documents.read()result promise..npmrcsetsmin-release-age=14and 3.2.4 was published 2026-10-22, 9 days before this patch, so the lock was regenerated with--min-release-age=0; a plainnpm install --package-lock-onlyrefuses withETARGET ... with a date before 10/17/2026.npm cidoes not resolve, and installs the locked 3.2.4 with exit 0. The.npmrcis unchanged.npm ciwas run on both trees: exit 0 on the base (busboy 3.2.0) and exit 0 on this patch (3.2.4), 433 packages each.The needle cannot have a length bigger than 256on every version, including 3.2.4; that constructor guard is not a defect and is not claimed.