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

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