The CharityRegistry contract lacks functionality to deregister or unverify charities, making it impossible to remove malicious or compromised charities from the system. Once registered, a charity remains permanently eligible to receive donations.
The vulnerability exists in the CharityRegistry.sol contract.
Key issues:
No function to remove a charity's registration
No function to revoke a charity's verification status
No way to blacklist compromised addresses
Permanent verification status even if charity is compromised
Several scenarios where this becomes critical:
A charity's private keys are compromised
A charity is found to be fraudulent after verification
A charity's smart contract is exploited
Legal requirements mandate the removal of a charity
A charity closes operations but their address remains verified
Severity: High
Likelihood: Medium (requires charity compromise or admin verification mistake)
Effects:
Compromised charities remain permanently in the system
No way to stop donations to malicious actors
Reduced trust in platform security
Potential loss of donor funds to compromised charities
Reputational damage to platform if compromised charity misuses funds
No compliance mechanism if legal removal is required
Manual code review
Add deregistration and unverification functionality:
Additionally, consider:
Adding a blacklist mechanism for known malicious addresses
Implementing a time-lock for charity verification changes
Adding multi-signature requirements for verification actions
Creating an emergency pause function for specific charities
Implementing a charity status history log
Example of blacklist implementation:
Likelyhood: Low/Medium, charities can process an upgrade including a new unverified codebase. Impact: High, a charity can upgrade with bad function and bypass the verification process
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.