code4rena-2024-08-chakra-m08
[M-08] The receive_cross_chain_msg function has potential replay attack risks
Summary
핸들러가 처리했던 크로스 체인 메시지 ID를 기록하거나 확인하지 않고, Settlement의 확인에 의존했다. 핸들러는 새로운 Settlement 컨트랙트로 변경하는 기능이 있으므로 Settlement는 추후 변경될 수 있다고 볼 수 있다. 새로운 Settlement 컨트랙트에 기존에 처리했던 데이터가 이전되지 않고, 검증자를 동일하게 유지한다면 기존에 처리했던 메시지를 재전송할 수 있다. 핸들러도 자신이 처리했던 메시지인지 확인하지 않으므로 재전송 공격이 가능하다.
Keyword
bridge, cross chain, replay attack, lack of input validation
Vulnerability
Starknet에서, 핸들러에 등록된 Settlement 컨트랙트 주소는 변경 가능하다. 즉, 미래에 새로운 Settlement 컨트랙트를 배포하여 대체할 수 있다.
fn upgrade_settlement(ref self:ContractState, new_settlement: ContractAddress){
self.ownable.assert_only_owner();
self.settlement_address.write(new_settlement);
}Settlement 컨트랙트가 검증자 변경 없이 변경될 경우(새로운 Settlement 컨트랙트를 배포하지만 기존 검증자를 그대로 이용), 기존 Settlement 계약에서 실행된 메시지는 새로운 Settlement 컨트랙트에는 기록되지 않았을 것이다(새로운 컨트랙트이므로). 핸들러에서는 수신하고 처리했던 크로스 체인 메시지 ID를 저장하지 않으므로 핸들러에도 해당 메시지 처리 기록이 없다.
공격자는 이전 Settlement 컨트랙트에서 실행했던 메시지를 새로운 Settlement 컨트랙트에서 재전송할 수 있다. 핸들러 역시 메시지 처리 여부를 확인하지 않기 때문에 재전송이 가능하다.
Impact
브릿지에 재전송 공격을 하여 토큰을 탈취할 수 있다.
Mitigation
핸들러에서 처리했던 메시지 id를 저장해 Settlement 컨트랙트에 의존하지 않고 독립적으로 확인한다.
tags: bughunting, chakra, smart contract, starknet, cairo, bridge, cross chain, severity medium, solo issue, replay attack, lack-of-input-validation-vul