From 3d6a40a6831fbc2ce9309b8ea0c0fbcea55acdb2 Mon Sep 17 00:00:00 2001 From: jrandom <jrandom> Date: Wed, 18 Aug 2004 07:23:01 +0000 Subject: [PATCH] don't do the netDb store of the peer's routerInfo until after we validate what they tell us (so we can shitlist them for the right reason) [thanks duck!] --- .../transport/tcp/RestrictiveTCPConnection.java | 16 ++++++++++++++-- .../i2p/router/transport/tcp/TCPConnection.java | 11 ++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java b/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java index f263927ca8..91f3065419 100644 --- a/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java @@ -260,9 +260,9 @@ class RestrictiveTCPConnection extends TCPConnection { boolean ok = identifyStationToStation(); if (_log.shouldLog(Log.DEBUG)) _log.debug("After station to station [" + ok + "]..."); - if (!ok) + if (!ok) { throw new DataFormatException("Station to station identification failed! MITM?"); - + } if (_log.shouldLog(Log.DEBUG)) _log.debug("before validateVersion..."); boolean versionOk = validateVersion(); @@ -284,6 +284,18 @@ class RestrictiveTCPConnection extends TCPConnection { throw new DataFormatException("Peer is too far out of sync with the current router's clock! dropping"); } + try { + _context.netDb().store(_remoteIdentity.getHash(), _remoteInfo); + } catch (IllegalArgumentException iae) { + if (_log.shouldLog(Log.ERROR)) + _log.error("Peer gave us invalid router info", iae); + // not only do we remove the reference to the invalid peer + _context.netDb().fail(_remoteIdentity.getHash()); + // but we make sure that we don't try to talk to them soon even if we get a new ref + _context.shitlist().shitlistRouter(_remoteIdentity.getHash(), "Invalid peer info"); + throw new DataFormatException("Invalid peer info provided"); + } + if (_log.shouldLog(Log.DEBUG)) _log.debug("before validate peer address..."); boolean peerReachable = validatePeerAddress(); if (_log.shouldLog(Log.DEBUG)) _log.debug("after validatePeerAddress [" + peerReachable + "]..."); diff --git a/router/java/src/net/i2p/router/transport/tcp/TCPConnection.java b/router/java/src/net/i2p/router/transport/tcp/TCPConnection.java index e67f2d9710..013108498a 100644 --- a/router/java/src/net/i2p/router/transport/tcp/TCPConnection.java +++ b/router/java/src/net/i2p/router/transport/tcp/TCPConnection.java @@ -59,6 +59,7 @@ class TCPConnection implements I2NPMessageReader.I2NPMessageEventListener { protected InputStream _in; protected OutputStream _out; protected RouterIdentity _remoteIdentity; + protected RouterInfo _remoteInfo; protected TCPTransport _transport; protected ConnectionRunner _runner; protected List _toBeSent; @@ -191,15 +192,7 @@ class TCPConnection implements I2NPMessageReader.I2NPMessageEventListener { byte signedData[] = new byte[decr.length - rsig.getData().length]; System.arraycopy(decr, 0, signedData, 0, signedData.length); boolean valid = _context.dsa().verifySignature(rsig, signedData, _remoteIdentity.getSigningPublicKey()); - if (valid) { - try { - _context.netDb().store(_remoteIdentity.getHash(), peer); - } catch (IllegalArgumentException iae) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Peer gave us invalid router info", iae); - valid = false; - } - } + _remoteInfo = peer; return valid; } -- GitLab