57123 sc low incorrect 2 step ownership in alchemistcurator

Submitted on Oct 23rd 2025 at 17:21:45 UTC by @JoeMama for Audit Comp | Alchemix V3arrow-up-right

  • Report ID: #57123

  • Report Type: Smart Contract

  • Report severity: Low

  • Target: https://github.com/alchemix-finance/v3-poc/blob/immunefi_audit/src/AlchemistCurator.sol

  • Impacts:

    • Contract fails to deliver promised returns, but doesn't lose value

Description

Brief/Intro

The current implementation of acceptAdminOwnership() allows any current admin to accept ownership on behalf of the pendingAdmin, instead of requiring the pending admin to explicitly accept it.

This defeats the purpose of the two-step ownership transfer, which is meant to prevent wrong address ownership transfers. The acceptance should come only from the pending admin.

Vulnerability Details

    function transferAdminOwnerShip(address _newAdmin) external onlyAdmin {
        pendingAdmin = _newAdmin;
    }

    function acceptAdminOwnership() external onlyAdmin {
        admin = pendingAdmin;
        pendingAdmin = address(0);
        emit AdminChanged(admin);
    }

Impact Details

The acceptAdminOwnership function is meant to verify that the new admin address actually exists. However, since the new admin must now call acceptAdminOwnership to complete the transfer, there’s a risk that the specified address doesn’t exist or isn’t accessible. If ownership is transferred to such an address, the curator contracts would become unusable because no one would be able to operate them.

Recommendation:

Update the function to require that only the pending admin can call it:

Proof of Concept

Proof of Concept

Please add these 2 test to the existing AlchemistCuratorTest.

Was this helpful?