Changeset View
Changeset View
Standalone View
Standalone View
src/test/denialofservice_tests.cpp
Show First 20 Lines • Show All 67 Lines • ▼ Show 20 Lines | |||||
// Note that we protect 4 outbound nodes from being subject to this logic; this | // Note that we protect 4 outbound nodes from being subject to this logic; this | ||||
// test takes advantage of that protection only being applied to nodes which | // test takes advantage of that protection only being applied to nodes which | ||||
// send headers with sufficient work. | // send headers with sufficient work. | ||||
BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction) { | BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction) { | ||||
const Config &config = GetConfig(); | const Config &config = GetConfig(); | ||||
std::atomic<bool> interruptDummy(false); | std::atomic<bool> interruptDummy(false); | ||||
auto connman = std::make_unique<CConnman>(config, 0x1337, 0x1337); | auto connman = std::make_unique<CConnman>(config, 0x1337, 0x1337); | ||||
auto peerLogic = | auto peerLogic = std::make_unique<PeerLogicValidation>( | ||||
std::make_unique<PeerLogicValidation>(connman.get(), scheduler, false); | connman.get(), nullptr, scheduler, false); | ||||
// Mock an outbound peer | // Mock an outbound peer | ||||
CAddress addr1(ip(0xa0b0c001), NODE_NONE); | CAddress addr1(ip(0xa0b0c001), NODE_NONE); | ||||
CNode dummyNode1(id++, ServiceFlags(NODE_NETWORK), 0, INVALID_SOCKET, addr1, | CNode dummyNode1(id++, ServiceFlags(NODE_NETWORK), 0, INVALID_SOCKET, addr1, | ||||
0, 0, CAddress(), "", | 0, 0, CAddress(), "", | ||||
/*fInboundIn=*/false); | /*fInboundIn=*/false); | ||||
dummyNode1.SetSendVersion(PROTOCOL_VERSION); | dummyNode1.SetSendVersion(PROTOCOL_VERSION); | ||||
▲ Show 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | static void AddRandomOutboundPeer(const Config &config, | ||||
connman->AddNode(node); | connman->AddNode(node); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(stale_tip_peer_management) { | BOOST_AUTO_TEST_CASE(stale_tip_peer_management) { | ||||
const Config &config = GetConfig(); | const Config &config = GetConfig(); | ||||
auto connman = std::make_unique<CConnmanTest>(config, 0x1337, 0x1337); | auto connman = std::make_unique<CConnmanTest>(config, 0x1337, 0x1337); | ||||
auto peerLogic = | auto peerLogic = std::make_unique<PeerLogicValidation>( | ||||
std::make_unique<PeerLogicValidation>(connman.get(), scheduler, false); | connman.get(), nullptr, scheduler, false); | ||||
const Consensus::Params &consensusParams = | const Consensus::Params &consensusParams = | ||||
config.GetChainParams().GetConsensus(); | config.GetChainParams().GetConsensus(); | ||||
constexpr int nMaxOutbound = 8; | constexpr int nMaxOutbound = 8; | ||||
CConnman::Options options; | CConnman::Options options; | ||||
options.nMaxConnections = 125; | options.nMaxConnections = 125; | ||||
options.nMaxOutbound = nMaxOutbound; | options.nMaxOutbound = nMaxOutbound; | ||||
options.nMaxFeeler = 1; | options.nMaxFeeler = 1; | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(stale_tip_peer_management) { | ||||
connman->ClearNodes(); | connman->ClearNodes(); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(DoS_banning) { | BOOST_AUTO_TEST_CASE(DoS_banning) { | ||||
const Config &config = GetConfig(); | const Config &config = GetConfig(); | ||||
std::atomic<bool> interruptDummy(false); | std::atomic<bool> interruptDummy(false); | ||||
auto banman = std::make_unique<BanMan>(config.GetChainParams(), nullptr); | |||||
auto connman = std::make_unique<CConnman>(config, 0x1337, 0x1337); | auto connman = std::make_unique<CConnman>(config, 0x1337, 0x1337); | ||||
auto peerLogic = | auto peerLogic = std::make_unique<PeerLogicValidation>( | ||||
std::make_unique<PeerLogicValidation>(connman.get(), scheduler, false); | connman.get(), banman.get(), scheduler, false); | ||||
connman->ClearBanned(); | banman->ClearBanned(); | ||||
CAddress addr1(ip(0xa0b0c001), NODE_NONE); | CAddress addr1(ip(0xa0b0c001), NODE_NONE); | ||||
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 0, 0, | CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 0, 0, | ||||
CAddress(), "", true); | CAddress(), "", true); | ||||
dummyNode1.SetSendVersion(PROTOCOL_VERSION); | dummyNode1.SetSendVersion(PROTOCOL_VERSION); | ||||
peerLogic->InitializeNode(config, &dummyNode1); | peerLogic->InitializeNode(config, &dummyNode1); | ||||
dummyNode1.nVersion = 1; | dummyNode1.nVersion = 1; | ||||
dummyNode1.fSuccessfullyConnected = true; | dummyNode1.fSuccessfullyConnected = true; | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
// Should get banned. | // Should get banned. | ||||
Misbehaving(dummyNode1.GetId(), 100, ""); | Misbehaving(dummyNode1.GetId(), 100, ""); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_sendProcessing); | LOCK2(cs_main, dummyNode1.cs_sendProcessing); | ||||
peerLogic->SendMessages(config, &dummyNode1, interruptDummy); | peerLogic->SendMessages(config, &dummyNode1, interruptDummy); | ||||
} | } | ||||
BOOST_CHECK(connman->IsBanned(addr1)); | BOOST_CHECK(banman->IsBanned(addr1)); | ||||
// Different IP, not banned. | // Different IP, not banned. | ||||
BOOST_CHECK(!connman->IsBanned(ip(0xa0b0c001 | 0x0000ff00))); | BOOST_CHECK(!banman->IsBanned(ip(0xa0b0c001 | 0x0000ff00))); | ||||
CAddress addr2(ip(0xa0b0c002), NODE_NONE); | CAddress addr2(ip(0xa0b0c002), NODE_NONE); | ||||
CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, | CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, | ||||
CAddress(), "", true); | CAddress(), "", true); | ||||
dummyNode2.SetSendVersion(PROTOCOL_VERSION); | dummyNode2.SetSendVersion(PROTOCOL_VERSION); | ||||
peerLogic->InitializeNode(config, &dummyNode2); | peerLogic->InitializeNode(config, &dummyNode2); | ||||
dummyNode2.nVersion = 1; | dummyNode2.nVersion = 1; | ||||
dummyNode2.fSuccessfullyConnected = true; | dummyNode2.fSuccessfullyConnected = true; | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
Misbehaving(dummyNode2.GetId(), 50, ""); | Misbehaving(dummyNode2.GetId(), 50, ""); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode2.cs_sendProcessing); | LOCK2(cs_main, dummyNode2.cs_sendProcessing); | ||||
peerLogic->SendMessages(config, &dummyNode2, interruptDummy); | peerLogic->SendMessages(config, &dummyNode2, interruptDummy); | ||||
} | } | ||||
// 2 not banned yet... | // 2 not banned yet... | ||||
BOOST_CHECK(!connman->IsBanned(addr2)); | BOOST_CHECK(!banman->IsBanned(addr2)); | ||||
// ... but 1 still should be. | // ... but 1 still should be. | ||||
BOOST_CHECK(connman->IsBanned(addr1)); | BOOST_CHECK(banman->IsBanned(addr1)); | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
Misbehaving(dummyNode2.GetId(), 50, ""); | Misbehaving(dummyNode2.GetId(), 50, ""); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode2.cs_sendProcessing); | LOCK2(cs_main, dummyNode2.cs_sendProcessing); | ||||
peerLogic->SendMessages(config, &dummyNode2, interruptDummy); | peerLogic->SendMessages(config, &dummyNode2, interruptDummy); | ||||
} | } | ||||
BOOST_CHECK(connman->IsBanned(addr2)); | BOOST_CHECK(banman->IsBanned(addr2)); | ||||
bool dummy; | bool dummy; | ||||
peerLogic->FinalizeNode(config, dummyNode1.GetId(), dummy); | peerLogic->FinalizeNode(config, dummyNode1.GetId(), dummy); | ||||
peerLogic->FinalizeNode(config, dummyNode2.GetId(), dummy); | peerLogic->FinalizeNode(config, dummyNode2.GetId(), dummy); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(DoS_banscore) { | BOOST_AUTO_TEST_CASE(DoS_banscore) { | ||||
const Config &config = GetConfig(); | const Config &config = GetConfig(); | ||||
std::atomic<bool> interruptDummy(false); | std::atomic<bool> interruptDummy(false); | ||||
auto banman = std::make_unique<BanMan>(config.GetChainParams(), nullptr); | |||||
auto connman = std::make_unique<CConnman>(config, 0x1337, 0x1337); | auto connman = std::make_unique<CConnman>(config, 0x1337, 0x1337); | ||||
auto peerLogic = | auto peerLogic = std::make_unique<PeerLogicValidation>( | ||||
std::make_unique<PeerLogicValidation>(connman.get(), scheduler, false); | connman.get(), banman.get(), scheduler, false); | ||||
connman->ClearBanned(); | banman->ClearBanned(); | ||||
// because 11 is my favorite number. | // because 11 is my favorite number. | ||||
gArgs.ForceSetArg("-banscore", "111"); | gArgs.ForceSetArg("-banscore", "111"); | ||||
CAddress addr1(ip(0xa0b0c001), NODE_NONE); | CAddress addr1(ip(0xa0b0c001), NODE_NONE); | ||||
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 3, 1, | CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 3, 1, | ||||
CAddress(), "", true); | CAddress(), "", true); | ||||
dummyNode1.SetSendVersion(PROTOCOL_VERSION); | dummyNode1.SetSendVersion(PROTOCOL_VERSION); | ||||
peerLogic->InitializeNode(config, &dummyNode1); | peerLogic->InitializeNode(config, &dummyNode1); | ||||
dummyNode1.nVersion = 1; | dummyNode1.nVersion = 1; | ||||
dummyNode1.fSuccessfullyConnected = true; | dummyNode1.fSuccessfullyConnected = true; | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
Misbehaving(dummyNode1.GetId(), 100, ""); | Misbehaving(dummyNode1.GetId(), 100, ""); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_sendProcessing); | LOCK2(cs_main, dummyNode1.cs_sendProcessing); | ||||
peerLogic->SendMessages(config, &dummyNode1, interruptDummy); | peerLogic->SendMessages(config, &dummyNode1, interruptDummy); | ||||
} | } | ||||
BOOST_CHECK(!connman->IsBanned(addr1)); | BOOST_CHECK(!banman->IsBanned(addr1)); | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
Misbehaving(dummyNode1.GetId(), 10, ""); | Misbehaving(dummyNode1.GetId(), 10, ""); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_sendProcessing); | LOCK2(cs_main, dummyNode1.cs_sendProcessing); | ||||
peerLogic->SendMessages(config, &dummyNode1, interruptDummy); | peerLogic->SendMessages(config, &dummyNode1, interruptDummy); | ||||
} | } | ||||
BOOST_CHECK(!connman->IsBanned(addr1)); | BOOST_CHECK(!banman->IsBanned(addr1)); | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
Misbehaving(dummyNode1.GetId(), 1, ""); | Misbehaving(dummyNode1.GetId(), 1, ""); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_sendProcessing); | LOCK2(cs_main, dummyNode1.cs_sendProcessing); | ||||
peerLogic->SendMessages(config, &dummyNode1, interruptDummy); | peerLogic->SendMessages(config, &dummyNode1, interruptDummy); | ||||
} | } | ||||
BOOST_CHECK(connman->IsBanned(addr1)); | BOOST_CHECK(banman->IsBanned(addr1)); | ||||
gArgs.ForceSetArg("-banscore", std::to_string(DEFAULT_BANSCORE_THRESHOLD)); | gArgs.ForceSetArg("-banscore", std::to_string(DEFAULT_BANSCORE_THRESHOLD)); | ||||
bool dummy; | bool dummy; | ||||
peerLogic->FinalizeNode(config, dummyNode1.GetId(), dummy); | peerLogic->FinalizeNode(config, dummyNode1.GetId(), dummy); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(DoS_bantime) { | BOOST_AUTO_TEST_CASE(DoS_bantime) { | ||||
const Config &config = GetConfig(); | const Config &config = GetConfig(); | ||||
std::atomic<bool> interruptDummy(false); | std::atomic<bool> interruptDummy(false); | ||||
auto banman = std::make_unique<BanMan>(config.GetChainParams(), nullptr); | |||||
auto connman = std::make_unique<CConnman>(config, 0x1337, 0x1337); | auto connman = std::make_unique<CConnman>(config, 0x1337, 0x1337); | ||||
auto peerLogic = | auto peerLogic = std::make_unique<PeerLogicValidation>( | ||||
std::make_unique<PeerLogicValidation>(connman.get(), scheduler, false); | connman.get(), banman.get(), scheduler, false); | ||||
connman->ClearBanned(); | banman->ClearBanned(); | ||||
int64_t nStartTime = GetTime(); | int64_t nStartTime = GetTime(); | ||||
// Overrides future calls to GetTime() | // Overrides future calls to GetTime() | ||||
SetMockTime(nStartTime); | SetMockTime(nStartTime); | ||||
CAddress addr(ip(0xa0b0c001), NODE_NONE); | CAddress addr(ip(0xa0b0c001), NODE_NONE); | ||||
CNode dummyNode(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr, 4, 4, | CNode dummyNode(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr, 4, 4, | ||||
CAddress(), "", true); | CAddress(), "", true); | ||||
dummyNode.SetSendVersion(PROTOCOL_VERSION); | dummyNode.SetSendVersion(PROTOCOL_VERSION); | ||||
peerLogic->InitializeNode(config, &dummyNode); | peerLogic->InitializeNode(config, &dummyNode); | ||||
dummyNode.nVersion = 1; | dummyNode.nVersion = 1; | ||||
dummyNode.fSuccessfullyConnected = true; | dummyNode.fSuccessfullyConnected = true; | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
Misbehaving(dummyNode.GetId(), 100, ""); | Misbehaving(dummyNode.GetId(), 100, ""); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode.cs_sendProcessing); | LOCK2(cs_main, dummyNode.cs_sendProcessing); | ||||
peerLogic->SendMessages(config, &dummyNode, interruptDummy); | peerLogic->SendMessages(config, &dummyNode, interruptDummy); | ||||
} | } | ||||
BOOST_CHECK(connman->IsBanned(addr)); | BOOST_CHECK(banman->IsBanned(addr)); | ||||
SetMockTime(nStartTime + 60 * 60); | SetMockTime(nStartTime + 60 * 60); | ||||
BOOST_CHECK(connman->IsBanned(addr)); | BOOST_CHECK(banman->IsBanned(addr)); | ||||
SetMockTime(nStartTime + 60 * 60 * 24 + 1); | SetMockTime(nStartTime + 60 * 60 * 24 + 1); | ||||
BOOST_CHECK(!connman->IsBanned(addr)); | BOOST_CHECK(!banman->IsBanned(addr)); | ||||
bool dummy; | bool dummy; | ||||
peerLogic->FinalizeNode(config, dummyNode.GetId(), dummy); | peerLogic->FinalizeNode(config, dummyNode.GetId(), dummy); | ||||
} | } | ||||
static CTransactionRef RandomOrphan() { | static CTransactionRef RandomOrphan() { | ||||
std::map<uint256, COrphanTx>::iterator it; | std::map<uint256, COrphanTx>::iterator it; | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
▲ Show 20 Lines • Show All 83 Lines • Show Last 20 Lines |