code4rena-2024-08-chakra-h01

[H-01] Invalid token address used in ChakraSettlementHandler::cross_chain_erc20_settlement leading to invalid transaction creation and event emission

보고서

Summary

토큰 주소를 저장/이벤트 발생해야 하는 곳에 컨트랙트 자신의 주소를 이용한다. 이 프로토콜이 브릿지이기에 잘못된 데이터 저장과 이벤트 발생은 중대한 문제이다.

Keyword

bridge, cross chain, wrong state, event

Vulnerability

ChakraSettlementHandler.cross_chain_erc20_settlement 함수는 크로스체인으로 메시지를 보내는 역할을 한다. CreatedCrossChainTx 구조체에 전송한 메시지를 저장한다. 이 때 from_token로 정의된 필드에 ChakraSettlementHandler 컨트랙트 자신의 주소를 넣는다.

또한 크로스체인에게 메시지를 보내기 위해 CrossChainLocked 이벤트를 발생한다. 이 때 from_token 로 정의된 필드에 컨트랙트 자신의 주소를 넣는다.

function cross_chain_erc20_settlement(
    string memory to_chain,
    uint256 to_handler,
    uint256 to_token,
    uint256 to,
    uint256 amount
) external {
    ...
    {
        // Save the cross chain tx
        create_cross_txs[txid] = CreatedCrossChainTx(
            txid,
            chain,
            to_chain,
            msg.sender,
            to,
@>          address(this),
            to_token,
            amount,
            CrossChainTxStatus.Pending
        );
    }
    ...
 
    emit CrossChainLocked(
        txid,
        msg.sender,
        to,
        chain,
        to_chain,
@>      address(this),
        to_token,
        amount,
        mode
    );
}
 
struct CreatedCrossChainTx {
    uint256 txid;
    string from_chain;
    string to_chain;
    address from;
    uint256 to;
@>  address from_token;
    uint256 to_token;
    uint256 amount;
    CrossChainTxStatus status;
}
 
event CrossChainLocked(
    uint256 indexed txid,
    address indexed from,
    uint256 indexed to,
    string from_chain,
    string to_chain,
@>  address from_token,
    uint256 to_token,
    uint256 amount,
    SettlementMode mode
);

동일한 로직의 Cairo 구현을 보면 from_token 필드에는 토큰의 주소를 넣는 것을 확인할 수 있다. 따라서 Solidity 구현쪽이 틀렸다는 것을 명확히 알 수 있다.

Impact

이 프로토콜은 브릿지이므로 오프체인에서 이벤트를 보고 상호작용해야 한다. 따라서 잘못된 데이터로 이벤트를 발생하거나 잘못된 데이터를 저장하는 일은 크리티컬하다.

Mitigation

컨트랙트 주소가 아니라 토큰 주소를 입력한다.


tags: bughunting, chakra, smart contract, starknet, solidity, bridge, cross chain, severity high, wrong state, solidity event