Skip to content

[F-29] fix(network): reject oversized peer list responses in get_ipl()#142

Merged
adequatelimited merged 1 commit intoaudit-fixesfrom
audit/F-29-get-ipl-validation
Apr 6, 2026
Merged

[F-29] fix(network): reject oversized peer list responses in get_ipl()#142
adequatelimited merged 1 commit intoaudit-fixesfrom
audit/F-29-get-ipl-validation

Conversation

@adequatelimited
Copy link
Copy Markdown
Collaborator

Closes #107

Summary

A peer responding to OP_GET_IPL could include up to 65535 bytes of IP data in the response (the word16 len field maximum). While the consumer loop in scan_quorum() caps netplistidx at 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 where len > RPLISTLEN * sizeof(word32) (256 bytes = 64 IPs) — the maximum a legitimate node would ever send via send_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 by send_tx() on the responding side regardless of opcode, so a malicious peer could fabricate them in a legitimate OP_SEND_IPL response 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

  • Clean build with -Wall -Werror -Wextra -Wpedantic

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.
@adequatelimited
Copy link
Copy Markdown
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.

@adequatelimited adequatelimited merged commit 2d4299b into audit-fixes Apr 6, 2026
4 of 5 checks passed
@adequatelimited adequatelimited deleted the audit/F-29-get-ipl-validation branch April 13, 2026 03:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant