Skip to content

[Bug] PD raft port accepts jraft CLI membership requests, which bypass the checks of changePeerList and updatePdRaft #3386

Open

Description

@bitflicker64

Bug Type (问题类型)

logic (逻辑设计问题)

Before submit

  • I have confirmed and searched that there are no similar problems in the historical issue and documents

Environment (环境信息)

  • Server Version: PD on master at 86c05ef9c (1.8.0-SNAPSHOT), jraft 1.3.14 (jraft.version in the root pom)
  • Backend: PD raft group (3 or more PD nodes)
  • OS: any
  • Data Size: N/A

Expected & Actual behavior (期望与实际表现)

PD changes its raft membership through two of its own entry points, RaftEngine.changePeerList (the changePeerList RPC and REST call) and PDService.updatePdRaft. Its raft RPC server also accepts jraft's own CLI membership requests, which bypass both.

RaftEngine.createRaftRpcServer builds the server with RaftRpcServerFactory.createRaftRpcServer(endpoint), which registers jraft's CLI processors next to the replication ones. Checked with javap on the jraft 1.3.14 jar, RaftRpcServerFactory adds, among others:

cli/AddPeerRequestProcessor
cli/RemovePeerRequestProcessor
cli/ChangePeersRequestProcessor
cli/ResetPeerRequestProcessor
cli/AddLearnersRequestProcessor
cli/RemoveLearnersRequestProcessor
cli/ResetLearnersRequestProcessor
cli/TransferLeaderRequestProcessor
cli/SnapshotRequestProcessor

So a jraft CliService client that reaches a PD raft port can add, remove or reset peers and learners, or transfer the leadership, with none of the checks PD runs on its own paths. Today that skips, for example, the odd peer count check of changePeerList and the IpAuthHandler refresh after a change. The raft IP allowlist (raft.ip-whitelist.enabled, on by default) limits such a client to the IPs of the current peers, so it has to run on a PD host or share its IP.

It matters more once PD checks peers before a membership change. #3376 adds a txn raft entry, and both of PD's own membership paths refuse to add a peer that does not apply that entry, since an older PD would skip it when it replays the log. A peer added through the CLI processors is not checked.

Expected: membership changes go through one path that runs PD's checks. Either the CLI membership processors are not registered on PD's raft server (keeping the replication processors and, if wanted, GetLeader and GetPeers), or they are wrapped so they run the same checks as changePeerList.

Vertex/Edge example (问题点 / 边数据举例)

N/A

Schema [VertexLabel, EdgeLabel, IndexLabel] (元数据结构)

N/A

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions