Summary
GovernorTimelock::executeProposals() calls the scheduled proposal target, but only deletes the proposal information after, allowing a malicious executor to reenter and execute the same proposal more than once.
Vulnerability Detail
As shown below, GovernorTimelock::executeProposals() doesn't follow the CEI pattern and allows a malicious executor to reenter in case the proposal passes execution to an executor controlled contract.
Impact
Depends on the use case, couldn't identify an attack path that resulted in significant damage.
Code Snippet
Tool Used
Manual Review
Recommendation
Delete the proposal and then make the call.