The fd_mux_during_frag_fn is called after the mux has received a new frag.
/* fd_mux_during_frag_fn is called after the mux has received a new frag from an in, but before the mux has checked that it was overrun. This callback is not invoked if the mux is backpressured, as it would not try and read a frag from an in in the first place (instead, leaving it on the in mcache to backpressure the upstream producer). in_idx will be the index of the in that the frag was received from. If the producer of the frags is respecting flow control, it is safe to read frag data in any of the callbacks, but it is suggested to copy or read frag data within this callback, as if the producer does not respect flow control, the frag may be torn or corrupt due to an overrun by the reader. If the frag being read from has been overwritten while this callback is running, the frag will be ignored and the mux will not call the process function. Instead it will recover from the overrun and continue with new frags. This function cannot fail. If opt_filter is set to non-zero, it means the frag should be filtered and not passed on to downstream consumers of the mux. The ctx is a user-provided context object from when the mux tile was initialized. seq, sig, chunk, and sz are the respective fields from the mcache fragment that was received. If the producer is not respecting flow control, these may be corrupt or torn and should not be trusted, except for seq which is read atomically. */typedefvoid (fd_mux_during_frag_fn)( void* ctx, ulong in_idx, ulong seq, ulong sig, ulong chunk, ulong sz,int* opt_filter );
Specifically, the parameters seq, sig, chunk, and sz originate from the received mcache fragment. Since the producer could be compromised, these fields are considered untrusted.
In the during_frag function within the fd_sign tile implementation (src/app/fdctl/run/tiles/fd_sign.c), The "sz" parameter is not subject to any boundary checks, which can lead to an Out-Of-Bounds (OOB) Write when an attacker controls the "sz". In the case FD_KEYGUARD_ROLE_VOTER
The lack of a PoC (Proof of Concept) stems from the complexity of the attack. Since it involves a process-to-process exploit, modifying the producer to generate untrusted input is necessary. We highly encourage the Firedancer team to review the report for a comprehensive explanation of the vulnerability. The report includes code snippets that clearly demonstrate the issue.