Summary
The onlyRegisteredEngine
modifier allows a previously registered engine to continue executing functions even after deregistration, leading to unauthorized access.
Vulnerability Details
modifier onlyRegisteredEngine(uint128 marketId) {
MarketMakingEngineConfiguration.Data storage marketMakingEngineConfiguration =
MarketMakingEngineConfiguration.load();
if (!marketMakingEngineConfiguration.isRegisteredEngine[msg.sender]) {
revert Errors.Unauthorized(msg.sender);
}
Market.Data storage market = Market.load(marketId);
if (market.engine != msg.sender) {
revert Errors.Unauthorized(msg.sender);
}
_;
}
Assume an engine 0xABC
is initially registered but later deregistered:
market.engine = 0xABC
(engine 0xABC
owns a market).
isRegisteredEngine[0xABC] = false
(engine is deregistered).
0xABC
can still call onlyRegisteredEngine
protected functions because market.engine == 0xABC
.
PoC
pragma solidity ^0.8.25;
import "forge-std/Test.sol";
import "../src/EngineAccessControl.sol";
import "../src/MarketMakingEngineConfiguration.sol";
contract UnauthorizedEngineExecutionBypassTest is Test {
EngineAccessControl engineAccessControl;
MarketMakingEngineConfiguration marketMakingEngineConfiguration;
address unauthorizedEngine = address(0xABC);
uint128 marketId = 1;
function setUp() public {
engineAccessControl = new EngineAccessControl();
marketMakingEngineConfiguration = MarketMakingEngineConfiguration(engineAccessControl);
marketMakingEngineConfiguration.isRegisteredEngine[unauthorizedEngine] = true;
Market.Data storage market = Market.load(marketId);
market.engine = unauthorizedEngine;
}
function testUnauthorizedEngineExecution() public {
marketMakingEngineConfiguration.isRegisteredEngine[unauthorizedEngine] = false;
vm.prank(unauthorizedEngine);
vm.expectRevert(Errors.Unauthorized.selector);
engineAccessControl.someProtectedFunction(marketId);
}
}
Impact
A deregistered engine can continue executing privileged functions, potentially manipulating markets.
Tools Used
Manual review.
Recommendations
Add an explicit check for active registration:
if (!marketMakingEngineConfiguration.isRegisteredEngine[market.engine]) {
revert Errors.Unauthorized(market.engine);
}