Call CAddrMan::Good() on block-relay-only peer addresses

Being able to invoke Good() is important for address management (new vs tried
table, tried table eviction via test-before-evict). We mitigate potential
information leaks by not calling Connected() on these peer addresses.
pull/764/head
Suhas Daftuar 4 years ago
parent daf5553126
commit 4fe338ab3e

@ -2407,14 +2407,8 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
// empty and no one will know who we are, so these mechanisms are // empty and no one will know who we are, so these mechanisms are
// important to help us connect to the network. // important to help us connect to the network.
// //
// We also update the addrman to record connection success for // We skip this for BLOCK_RELAY peers to avoid potentially leaking
// these peers (which include OUTBOUND_FULL_RELAY and FEELER // information about our BLOCK_RELAY connections via address relay.
// connections) so that addrman will have an up-to-date notion of
// which peers are online and available.
//
// We skip these operations for BLOCK_RELAY peers to avoid
// potentially leaking information about our BLOCK_RELAY
// connections via the addrman or address relay.
if (fListen && !::ChainstateActive().IsInitialBlockDownload()) if (fListen && !::ChainstateActive().IsInitialBlockDownload())
{ {
CAddress addr = GetLocalAddress(&pfrom.addr, pfrom.GetLocalServices()); CAddress addr = GetLocalAddress(&pfrom.addr, pfrom.GetLocalServices());
@ -2433,9 +2427,23 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
// Get recent addresses // Get recent addresses
m_connman.PushMessage(&pfrom, CNetMsgMaker(greatest_common_version).Make(NetMsgType::GETADDR)); m_connman.PushMessage(&pfrom, CNetMsgMaker(greatest_common_version).Make(NetMsgType::GETADDR));
pfrom.fGetAddr = true; pfrom.fGetAddr = true;
}
// Moves address from New to Tried table in Addrman, resolves if (!pfrom.IsInboundConn()) {
// tried-table collisions, etc. // For non-inbound connections, we update the addrman to record
// connection success so that addrman will have an up-to-date
// notion of which peers are online and available.
//
// While we strive to not leak information about block-relay-only
// connections via the addrman, not moving an address to the tried
// table is also potentially detrimental because new-table entries
// are subject to eviction in the event of addrman collisions. We
// mitigate the information-leak by never calling
// CAddrMan::Connected() on block-relay-only peers; see
// FinalizeNode().
//
// This moves an address from New to Tried table in Addrman,
// resolves tried-table collisions, etc.
m_connman.MarkAddressGood(pfrom.addr); m_connman.MarkAddressGood(pfrom.addr);
} }

Loading…
Cancel
Save