code4rena-2023-11-party-dao-m03
[M-03] PartyGovernanceNFT advertises but does not honor the ERC-4906 standard
Summary
ERC4906를 지원한다고 주장하지만 메타데이터가 변경되어도 이벤트를 발생시키지 않았다. 이로 인해 NFT 마켓플레이스 등에서 메타데이터가 업데이트되지 않고, 오래된 메타데이터로 인해 부풀려진 가격으로 거래될 수 있다.
Keyword
erc4906, metadata, nft
Vulnerability
- party/PartyGovernanceNFT.sol#L208
- party/PartyGovernanceNFT.sol#L236
- party/PartyGovernanceNFT.sol#L247
- party/PartyGovernanceNFT.sol#L255
supportsInterface 를 보면 ERC4906을 지원한다고 알리고 있다.
// PartyGovernance.sol:333
function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
return
interfaceId == type(IERC721Receiver).interfaceId ||
interfaceId == type(ERC1155TokenReceiverBase).interfaceId ||
// ERC4906 interface ID
@> interfaceId == 0x49064906;
}다음은 Party NFT의 메타데이터이다. 해당 NFT에 부여된 투표권의 점유율에 대한 정보를 포함한다.
// PartyNFTRenderer.sol:292
string.concat(
"This membership represents ",
@> generateVotingPowerPercentage(tokenId),
"% voting power in ",
partyName,
". Head to ",
generateExternalURL(),
" to view the Party's latest activity."
);즉, ERC4906에 따른다면 NFT의 투표권의 점유율에 변화가 생겼을 때 MetadataUpdate 또는 BatchMetadataUpdate 이벤트를 발생시켜야 한다. 하지만 이에 변동을 줄 수 있는 increaseVotingPower, decreaseVotingPower, increaseTotalVotingPower, decreaseTotalVotingPower 그 어디에서도 이벤트를 발생하지 않는다.
따라서 NFT 마켓 플레이스나 블록 익스플로러 등 오프체인 플랫폼에서 오래된 메타데이터를 표시할 수 있으며, 토큰 보유자는 이 오래된 데이터를 유리하게 사용할 수 있다.
Impact
ERC4906를 지원한다고 주장하지만 제대로 구현하지 못했다. 오래된 메타데이터로 인해 NFT 마켓플레이스 등에서 부풀려진 가격으로 거래될 수 있다.
Mitigation
increaseVotingPower, decreaseVotingPower를 호출했을 때 MetadataUpdate를, increaseTotalVotingPower, decreaseTotalVotingPower 를 호출했을 때 BatchMetadataUpdate를 발생시킨다.
tags: bughunting, party dao, smart contract, solidity, erc4906, nft, severity medium