Commit 681d3273 authored by felipe's avatar felipe Committed by GitHub

feat(op-node): p2p rpc input validation (#9897)

parent 730199cc
...@@ -181,6 +181,17 @@ func TestP2PFull(t *testing.T) { ...@@ -181,6 +181,17 @@ func TestP2PFull(t *testing.T) {
require.Equal(t, []peer.ID{hostB.ID()}, blockedPeers) require.Equal(t, []peer.ID{hostB.ID()}, blockedPeers)
require.NoError(t, p2pClientA.UnblockPeer(ctx, hostB.ID())) require.NoError(t, p2pClientA.UnblockPeer(ctx, hostB.ID()))
require.Error(t, p2pClientA.BlockAddr(ctx, nil))
require.Error(t, p2pClientA.UnblockAddr(ctx, nil))
require.Error(t, p2pClientA.BlockSubnet(ctx, nil))
require.Error(t, p2pClientA.UnblockSubnet(ctx, nil))
require.Error(t, p2pClientA.BlockPeer(ctx, ""))
require.Error(t, p2pClientA.UnblockPeer(ctx, ""))
require.Error(t, p2pClientA.ProtectPeer(ctx, ""))
require.Error(t, p2pClientA.UnprotectPeer(ctx, ""))
require.Error(t, p2pClientA.ConnectPeer(ctx, ""))
require.Error(t, p2pClientA.DisconnectPeer(ctx, ""))
require.NoError(t, p2pClientA.BlockAddr(ctx, net.IP{123, 123, 123, 123})) require.NoError(t, p2pClientA.BlockAddr(ctx, net.IP{123, 123, 123, 123}))
blockedIPs, err := p2pClientA.ListBlockedAddrs(ctx) blockedIPs, err := p2pClientA.ListBlockedAddrs(ctx)
require.NoError(t, err) require.NoError(t, err)
......
...@@ -36,6 +36,7 @@ var ( ...@@ -36,6 +36,7 @@ var (
ErrDisabledDiscovery = errors.New("discovery disabled") ErrDisabledDiscovery = errors.New("discovery disabled")
ErrNoConnectionManager = errors.New("no connection manager") ErrNoConnectionManager = errors.New("no connection manager")
ErrNoConnectionGater = errors.New("no connection gater") ErrNoConnectionGater = errors.New("no connection gater")
ErrInvalidRequest = errors.New("invalid request")
) )
type Node interface { type Node interface {
...@@ -244,23 +245,31 @@ func (s *APIBackend) DiscoveryTable(_ context.Context) ([]*enode.Node, error) { ...@@ -244,23 +245,31 @@ func (s *APIBackend) DiscoveryTable(_ context.Context) ([]*enode.Node, error) {
} }
} }
func (s *APIBackend) BlockPeer(_ context.Context, p peer.ID) error { func (s *APIBackend) BlockPeer(_ context.Context, id peer.ID) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_blockPeer") recordDur := s.m.RecordRPCServerRequest("opp2p_blockPeer")
if err := id.Validate(); err != nil {
log.Warn("invalid peer ID", "method", "BlockPeer", "peer", id, "err", err)
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
if gater := s.node.ConnectionGater(); gater == nil { if gater := s.node.ConnectionGater(); gater == nil {
return ErrNoConnectionGater return ErrNoConnectionGater
} else { } else {
return gater.BlockPeer(p) return gater.BlockPeer(id)
} }
} }
func (s *APIBackend) UnblockPeer(_ context.Context, p peer.ID) error { func (s *APIBackend) UnblockPeer(_ context.Context, id peer.ID) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_unblockPeer") recordDur := s.m.RecordRPCServerRequest("opp2p_unblockPeer")
if err := id.Validate(); err != nil {
log.Warn("invalid peer ID", "method", "UnblockPeer", "peer", id, "err", err)
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
if gater := s.node.ConnectionGater(); gater == nil { if gater := s.node.ConnectionGater(); gater == nil {
return ErrNoConnectionGater return ErrNoConnectionGater
} else { } else {
return gater.UnblockPeer(p) return gater.UnblockPeer(id)
} }
} }
...@@ -278,6 +287,10 @@ func (s *APIBackend) ListBlockedPeers(_ context.Context) ([]peer.ID, error) { ...@@ -278,6 +287,10 @@ func (s *APIBackend) ListBlockedPeers(_ context.Context) ([]peer.ID, error) {
// Note: active connections to the IP address are not automatically closed. // Note: active connections to the IP address are not automatically closed.
func (s *APIBackend) BlockAddr(_ context.Context, ip net.IP) error { func (s *APIBackend) BlockAddr(_ context.Context, ip net.IP) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_blockAddr") recordDur := s.m.RecordRPCServerRequest("opp2p_blockAddr")
if ip == nil {
log.Warn("invalid IP", "method", "BlockAddr")
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
if gater := s.node.ConnectionGater(); gater == nil { if gater := s.node.ConnectionGater(); gater == nil {
return ErrNoConnectionGater return ErrNoConnectionGater
...@@ -288,6 +301,10 @@ func (s *APIBackend) BlockAddr(_ context.Context, ip net.IP) error { ...@@ -288,6 +301,10 @@ func (s *APIBackend) BlockAddr(_ context.Context, ip net.IP) error {
func (s *APIBackend) UnblockAddr(_ context.Context, ip net.IP) error { func (s *APIBackend) UnblockAddr(_ context.Context, ip net.IP) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_unblockAddr") recordDur := s.m.RecordRPCServerRequest("opp2p_unblockAddr")
if ip == nil {
log.Warn("invalid IP", "method", "UnblockAddr")
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
if gater := s.node.ConnectionGater(); gater == nil { if gater := s.node.ConnectionGater(); gater == nil {
return ErrNoConnectionGater return ErrNoConnectionGater
...@@ -310,6 +327,10 @@ func (s *APIBackend) ListBlockedAddrs(_ context.Context) ([]net.IP, error) { ...@@ -310,6 +327,10 @@ func (s *APIBackend) ListBlockedAddrs(_ context.Context) ([]net.IP, error) {
// Note: active connections to the IP subnet are not automatically closed. // Note: active connections to the IP subnet are not automatically closed.
func (s *APIBackend) BlockSubnet(_ context.Context, ipnet *net.IPNet) error { func (s *APIBackend) BlockSubnet(_ context.Context, ipnet *net.IPNet) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_blockSubnet") recordDur := s.m.RecordRPCServerRequest("opp2p_blockSubnet")
if ipnet == nil {
log.Warn("invalid IPNet", "method", "BlockSubnet")
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
if gater := s.node.ConnectionGater(); gater == nil { if gater := s.node.ConnectionGater(); gater == nil {
return ErrNoConnectionGater return ErrNoConnectionGater
...@@ -320,6 +341,10 @@ func (s *APIBackend) BlockSubnet(_ context.Context, ipnet *net.IPNet) error { ...@@ -320,6 +341,10 @@ func (s *APIBackend) BlockSubnet(_ context.Context, ipnet *net.IPNet) error {
func (s *APIBackend) UnblockSubnet(_ context.Context, ipnet *net.IPNet) error { func (s *APIBackend) UnblockSubnet(_ context.Context, ipnet *net.IPNet) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_unblockSubnet") recordDur := s.m.RecordRPCServerRequest("opp2p_unblockSubnet")
if ipnet == nil {
log.Warn("invalid IPNet", "method", "UnblockSubnet")
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
if gater := s.node.ConnectionGater(); gater == nil { if gater := s.node.ConnectionGater(); gater == nil {
return ErrNoConnectionGater return ErrNoConnectionGater
...@@ -338,24 +363,32 @@ func (s *APIBackend) ListBlockedSubnets(_ context.Context) ([]*net.IPNet, error) ...@@ -338,24 +363,32 @@ func (s *APIBackend) ListBlockedSubnets(_ context.Context) ([]*net.IPNet, error)
} }
} }
func (s *APIBackend) ProtectPeer(_ context.Context, p peer.ID) error { func (s *APIBackend) ProtectPeer(_ context.Context, id peer.ID) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_protectPeer") recordDur := s.m.RecordRPCServerRequest("opp2p_protectPeer")
if err := id.Validate(); err != nil {
log.Warn("invalid peer ID", "method", "ProtectPeer", "peer", id, "err", err)
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
if manager := s.node.ConnectionManager(); manager == nil { if manager := s.node.ConnectionManager(); manager == nil {
return ErrNoConnectionManager return ErrNoConnectionManager
} else { } else {
manager.Protect(p, "api-protected") manager.Protect(id, "api-protected")
return nil return nil
} }
} }
func (s *APIBackend) UnprotectPeer(_ context.Context, p peer.ID) error { func (s *APIBackend) UnprotectPeer(_ context.Context, id peer.ID) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_unprotectPeer") recordDur := s.m.RecordRPCServerRequest("opp2p_unprotectPeer")
if err := id.Validate(); err != nil {
log.Warn("invalid peer ID", "method", "UnprotectPeer", "peer", id, "err", err)
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
if manager := s.node.ConnectionManager(); manager == nil { if manager := s.node.ConnectionManager(); manager == nil {
return ErrNoConnectionManager return ErrNoConnectionManager
} else { } else {
manager.Unprotect(p, "api-protected") manager.Unprotect(id, "api-protected")
return nil return nil
} }
} }
...@@ -377,6 +410,10 @@ func (s *APIBackend) ConnectPeer(ctx context.Context, addr string) error { ...@@ -377,6 +410,10 @@ func (s *APIBackend) ConnectPeer(ctx context.Context, addr string) error {
func (s *APIBackend) DisconnectPeer(_ context.Context, id peer.ID) error { func (s *APIBackend) DisconnectPeer(_ context.Context, id peer.ID) error {
recordDur := s.m.RecordRPCServerRequest("opp2p_disconnectPeer") recordDur := s.m.RecordRPCServerRequest("opp2p_disconnectPeer")
if err := id.Validate(); err != nil {
log.Warn("invalid peer ID", "method", "DisconnectPeer", "peer", id, "err", err)
return ErrInvalidRequest
}
defer recordDur() defer recordDur()
err := s.node.Host().Network().ClosePeer(id) err := s.node.Host().Network().ClosePeer(id)
if err != nil { if err != nil {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment