Skip to content

Commit 5894451

Browse files
committed
Reject channel_update messages with timestamps too old or new
Because we time out channel info that is older than two weeks now, we should also reject new channel info that is older than two weeks, in addition to rejecting future channel info.
1 parent 4e7d5d7 commit 5894451

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

lightning/src/routing/network_graph.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,13 +1127,19 @@ impl NetworkGraph {
11271127
/// You probably don't want to call this directly, instead relying on a NetGraphMsgHandler's
11281128
/// RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
11291129
/// routing messages from a source using a protocol other than the lightning P2P protocol.
1130+
///
1131+
/// If built with `no-std`, any updates with a timestamp more than two weeks in the past or
1132+
/// materially in the future will be rejected.
11301133
pub fn update_channel<T: secp256k1::Verification>(&self, msg: &msgs::ChannelUpdate, secp_ctx: &Secp256k1<T>) -> Result<(), LightningError> {
11311134
self.update_channel_intern(&msg.contents, Some(&msg), Some((&msg.signature, secp_ctx)))
11321135
}
11331136

11341137
/// For an already known (from announcement) channel, update info about one of the directions
11351138
/// of the channel without verifying the associated signatures. Because we aren't given the
11361139
/// associated signatures here we cannot relay the channel update to any of our peers.
1140+
///
1141+
/// If built with `no-std`, any updates with a timestamp more than two weeks in the past or
1142+
/// materially in the future will be rejected.
11371143
pub fn update_channel_unsigned(&self, msg: &msgs::UnsignedChannelUpdate) -> Result<(), LightningError> {
11381144
self.update_channel_intern(msg, None, None::<(&secp256k1::Signature, &Secp256k1<secp256k1::VerifyOnly>)>)
11391145
}
@@ -1143,6 +1149,19 @@ impl NetworkGraph {
11431149
let chan_enabled = msg.flags & (1 << 1) != (1 << 1);
11441150
let chan_was_enabled;
11451151

1152+
#[cfg(all(feature = "std", not(test), not(feature = "_test_utils")))]
1153+
{
1154+
// Note that many tests rely on being able to set arbitrarily old timestamps, thus we
1155+
// disable this check during tests!
1156+
let time = SystemTime::now().duration_since(UNIX_EPOCH).expect("Time must be > 1970").as_secs();
1157+
if (msg.timestamp as u64) < time - STALE_CHANNEL_UPDATE_AGE_LIMIT_SECS {
1158+
return Err(LightningError{err: "channel_update is older than two weeks old".to_owned(), action: ErrorAction::IgnoreError});
1159+
}
1160+
if msg.timestamp as u64 > time + 60 * 60 * 24 {
1161+
return Err(LightningError{err: "channel_update is older than two weeks old".to_owned(), action: ErrorAction::IgnoreError});
1162+
}
1163+
}
1164+
11461165
let mut channels = self.channels.write().unwrap();
11471166
match channels.get_mut(&msg.short_channel_id) {
11481167
None => return Err(LightningError{err: "Couldn't find channel for update".to_owned(), action: ErrorAction::IgnoreError}),

0 commit comments

Comments
 (0)