57800 sc medium signature replay vulnerability in belongcheckin distributepromoterpayments

  • Submitted on: Oct 28th 2025 at 23:24:36 UTC by @Josh4324 for Audit Comp | Belongarrow-up-right

  • Report ID: #57800

  • Report Type: Smart Contract

  • Report severity: Medium

  • Target: https://github.com/immunefi-team/audit-comp-belong/blob/main/contracts/v2/platform/BelongCheckIn.sol

  • Impacts: Theft of unclaimed yield

Description

Brief/Intro

The distributePromoterPayments function in the BelongCheckIn contract is vulnerable to a signature replay attack. A promoter can reuse a previously valid signature to claim payouts multiple times if their credit balance is replenished or they have surplus.

The signature is generated over a fixed payload (promoter address, venue address, amountInUSD, and chainId) and lacks unique identifiers like nonces or timestamps to prevent reuse. This allows a promoter with sufficient credits to "replay" an old signature for the same amountInUSD, effectively getting paid multiple times for the same signed intent without requiring new authorization.

The issue leads to unauthorized over-payments.

Vulnerability Details

The contract verifies a signature over:

  • promoter

  • venue

  • amountInUSD

  • chainId

Example verifier excerpt:

Excerpt of the vulnerable payout flow:

Because the signed payload does not include any nonce, timestamp, or any data tying the signature to a specific balance state (e.g., cumulative withdrawn amount), a promoter can reuse the same signed message later whenever their token balance is again >= amountInUSD. The contract only checks that the current token balance is sufficient and then burns tokens, so replaying the signature after replenishing tokens enables multiple payouts for the same signed intent.

Impact Details

  • Promoters can over-claim, draining the venue escrow balance.

  • Other promoters may be unable to claim due to depleted escrow funds.

circle-exclamation

References

  • https://github.com/immunefi-team/audit-comp-belong/blob/main/contracts/v2/platform/BelongCheckIn.sol#L516

  • https://github.com/immunefi-team/audit-comp-belong/blob/main/contracts/v2/utils/SignatureVerifier.sol#L204

Proof of Concept

Steps to reproduce:

1

Copy the included test into file.test.ts in test/v2/platform.

2

Run:

yarn test test/v2/platform/file.test.ts

PoC test (full file):

Result observed when running the test:

Suggested Mitigations (not exhaustive)

  • Include a nonce, unique identifier, or timestamp in the signed payload and track used nonces (e.g., mapping of signer => nonce => used) so signatures cannot be replayed.

  • Alternatively, include cumulative withdrawn amount or a per-promoter incremental counter in the signed message and update/check it during distribution.

  • Require the signer to sign the specific promoter token balance or a unique claim ID that is burned/marked when used.

(Do not implement changes in this report — the above suggestions are general mitigations derived from the issue description.)


Was this helpful?