Tadle

Tadle
DeFiFoundry
27,750 USDC
View results
Submission Details
Severity: high
Valid

updateReferrerInfo function in SystemConfig contract uses self address as referrer, so referral bonus can be applied incorrectly.

Summary

Referral bonus feature is important in this protocol, but referral info is implemented incorrectly.

Vulnerability Details

Let's see the code Snippet in updatereferralInfo function related to updaing referral info:

https://github.com/Cyfrin/2024-08-tadle/blob/main/src/core/SystemConfig.sol#L69-L72

function updateReferrerInfo(
address _referrer,
uint256 _referrerRate,
uint256 _authorityRate
) external {
if (_msgSender() == _referrer) {
revert InvalidReferrer(_referrer);
}
__SNIP__
@> ReferralInfo storage referralInfo = referralInfoMap[_referrer];
referralInfo.referrer = _referrer;
referralInfo.referrerRate = _referrerRate;
referralInfo.authorityRate = _authorityRate;
__SNIP__
}
function getReferralInfo(
address _referrer
) external view returns (ReferralInfo memory) {
return referralInfoMap[_referrer];
}

As we can see in above code snippet, _referrer is not msg.sender, so user can set referral info of other users.

However, `createTaker` function in PerMarkets contract refer to his referral info.

https://github.com/Cyfrin/2024-08-tadle/blob/main/src/core/PreMarkets.sol#L199-L201

ReferralInfo memory referralInfo = systemConfig.getReferralInfo(
_msgSender()
);

It means updateReferralInfo should allow users to allow their own referral info.

Impact

Referral mechanism will not be working correctly, it breaks correct protocol behavior.

Tools Used

Manual review.

Recommendations

function updateReferrerInfo(
address _referrer,
uint256 _referrerRate,
uint256 _authorityRate
) external {
if (_msgSender() == _referrer) {
revert InvalidReferrer(_referrer);
}
__SNIP__
- ReferralInfo storage referralInfo = referralInfoMap[_referrer];
+ ReferralInfo storage referralInfo = referralInfoMap[_msgSender()];
referralInfo.referrer = _referrer;
referralInfo.referrerRate = _referrerRate;
referralInfo.authorityRate = _authorityRate;
__SNIP__
}
Updates

Lead Judging Commences

0xnevi Lead Judge about 1 year ago
Submission Judgement Published
Validated
Assigned finding tags:

finding-SystemConfig-updateReferrerInfo-msgSender

Valid high severity. There are two impacts here due to the wrong setting of the `refferalInfoMap` mapping. 1. Wrong refferal info is always set, so the refferal will always be delegated to the refferer address instead of the caller 2. Anybody can arbitrarily change the referrer and referrer rate of any user, resulting in gaming of the refferal system I prefer #1500 description the most, be cause it seems to be the only issue although without a poc to fully describe all of the possible impacts

Support

FAQs

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