code4rena-2024-08-chakra-m03

[M-03] Inconsistency in sender address when creating cross chain messages on Starknet can lead to loss of funds

보고서

Summary

이벤트로 발행하는 값과 스토리지에 저장하는 값이 불일치했다. 브릿지임을 감안하여 사안의 심각성을 인정받았다.

Keyword

bridge, cross chain, wrong state

Vulnerability

Cairo 측 컨트랙트에서 다른 체인으로 메시지를 보낼 때, 요청 정보를 CreatedCrossChainTx 구조체에 넣고 저장한다. 또한 이벤트를 발생시켜 오프체인에서 메시지를 감지할 수 있게 한다.

그런데 저장하는 데이터와 이벤트를 발생할 때 사용하는 from 데이터가 서로 불일치한다. from 필드에는 호출자의 주소가 사용되는 게 맞다. 하지만 저장되는 값에는 get_contract_address 가 사용되어 핸들러 컨트랙트의 주소가 저장되었다.

fn cross_chain_erc20_settlement(ref self: ContractState, to_chain: felt252, to_handler: u256, to_token: u256, to: u256, amount: u256) -> felt252{
    ...
    let tx: CreatedCrossChainTx = CreatedCrossChainTx{
            tx_id: tx_id,
            from_chain: from_chain,
            to_chain: to_chain,
@>          from: get_contract_address(),
            to: to,
            from_token: self.token_address.read(),
            to_token: to_token,
            amount: amount,
            tx_status: CrossChainTxStatus::PENDING
        };
    self.created_tx.write(tx_id, tx);
 
    ...
    self.emit(
            CrossChainLocked{
                tx_id: tx_id,
@>              from: get_caller_address(),
                to: to,
                from_chain: get_tx_info().unbox().chain_id,
                to_chain: to_chain,
                from_token: self.token_address.read(),
                to_token: to_token,
                amount: amount
            }
        );
    return tx_id;
}

Impact

잘못된 상태를 기록하여 브릿지가 잘못 작동할 수 있다.

Mitigation

    let tx: CreatedCrossChainTx = CreatedCrossChainTx{
            tx_id: tx_id,
            from_chain: from_chain,
            to_chain: to_chain,
-           from: get_contract_address(),
+           from: get_caller_address(),
            to: to,
            from_token: self.token_address.read(),
            to_token: to_token,
            amount: amount,
            tx_status: CrossChainTxStatus::PENDING
        };

Memo

에스컬레이션 기간에 Low 이슈가 아니냐고 싸웠지만, 크로스체인 브릿지임을 감안하여 Medium으로 채택되었다. 이벤트나 상태를 올바르게 저장하는 것의 중요성이 크다고 인정되었다.


tags: bughunting, chakra, smart contract, starknet, cairo, bridge, cross chain, severity medium, wrong state