Background
Sibling issue to #1124's connector_state_machine proposal, scoped to the acceptor side.
crates/ironrdp-acceptor/src/connection.rs defines AcceptorState with 15 states that drive the server-side accept flow. Coverage-guided byte-mutational fuzzing cannot reach the deep AcceptorState variants for the same reason described in #1124: RDP's rigid state machine requires a valid prefix before any deep state is reachable. The bug class (cross-state confusion, security-upgrade race, channel-join replay, reactivation) is structurally invisible to single-PDU oracles on the acceptor side.
Scope
crates/ironrdp-acceptor/ only for this issue. The connector side is tracked in #1124.
Approach
Mirror the replay-then-mutate harness proposed in #1124 for ClientConnector::step, adapted to AcceptorState::step. A hardcoded Vec<Vec<u8>> of valid client-side PDUs replays N-1 frames through the acceptor state machine to reach a target state. libFuzzer then mutates the Nth frame.
Relationship to #1124
Separate harness because the state-set is different (15 acceptor states vs 14 connector states) and the receive orientation is reversed (server-receives-from-client vs client-receives-from-server). Substantial code overlap with the connector harness once both are scaffolded.
Out of scope
Provenance
Background
Sibling issue to #1124's
connector_state_machineproposal, scoped to the acceptor side.crates/ironrdp-acceptor/src/connection.rsdefinesAcceptorStatewith 15 states that drive the server-side accept flow. Coverage-guided byte-mutational fuzzing cannot reach the deepAcceptorStatevariants for the same reason described in #1124: RDP's rigid state machine requires a valid prefix before any deep state is reachable. The bug class (cross-state confusion, security-upgrade race, channel-join replay, reactivation) is structurally invisible to single-PDU oracles on the acceptor side.Scope
crates/ironrdp-acceptor/only for this issue. The connector side is tracked in #1124.Approach
Mirror the replay-then-mutate harness proposed in #1124 for
ClientConnector::step, adapted toAcceptorState::step. A hardcodedVec<Vec<u8>>of valid client-side PDUs replays N-1 frames through the acceptor state machine to reach a target state. libFuzzer then mutates the Nth frame.Relationship to #1124
Separate harness because the state-set is different (15 acceptor states vs 14 connector states) and the receive orientation is reversed (server-receives-from-client vs client-receives-from-server). Substantial code overlap with the connector harness once both are scaffolded.
Out of scope
Provenance
issuecomment-4556409179)arbitrary#1120 (the broader fuzzing umbrella)