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