[F-29] fix(network): reject oversized peer list responses in get_ipl()#142
Merged
adequatelimited merged 1 commit intoaudit-fixesfrom Apr 6, 2026
Merged
Conversation
Closes #107 A peer responding to OP_GET_IPL could send up to 65535 bytes of IP data (word16 len field). The consumer loop in scan_quorum() is bounded by netplistidx < 1024, but the excess data still causes unnecessary iteration. Added a check rejecting responses where len exceeds RPLISTLEN * sizeof(word32) — the maximum a legitimate node would ever send. Added TODO noting that received peer IPs should be treated as unverified candidates rather than trusted immediately.
Collaborator
Author
|
Audit wanted a response code check for OP_GET_IPL, but practically speaking we know what we're asking for, but on inspection the size of the response was not sanely bounded to the size of the expected RPLISTLEN, so we'll trap on that and return an error code if the replying node sends more peers than that. Merging. |
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.
Closes #107
Summary
A peer responding to
OP_GET_IPLcould include up to 65535 bytes of IP data in the response (theword16 lenfield maximum). While the consumer loop inscan_quorum()capsnetplistidxat 1024, the excess data causes unnecessary iteration — a remote DoS vector for wasting CPU during peer discovery.Change
Added a bounds check in
get_ipl()rejecting responses wherelen > RPLISTLEN * sizeof(word32)(256 bytes = 64 IPs) — the maximum a legitimate node would ever send viasend_ipl().The original audit also flagged missing opcode validation, but analysis showed this adds minimal value: the chain-state fields (
weight,cblockhash,cblock) are filled bysend_tx()on the responding side regardless of opcode, so a malicious peer could fabricate them in a legitimateOP_SEND_IPLresponse just as easily.Added a TODO noting that received peer IPs should be treated as unverified candidates until confirmed as real nodes, rather than added directly to scan/recent peer lists.
Testing
-Wall -Werror -Wextra -Wpedantic