Skip to content

Commit 00e556a

Browse files
MarcoFalkePastaPastaPasta
MarcoFalke
authored andcommitted
Merge bitcoin#21872: net: Sanitize message type for logging
09205b3 net: Clarify message header validation errors (W. J. van der Laan) 955eee7 net: Sanitize message type for logging (W. J. van der Laan) Pull request description: - Use `SanitizeString` when logging message errors to make sure that the message type is sanitized. I have checked all logging in `net.cpp`. - For the `MESSAGESTART` error don't inspect and log header details at all: receiving invalid start bytes makes it likely that the packet isn't even formatted as valid P2P message. Logging the four unexpected start bytes (as hex) should be enough. - Update `p2p_invalid_messages.py` test to check this. - Improve error messages in a second commit. Issue reported by gmaxwell. ACKs for top commit: MarcoFalke: re-ACK 09205b3 only change is log message fixup 🔂 practicalswift: re-ACK 09205b3 Tree-SHA512: 8fe5326af135cfcf39ea953d9074a8c966b9b85a810b06a2c45b8a745cf115de4f321e72fc769709d6bbecfc5953aab83176db6735b04c0bc6796f59272cadce
1 parent be9781d commit 00e556a

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

src/net.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -752,19 +752,19 @@ int V1TransportDeserializer::readHeader(Span<const uint8_t> msg_bytes)
752752
hdrbuf >> hdr;
753753
}
754754
catch (const std::exception&) {
755-
LogPrint(BCLog::NET, "HEADER ERROR - UNABLE TO DESERIALIZE, peer=%d\n", m_node_id);
755+
LogPrint(BCLog::NET, "Header error: Unable to deserialize, peer=%d\n", m_node_id);
756756
return -1;
757757
}
758758

759759
// Check start string, network magic
760760
if (memcmp(hdr.pchMessageStart, m_chain_params.MessageStart(), CMessageHeader::MESSAGE_START_SIZE) != 0) {
761-
LogPrint(BCLog::NET, "HEADER ERROR - MESSAGESTART (%s, %u bytes), received %s, peer=%d\n", hdr.GetCommand(), hdr.nMessageSize, HexStr(hdr.pchMessageStart), m_node_id);
761+
LogPrint(BCLog::NET, "Header error: Wrong MessageStart %s received, peer=%d\n", HexStr(hdr.pchMessageStart), m_node_id);
762762
return -1;
763763
}
764764

765765
// reject messages larger than MAX_SIZE or MAX_PROTOCOL_MESSAGE_LENGTH
766766
if (hdr.nMessageSize > MAX_SIZE || hdr.nMessageSize > MAX_PROTOCOL_MESSAGE_LENGTH) {
767-
LogPrint(BCLog::NET, "HEADER ERROR - SIZE (%s, %u bytes), peer=%d\n", hdr.GetCommand(), hdr.nMessageSize, m_node_id);
767+
LogPrint(BCLog::NET, "Header error: Size too large (%s, %u bytes), peer=%d\n", SanitizeString(hdr.GetCommand()), hdr.nMessageSize, m_node_id);
768768
return -1;
769769
}
770770

@@ -817,16 +817,16 @@ std::optional<CNetMessage> V1TransportDeserializer::GetMessage(const std::chrono
817817

818818
// Check checksum and header command string
819819
if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0) {
820-
LogPrint(BCLog::NET, "CHECKSUM ERROR (%s, %u bytes), expected %s was %s, peer=%d\n",
820+
LogPrint(BCLog::NET, "Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n",
821821
SanitizeString(msg->m_command), msg->m_message_size,
822822
HexStr(Span{hash}.first(CMessageHeader::CHECKSUM_SIZE)),
823823
HexStr(hdr.pchChecksum),
824824
m_node_id);
825825
out_err_raw_size = msg->m_raw_message_size;
826826
msg.reset();
827827
} else if (!hdr.IsCommandValid()) {
828-
LogPrint(BCLog::NET, "HEADER ERROR - COMMAND (%s, %u bytes), peer=%d\n",
829-
hdr.GetCommand(), msg->m_message_size, m_node_id);
828+
LogPrint(BCLog::NET, "Header error: Invalid message type (%s, %u bytes), peer=%d\n",
829+
SanitizeString(hdr.GetCommand()), msg->m_message_size, m_node_id);
830830
out_err_raw_size = msg->m_raw_message_size;
831831
msg.reset();
832832
}

test/functional/p2p_invalid_messages.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
class msg_unrecognized:
3131
"""Nonsensical message. Modeled after similar types in test_framework.messages."""
3232

33-
msgtype = b'badmsg'
33+
msgtype = b'badmsg\x01'
3434

3535
def __init__(self, *, str_data):
3636
self.str_data = str_data.encode() if not isinstance(str_data, bytes) else str_data
@@ -81,7 +81,7 @@ def test_buffer(self):
8181
def test_magic_bytes(self):
8282
self.log.info("Test message with invalid magic bytes disconnects peer")
8383
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
84-
with self.nodes[0].assert_debug_log(['HEADER ERROR - MESSAGESTART (badmsg, 2 bytes), received ffffffff']):
84+
with self.nodes[0].assert_debug_log(['Header error: Wrong MessageStart ffffffff received']):
8585
msg = conn.build_message(msg_unrecognized(str_data="d"))
8686
# modify magic bytes
8787
msg = b'\xff' * 4 + msg[4:]
@@ -92,7 +92,7 @@ def test_magic_bytes(self):
9292
def test_checksum(self):
9393
self.log.info("Test message with invalid checksum logs an error")
9494
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
95-
with self.nodes[0].assert_debug_log(['CHECKSUM ERROR (badmsg, 2 bytes), expected 78df0a04 was ffffffff']):
95+
with self.nodes[0].assert_debug_log(['Header error: Wrong checksum (badmsg, 2 bytes), expected 78df0a04 was ffffffff']):
9696
msg = conn.build_message(msg_unrecognized(str_data="d"))
9797
# Checksum is after start bytes (4B), message type (12B), len (4B)
9898
cut_len = 4 + 12 + 4
@@ -117,7 +117,7 @@ def test_size(self):
117117
def test_msgtype(self):
118118
self.log.info("Test message with invalid message type logs an error")
119119
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
120-
with self.nodes[0].assert_debug_log(['HEADER ERROR - COMMAND']):
120+
with self.nodes[0].assert_debug_log(['Header error: Invalid message type']):
121121
msg = msg_unrecognized(str_data="d")
122122
msg = conn.build_message(msg)
123123
# Modify msgtype

0 commit comments

Comments
 (0)