code4rena-2024-08-chakra-h08

[H-08] In settlement.cairo::receive_cross_chain_msg - the payload_type can be passed by the user, confusing offchain systems

보고서

Summary

서명을 통해 검증하지 않은 파라미터를 사용하여 이벤트를 발행한다. 원래는 payload 에 포함되는 값이지만, 호출자에게서 따로 파라미터로 입력 받아 사용하였다.

Keyword

lack of input validation, event, bridge, cross chain

Vulnerability

서명을 통해 검증하지 않은 파라미터 payload_type 을 사용하여 이벤트를 발행한다. 원래는 payload 에 포함되는 값이지만, 호출자에게서 따로 파라미터로 입력 받아 사용하였다. 이로 인해 payload 에 정한 것과는 다른 값이 payload_type으로 사용될 수 있다.

fn receive_cross_chain_msg(
    ref self: ContractState,
    cross_chain_msg_id: u256,
    from_chain: felt252,
    to_chain: felt252,
    from_handler: u256,
    to_handler: ContractAddress,
    sign_type: u8,
    signatures: Array<(felt252, felt252, bool)>,
    payload: Array<u8>,
@>  payload_type: u8,
) -> bool {
    assert(to_chain == self.chain_name.read(), 'error to_chain');
 
    // verify signatures
@>  let mut message_hash: felt252 = LegacyHash::hash(from_chain, (cross_chain_msg_id, to_chain, from_handler, to_handler));
    let payload_span = payload.span();
    let mut i = 0;
    loop {
        if i > payload_span.len()-1{
            break;
        }
        message_hash = LegacyHash::hash(message_hash, * payload_span.at(i));
        i += 1;
    };
    self.check_chakra_signatures(message_hash, signatures);
 
    ...
 
    // emit event
    self.emit(CrossChainHandleResult{
        cross_chain_settlement_id: cross_chain_msg_id,
        from_chain: to_chain,
        from_handler: to_handler,
        to_chain: from_chain,
        to_handler: from_handler,
        cross_chain_msg_status: status,
@>      payload_type: payload_type
    });
    return true;
}

이 파라미터는 오로지 이벤트틑 발행하는 데만 사용된다. 이 프로토콜이 브릿지이기에 이벤트는 중요하게 이용된다. 스폰서는 이 값이 익스플로러에 표시되며 추후 다른 기능이 추가될 것이라고 하였다.

Impact

검증되지 않은 값을 이용하여 잘못된 이벤트를 발생함.

Mitigation

payload_type 파라미터 대신 payload를 파싱한 값을 사용한다.


tags: bughunting, chakra, smart contract, starknet, cairo, bridge, cross chain, lack-of-input-validation-vul, severity high