Skip to content

Commit b0110c7

Browse files
Drop invalid onion messages without disconnecting the peer
1 parent 2185b8b commit b0110c7

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

lightning/src/ln/peer_handler.rs

+51
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,10 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
10391039
self.enqueue_message(peer, &msgs::WarningMessage { channel_id: [0; 32], data: "Unreadable/bogus gossip message".to_owned() });
10401040
continue;
10411041
}
1042+
(_, Some(ty)) if is_onion_message(ty) => {
1043+
log_debug!(self.logger, "Got an invalid value while deserializing an onion message");
1044+
continue;
1045+
}
10421046
(msgs::DecodeError::UnknownRequiredFeature, ty) => {
10431047
log_gossip!(self.logger, "Received a message with an unknown required feature flag or TLV, you may want to update!");
10441048
self.enqueue_message(peer, &msgs::WarningMessage { channel_id: [0; 32], data: format!("Received an unknown required feature/TLV in message type {:?}", ty) });
@@ -1869,11 +1873,19 @@ fn is_gossip_msg(type_id: u16) -> bool {
18691873
}
18701874
}
18711875

1876+
fn is_onion_message(type_id: u16) -> bool {
1877+
match type_id {
1878+
msgs::OnionMessage::TYPE => true,
1879+
_ => false
1880+
}
1881+
}
1882+
18721883
#[cfg(test)]
18731884
mod tests {
18741885
use ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler, filter_addresses};
18751886
use ln::{msgs, wire};
18761887
use ln::msgs::NetAddress;
1888+
use onion_message;
18771889
use util::events;
18781890
use util::test_utils;
18791891

@@ -2014,6 +2026,45 @@ mod tests {
20142026
assert_eq!(peers[1].read_event(&mut fd_b, &a_data).unwrap(), false);
20152027
}
20162028

2029+
#[test]
2030+
fn test_invalid_onion_message() {
2031+
// Check that we will drop invalid onion messages without disconnecting the peer.
2032+
let cfgs = create_peermgr_cfgs(2);
2033+
let a_chan_handler = test_utils::TestChannelMessageHandler::new();
2034+
let b_chan_handler = test_utils::TestChannelMessageHandler::new();
2035+
let mut peers = create_network(2, &cfgs);
2036+
let (fd_a, mut fd_b) = establish_connection(&peers[0], &peers[1]);
2037+
assert_eq!(peers[0].peers.read().unwrap().len(), 1);
2038+
2039+
let secp_ctx = Secp256k1::new();
2040+
let their_id = PublicKey::from_secret_key(&secp_ctx, &peers[1].our_node_secret);
2041+
2042+
let invalid_onion_msg = msgs::OnionMessage {
2043+
blinding_point: PublicKey::from_secret_key(&secp_ctx, &peers[1].our_node_secret),
2044+
len: 42,
2045+
onion_routing_packet: onion_message::Packet {
2046+
version: 0,
2047+
public_key: PublicKey::from_secret_key(&secp_ctx, &peers[1].our_node_secret),
2048+
hop_data: Vec::new(),
2049+
hmac: [0; 32],
2050+
},
2051+
};
2052+
a_chan_handler.pending_events.lock().unwrap().push(events::MessageSendEvent::SendOnionMessage {
2053+
node_id: their_id, msg: invalid_onion_msg.clone()
2054+
});
2055+
peers[0].message_handler.chan_handler = &a_chan_handler;
2056+
peers[1].message_handler.chan_handler = &b_chan_handler;
2057+
peers[0].process_events();
2058+
2059+
let a_data = fd_a.outbound_data.lock().unwrap().split_off(0);
2060+
assert_eq!(peers[1].read_event(&mut fd_b, &a_data).unwrap(), false);
2061+
2062+
peers[1].logger.assert_log_contains(
2063+
"lightning::ln::peer_handler".to_string(),
2064+
"Got an invalid value while deserializing an onion message".to_string(), 1);
2065+
assert_eq!(peers[1].peers.read().unwrap().len(), 1);
2066+
}
2067+
20172068
#[test]
20182069
fn test_disconnect_all_peer() {
20192070
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and

0 commit comments

Comments
 (0)