Normal behavior:
When a token is created or transferred, the ownership should be updated on the actual ledger/object layer. Any statistics stored in the RapperStats resource (such as stats and owner_counts) should always reflect the real ownership of tokens on-chain.
Issue:
The transfer_record_only(token_id, from, to) function modifies only the internal ownership records in RapperStats (i.e. updates s.owner and owner_counts) without verifying or enforcing that the actual token transfer has occurred at the Aptos object/ledger level. This can lead to inconsistent states where the RapperStats module reports different ownership or balances from the real on-chain state.
Likelihood:
This issue will occur whenever a friend module calls transfer_record_only without actually transferring the token at the ledger level — the function itself does not enforce the transfer.
Because owner_counts duplicates data from stats, any missed update or unsynchronized call will directly cause inconsistent state.
Impact:
Inconsistent or incorrect balances (balance_of) may be reported and used for rewards, rankings, or permissions based on ownership, resulting in unauthorized benefits.
An attacker with access to a friend module could deliberately alter RapperStats to fake token ownership or inflate their balances without performing real transfers on-chain.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.