Repository navigation
fix(nbt): cap skim recursion depth to reject hostile region files - #1
Merged
Merged
Conversation
A region file can nest NBT tags deeply enough to overflow the stack while the map skims block-state names, which aborts the whole process. The region decoder runs on untrusted input from map ingest, so the crash is remotely reachable. Bound the skim to a fixed recursion depth and treat anything deeper as corrupt.
dekrom
approved these changes
Aug 28, 2026
dekrom
left a comment
Owner
There was a problem hiding this comment.
Verified the crash reproduces on main (deeply-nested NBT in an ingested region overflows the stack and aborts the process) and that this cap rejects it cleanly. The skim is the only recursive path in the codec and both entry points are bounded. Thanks for catching this.
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.
A crafted region can nest NBT tags deeply enough to overflow the stack while the map skims block-state names, which aborts the process. The decoder runs on untrusted ingest input, so the crash is remotely reachable. The skim is now bounded to a fixed recursion depth and anything deeper is treated as corrupt.