Platform: Code4rena
Start Date: 24/07/2023
Pot Size: $100,000 USDC
Total HM: 18
Participants: 73
Period: 7 days
Judge: alcueca
Total Solo HM: 8
Id: 267
League: ETH
Rank: 20/73
Findings: 2
Award: $567.29
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: Aymen0909
Also found by: ABAIKUNANBAEV, Jigsaw, hals, sces60107
523.9156 USDC - $523.92
https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L266 https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L261
It is said that TemporalGovernor.fastTrackProposalExecution
Allows the guardian to process a VAA when the TemporalGovernor
is paused.
https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L261
/// @notice Allow the guardian to process a VAA when the /// Temporal Governor is paused this is only for use during /// periods of emergency when the governance on moonbeam is /// compromised and we need to stop additional proposals from going through. /// @param VAA The signed Verified Action Approval to process
However, it can be executed even if the temporal governor is not paused.
TemporalGovernor.fastTrackProposalExecution
Allows the guardian to process a VAA when the TemporalGovernor
is paused.
https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L266
/// @notice Allow the guardian to process a VAA when the /// Temporal Governor is paused this is only for use during /// periods of emergency when the governance on moonbeam is /// compromised and we need to stop additional proposals from going through. /// @param VAA The signed Verified Action Approval to process function fastTrackProposalExecution(bytes memory VAA) external onlyOwner { _executeProposal(VAA, true); /// override timestamp checks and execute }
But it doesn’t check the pause status of the contract. The guardian can execute it when the temporal governor is not paused.
Manual Review
Add whenPaused
on fastTrackProposalExecution
- function fastTrackProposalExecution(bytes memory VAA) external onlyOwner { + function fastTrackProposalExecution(bytes memory VAA) external whenPaused onlyOwner { _executeProposal(VAA, true); /// override timestamp checks and execute }
Access Control
#0 - c4-pre-sort
2023-08-03T13:53:10Z
0xSorryNotSorry marked the issue as primary issue
#1 - c4-sponsor
2023-08-03T22:04:33Z
ElliotFriedman marked the issue as sponsor confirmed
#2 - alcueca
2023-08-12T20:40:58Z
As I read the natspec, it says it should be usable when paused, but it doesn't say that it shouldn't be usable when not paused. However, I'll defer to the sponsor as to validity.
#3 - c4-judge
2023-08-12T20:42:40Z
alcueca marked issue #276 as primary and marked this issue as a duplicate of 276
#4 - c4-judge
2023-08-12T20:42:50Z
alcueca marked the issue as satisfactory
43.3709 USDC - $43.37
https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L400 https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L237 https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L266
TemporalGovernor
can execute proposals. But it cannot execute proposals with value != 0. The function doesn’t have a payable
modifier. And there is no receive()
in the contract.
There is no payable
modifier on executeProposal
and fastTrackProposalExecution
.
https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L237
https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L266
function executeProposal(bytes memory VAA) public whenNotPaused { _executeProposal(VAA, false); } function fastTrackProposalExecution(bytes memory VAA) external onlyOwner { _executeProposal(VAA, true); /// override timestamp checks and execute }
And the TemporalGovernor
doesn’t have a receive()
function.
But _executeProposal
should be able to make a call with value greater than zero.
https://github.com/code-423n4/2023-07-moonwell/blob/main/src/core/Governance/TemporalGovernor.sol#L400
function _executeProposal(bytes memory VAA, bool overrideDelay) private { … for (uint256 i = 0; i < targets.length; i++) { address target = targets[i]; uint256 value = values[i]; bytes memory data = calldatas[i]; // Go make our call, and if it is not successful revert with the error bubbling up (bool success, bytes memory returnData) = target.call{value: value}( data ); /// revert on failure with error message if any require(success, string(returnData)); emit ExecutedTransaction(target, value, data); } }
Manual Review
Add payable
modifier on those functions or add receive()
in TemporalGovernor
ETH-Transfer
#0 - c4-pre-sort
2023-08-03T13:21:36Z
0xSorryNotSorry marked the issue as duplicate of #268
#1 - c4-judge
2023-08-12T20:37:30Z
alcueca marked the issue as satisfactory
#2 - c4-judge
2023-08-12T20:37:34Z
alcueca marked the issue as partial-50
#3 - c4-judge
2023-08-21T21:35:22Z
alcueca changed the severity to 2 (Med Risk)