Skip to content

Commit ddbe25d

Browse files
zsfelfoldifirmianavan
authored andcommitted
les: add Skip overflow check to GetBlockHeadersMsg handler (ethereum#16891)
1 parent 5ca24fb commit ddbe25d

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"
@@ -441,7 +442,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
441442

442443
// Advance to the next header of the query
443444
switch {
444-
case query.Origin.Hash != (common.Hash{}) && query.Reverse:
445+
case hashMode && query.Reverse:
445446
// Hash based traversal towards the genesis block
446447
for i := 0; i < int(query.Skip)+1; i++ {
447448
if header := pm.blockchain.GetHeader(query.Origin.Hash, number); header != nil {
@@ -452,16 +453,26 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
452453
break
453454
}
454455
}
455-
case query.Origin.Hash != (common.Hash{}) && !query.Reverse:
456+
case hashMode && !query.Reverse:
456457
// Hash based traversal towards the leaf block
457-
if header := pm.blockchain.GetHeaderByNumber(origin.Number.Uint64() + query.Skip + 1); header != nil {
458-
if pm.blockchain.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash {
459-
query.Origin.Hash = header.Hash()
458+
var (
459+
current = origin.Number.Uint64()
460+
next = current + query.Skip + 1
461+
)
462+
if next <= current {
463+
infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ")
464+
p.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", query.Skip, "next", next, "attacker", infos)
465+
unknown = true
466+
} else {
467+
if header := pm.blockchain.GetHeaderByNumber(next); header != nil {
468+
if pm.blockchain.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash {
469+
query.Origin.Hash = header.Hash()
470+
} else {
471+
unknown = true
472+
}
460473
} else {
461474
unknown = true
462475
}
463-
} else {
464-
unknown = true
465476
}
466477
case query.Reverse:
467478
// Number based traversal towards the genesis block

0 commit comments

Comments
 (0)