code4rena-2024-08-chakra-m11

[M-11] Wrong usage of transaction originator address instead of caller address

보고서

Summary

Cairo에서 브릿지 관련 이벤트를 생성할 때 msg.sender 대신 tx.origin 을 이용했다. 잘못된 데이터로 이벤트를 생성하여 브릿지 작동에 오류를 일으킬 수 있다.

Keyword

bridge, cross chain, event

Vulnerability

Cairo 컨트랙트에서 브릿지 요청할 때와 목적지에서 결과를 보낸 것을 콜백으로 수신할 때, 이벤트의 from_address 파라미터가 잘못되었다. msg.sender 대신 Cairo에서 tx.origin을 의미하는 get_tx_info().unbox().account_contract_address 를 이용하였다. account_contract_address 참고

fn send_cross_chain_msg(
    ref self: ContractState, to_chain: felt252, to_handler: u256, payload_type :u8,payload: Array<u8>,
) -> felt252 {
    ...
    self
        .emit(
            CrossChainMsg {
                cross_chain_settlement_id: cross_chain_settlement_id,
@>              from_address: get_tx_info().unbox().account_contract_address,
                from_chain: from_chain,
                to_chain: to_chain,
                from_handler: from_handler,
                to_handler: to_handler,
                payload_type: payload_type,
                payload: payload
            }
        );
    ...
}

Cairo에서 msg.sender를 이용하려면 get_caller_address() 를 호출해야 한다. get_caller_address 참고

Impact

잘못된 데이터로 이벤트를 생성하여 브릿지 작동에 오류를 일으킬 수 있다.

Mitigation

Cairo에서 msg.sender에 해당하는 get_caller_address() 를 이용한다.


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