Skip to content

Commit 0876562

Browse files
zsfelfoldiwgr523
authored andcommitted
les: add Skip overflow check to GetBlockHeadersMsg handler (ethereum#16891)
1 parent 2135e2b commit 0876562

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

les/handler.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package les
1919

2020
import (
2121
"encoding/binary"
22+
"encoding/json"
2223
"errors"
2324
"fmt"
2425
"math/big"
@@ -447,7 +448,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
447448

448449
// Advance to the next header of the query
449450
switch {
450-
case query.Origin.Hash != (common.Hash{}) && query.Reverse:
451+
case hashMode && query.Reverse:
451452
// Hash based traversal towards the genesis block
452453
for i := 0; i < int(query.Skip)+1; i++ {
453454
if header := pm.blockchain.GetHeader(query.Origin.Hash, number); header != nil {
@@ -458,16 +459,26 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
458459
break
459460
}
460461
}
461-
case query.Origin.Hash != (common.Hash{}) && !query.Reverse:
462+
case hashMode && !query.Reverse:
462463
// Hash based traversal towards the leaf block
463-
if header := pm.blockchain.GetHeaderByNumber(origin.Number.Uint64() + query.Skip + 1); header != nil {
464-
if pm.blockchain.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash {
465-
query.Origin.Hash = header.Hash()
464+
var (
465+
current = origin.Number.Uint64()
466+
next = current + query.Skip + 1
467+
)
468+
if next <= current {
469+
infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ")
470+
p.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", query.Skip, "next", next, "attacker", infos)
471+
unknown = true
472+
} else {
473+
if header := pm.blockchain.GetHeaderByNumber(next); header != nil {
474+
if pm.blockchain.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash {
475+
query.Origin.Hash = header.Hash()
476+
} else {
477+
unknown = true
478+
}
466479
} else {
467480
unknown = true
468481
}
469-
} else {
470-
unknown = true
471482
}
472483
case query.Reverse:
473484
// Number based traversal towards the genesis block

0 commit comments

Comments
 (0)