DatingDapp

First Flight #33
Beginner FriendlyFoundrySolidityNFT
100 EXP
View results
Submission Details
Severity: medium
Valid

Blocked User Can Re-register with Same Data and Address

Summary

The `blockProfile` function only burns the NFT associated with the user's address but does not prevent the user from minting a new profile with the same data or even the same address. This means a blocked user can bypass the block by simply re-minting their profile.

Vulnerability Details

### Proof of Concept (PoC):
Below is a test case demonstrating how a blocked user can currently re-register, exploiting the lack of a blocking mechanism:
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "forge-std/Test.sol";
import "../src/SoulboundProfileNFT.sol";
contract SoulboundProfileNFTExploitTest is Test {
SoulboundProfileNFT soulboundNFT;
address owner = address(this);
address user = address(0x123);
function setUp() public {
soulboundNFT = new SoulboundProfileNFT();
}
function testBlockedUserCanReregister() public {
// Mint a profile for the user
vm.prank(user);
soulboundNFT.mintProfile("TestUser", 25, "ipfs://test");
// Block the user
soulboundNFT.blockProfile(user);
// Verify the profile is burned
assertEq(soulboundNFT.profileToToken(user), 0, "Profile should be burned");
// Attempt to re-register with the same data
vm.prank(user);
soulboundNFT.mintProfile("TestUser", 25, "ipfs://test");
// Check if the user can re-register (which should fail in a secure system)
assertEq(soulboundNFT.profileToToken(user) != 0, true, "Blocked user should not be able to re-register");
}
}
```
PoC Explanation:
The test mints a profile for a user, then blocks them using blockProfile.
After blocking, it verifies that the profile is indeed burned.
However, the user can then re-mint a profile with the same data, demonstrating the vulnerability.
In a secure system, the second minting should fail due to the user being blocked, which is not the case here.

Impact

Allows banned or problematic users to return to the platform, potentially continuing harmful or unwanted behavior.
Undermines the effectiveness of any moderation or user-blocking mechanisms in place.
Could lead to a negative user experience for others if the same malicious actors or spammers return repeatedly.

Tools Used

Manual review and Foundry

Recommendations

Implement a permanent or temporary blacklist of addresses that are blocked:
Add a `mapping(address => bool)` named `blockedAddresses` where setting an address to true indicates it's blocked.
Before minting in the mintProfile function, check if `blockedAddresses[msg.sender]` is `false`. If it's `true`, revert with an appropriate message.
Here's how you might modify the contracts:
```solidity
mapping(address => bool) public blockedAddresses;
function blockProfile(address blockAddress) external onlyOwner {
uint256 tokenId = profileToToken[blockAddress];
require(tokenId != 0, "No profile found");
_burn(tokenId);
delete profileToToken[blockAddress];
delete _profiles[tokenId];
blockedAddresses[blockAddress] = true; // Block the address
emit ProfileBurned(blockAddress, tokenId);
}
function mintProfile(string memory name, uint8 age, string memory profileImage) external {
require(profileToToken[msg.sender] == 0, "Profile already exists");
require(!blockedAddresses[msg.sender], "You are blocked from creating a new profile");
// ... rest of the minting logic
}
```
Consider adding an event for when an address is blocked to allow for off-chain monitoring and notification.
Updates

Appeal created

n0kto Lead Judge 6 months ago
Submission Judgement Published
Validated
Assigned finding tags:

finding_blocked_user_can_recreate_a_profil

Likelihood: Low, any blocked users. Impact: High, not really blocked.

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.