diff options
author | Viktor TrĂ³n <viktor.tron@gmail.com> | 2018-09-26 18:44:42 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-26 18:44:42 +0800 |
commit | 4b6824e07b1b7c5a2907143b4d122283eadb2474 (patch) | |
tree | 636b5377de9aa45f678c4c93a2dc72aafd687b81 /swarm/network/stream/streamer_test.go | |
parent | 26cf866349034b0a7d8ef297f6f76125227eb9af (diff) | |
parent | d3f056bd68fb6a8e9ffa3938d5404c6a209e0313 (diff) | |
download | go-tangerine-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar go-tangerine-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.gz go-tangerine-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.bz2 go-tangerine-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.lz go-tangerine-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.xz go-tangerine-4b6824e07b1b7c5a2907143b4d122283eadb2474.tar.zst go-tangerine-4b6824e07b1b7c5a2907143b4d122283eadb2474.zip |
Merge pull request #17734 from frncmx/fix-dos-attack-invalid-hash-length
swarm/network/stream: fix DoS invalid offered hashes length
Diffstat (limited to 'swarm/network/stream/streamer_test.go')
-rw-r--r-- | swarm/network/stream/streamer_test.go | 77 |
1 files changed, 72 insertions, 5 deletions
diff --git a/swarm/network/stream/streamer_test.go b/swarm/network/stream/streamer_test.go index e13cc8c29..ba4328eef 100644 --- a/swarm/network/stream/streamer_test.go +++ b/swarm/network/stream/streamer_test.go @@ -19,6 +19,7 @@ package stream import ( "bytes" "context" + "errors" "testing" "time" @@ -55,11 +56,12 @@ func TestStreamerRequestSubscription(t *testing.T) { } var ( - hash0 = sha3.Sum256([]byte{0}) - hash1 = sha3.Sum256([]byte{1}) - hash2 = sha3.Sum256([]byte{2}) - hashesTmp = append(hash0[:], hash1[:]...) - hashes = append(hashesTmp, hash2[:]...) + hash0 = sha3.Sum256([]byte{0}) + hash1 = sha3.Sum256([]byte{1}) + hash2 = sha3.Sum256([]byte{2}) + hashesTmp = append(hash0[:], hash1[:]...) + hashes = append(hashesTmp, hash2[:]...) + corruptHashes = append(hashes[:40]) ) type testClient struct { @@ -459,6 +461,71 @@ func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) { } } +func TestStreamerDownstreamCorruptHashesMsgExchange(t *testing.T) { + tester, streamer, _, teardown, err := newStreamerTester(t) + defer teardown() + if err != nil { + t.Fatal(err) + } + + stream := NewStream("foo", "", true) + + var tc *testClient + + streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { + tc = newTestClient(t) + return tc, nil + }) + + peerID := tester.IDs[0] + + err = streamer.Subscribe(peerID, stream, NewRange(5, 8), Top) + if err != nil { + t.Fatalf("Expected no error, got %v", err) + } + + err = tester.TestExchanges(p2ptest.Exchange{ + Label: "Subscribe message", + Expects: []p2ptest.Expect{ + { + Code: 4, + Msg: &SubscribeMsg{ + Stream: stream, + History: NewRange(5, 8), + Priority: Top, + }, + Peer: peerID, + }, + }, + }, + p2ptest.Exchange{ + Label: "Corrupt offered hash message", + Triggers: []p2ptest.Trigger{ + { + Code: 1, + Msg: &OfferedHashesMsg{ + HandoverProof: &HandoverProof{ + Handover: &Handover{}, + }, + Hashes: corruptHashes, + From: 5, + To: 8, + Stream: stream, + }, + Peer: peerID, + }, + }, + }) + if err != nil { + t.Fatal(err) + } + + expectedError := errors.New("Message handler error: (msg code 1): error invalid hashes length (len: 40)") + if err := tester.TestDisconnected(&p2ptest.Disconnect{Peer: tester.IDs[0], Error: expectedError}); err != nil { + t.Fatal(err) + } +} + func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) { tester, streamer, _, teardown, err := newStreamerTester(t) defer teardown() |