Last updated: 2025-4-24

Initialized problems

#solidity#security

1. 缺少 _disableInitializers() 标识符

未初始化的合约可以被攻击者接管。这适用于代理及其 implementation contract,这可能会影响代理。但是影响并不会特别大,因为开发者会注意到并且重新部署一份新的合约。

solidity
contract xxx {

	constructor() {
		 _disableInitializers();
		// ...logic code
	}
	
	function initializer() public onlyRole(ADMIN_ROLE) {
		// ...logic code
	}
}

 

 

2. 重复的标记initializer()

initializer() 适用于标记合约的初始化函数,确保仅调用一次

onlyInitializing() 用于父合约的初始化函数,允许可升级合约中被调用数次

错误或重复的使用 Initializer 会导致子合约无法正确初始化,导致 revert

modifier onlyInitializing() {require(_initializing, “Contract is not initializing”) _;}

solidity
// ❌Error examples
// Father
contract Parent {
    function initialize() public 
initializer 
{
	    Child.initialize(); // revert
    }
}

// Children
contract Child is Parent {
    function initialize() public 
initializer 
{
    }
}
solidity
// ✔correct examples
// Father
contract Parent {
    function initialize() public 
initializer 
{
	    Child.initialize();
    }
}

// Children
contract Child is Parent {
    function initialize() public 
onlyInitializing 
{
    }
}

 

 

3. 可升级合约中继承同样需要实现正确的可升级处理

帮助合约在未来免受底层库潜在变化的影响

如果合约继承了 OwnableUpgradeable、ReetrancyGuardUpgradeable、PausableUpgradeable等库,那么初始化中需要对这些继承做处理

solidity
function initialize() public initializer {
    __Ownable_init();
    __Pausable_init();
}