# Attacker can abuse victim's signature for marketplace bid to buy worthless item

Credit struct lacks marketplace identifier, letting an attacker reuse a victim's signed bid on another marketplace to sell a worthless NFT.

- Payout: Contest reward
- Severity: medium
- Program: ParaSpace
- Credited: Trust
- Disclosed: 2023-04-27
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2022-11-paraspace-findings/issues/475
- Library page: https://bugbountylibrary.com/r/c4%3A2022-11-paraspace%3AM-17
- Tags: domain:web3 impact:funds-loss kind:contest platform:code4rena sev:medium tech:evm tech:solidity technique:source-review vuln:business-logic vuln:signature-replay

**Target:** ParaSpace marketplace credit-loan bid signature validation (SeaportAdapter)
**Root cause:** The Credit struct signed by the maker omits a marketplace identifier, so hashCredit is identical across marketplaces and a signature valid for one orderId can be replayed against a different marketplace/order.
**Steps:**
1. Victim maker signs a Credit struct for a bid on marketplace A with orderId X.
2. Attacker takes the same signature and submits it to a different marketplace adapter (e.g. LooksRareAdapter matchBidWithTakerAsk) with a different orderId pointing to a worthless NFT.
3. verifyCreditSignature passes because hashCredit(credit) does not bind the marketplace.
4. Victim's credit loan is used to purchase the attacker's worthless item.
**How found:** Code review of verifyCreditSignature and the Credit struct revealed no marketplace field in the signed hash, prompting the hypothesis that signatures are replayable across marketplace adapters.
**Exploitation:** Attacker reuses the victim's signed Credit struct on another marketplace adapter, supplying their own worthless NFT as takerAsk; the victim's credit loan funds the purchase, transferring value to the attacker. Currently only SeaportAdapter supports credit loans, limiting live exploitability.
**Insight:** When a signed order struct is verified, check whether every context binding (marketplace, chain, adapter, orderId) is included in the hashed struct; missing domain fields enable cross-context signature replay.
