56867 sc medium signature collision caused counterfeit accesstoken collections with arbitrary name symbol uri

Submitted on Oct 21st 2025 at 11:16:06 UTC by @zzkiel for Audit Comp | Belongarrow-up-right

  • Report ID: #56867

  • Report Type: Smart Contract

  • Report severity: Medium

  • Target: https://github.com/belongnet/checkin-contracts/blob/main/contracts/v2/utils/SignatureVerifier.sol

  • Impacts:

    • Unintended alteration of what the NFT represents (e.g. token URI, payload, artistic content)

Description

Intro

Factory’s signature checks for both AccessToken and CreditToken use abi.encodePacked on multiple user-controlled strings. Because concatenation lacks explicit boundaries, different (name, symbol, contractURI, …) payloads can collide to the same byte stream. An attacker who obtains one legitimate backend signature can rearrange characters, reuse the signature, and deploy an unauthorized collection. This bypasses the intended access control on Factory.produce and Factory.produceCreditToken.

Impact Details

  • Deploy counterfeit AccessToken collections with arbitrary name/symbol/URI and potentially altered royalty settings using a previously issued signature.

  • Deploy CreditToken clones with unapproved metadata from the same signature.

  • Trust assumptions on signed payloads are broken; external metadata/fee governance can be subverted.

References

Add any relevant links to documentation or code

Proof of Concept

Proof of Concept (exploit test)

Reproduction

1

Exploit test artifact

  • Path: test/v2/platform/signature-collision.test.ts

  • What it does:

    • Deploys the Factory stack locally (no fork/PK required).

    • Signs a legitimate (name="Bel", symbol="ong") payload.

    • Reuses the same signature to deploy a forged collection (name="Belon", symbol="g").

    • Prints the forged collection address and asserts the metadata matches the forged values.

Running the exploit test

Output confirms the forged deployment:

Was this helpful?