code4rena-2024-08-chakra-h01
[H-01] Invalid token address used in ChakraSettlementHandler::cross_chain_erc20_settlement leading to invalid transaction creation and event emission
Summary
토큰 주소를 저장/이벤트 발생해야 하는 곳에 컨트랙트 자신의 주소를 이용한다. 이 프로토콜이 브릿지이기에 잘못된 데이터 저장과 이벤트 발생은 중대한 문제이다.
Keyword
bridge, cross chain, wrong state, event
Vulnerability
- handler/contracts/ChakraSettlementHandler.sol#L160
- handler/contracts/ChakraSettlementHandler.sol#L218
ChakraSettlementHandler.cross_chain_erc20_settlement 함수는 크로스체인으로 메시지를 보내는 역할을 한다. CreatedCrossChainTx 구조체에 전송한 메시지를 저장한다. 이 때 from_token로 정의된 필드에 ChakraSettlementHandler 컨트랙트 자신의 주소를 넣는다.
또한 크로스체인에게 메시지를 보내기 위해 CrossChainLocked 이벤트를 발생한다. 이 때 from_token 로 정의된 필드에 컨트랙트 자신의 주소를 넣는다.
function cross_chain_erc20_settlement(
string memory to_chain,
uint256 to_handler,
uint256 to_token,
uint256 to,
uint256 amount
) external {
...
{
// Save the cross chain tx
create_cross_txs[txid] = CreatedCrossChainTx(
txid,
chain,
to_chain,
msg.sender,
to,
@> address(this),
to_token,
amount,
CrossChainTxStatus.Pending
);
}
...
emit CrossChainLocked(
txid,
msg.sender,
to,
chain,
to_chain,
@> address(this),
to_token,
amount,
mode
);
}
struct CreatedCrossChainTx {
uint256 txid;
string from_chain;
string to_chain;
address from;
uint256 to;
@> address from_token;
uint256 to_token;
uint256 amount;
CrossChainTxStatus status;
}
event CrossChainLocked(
uint256 indexed txid,
address indexed from,
uint256 indexed to,
string from_chain,
string to_chain,
@> address from_token,
uint256 to_token,
uint256 amount,
SettlementMode mode
);동일한 로직의 Cairo 구현을 보면 from_token 필드에는 토큰의 주소를 넣는 것을 확인할 수 있다. 따라서 Solidity 구현쪽이 틀렸다는 것을 명확히 알 수 있다.
Impact
이 프로토콜은 브릿지이므로 오프체인에서 이벤트를 보고 상호작용해야 한다. 따라서 잘못된 데이터로 이벤트를 발생하거나 잘못된 데이터를 저장하는 일은 크리티컬하다.
Mitigation
컨트랙트 주소가 아니라 토큰 주소를 입력한다.
tags: bughunting, chakra, smart contract, starknet, solidity, bridge, cross chain, severity high, wrong state, solidity event