Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The Contract Should Approve(0) first #153

Closed
code423n4 opened this issue Feb 2, 2022 · 2 comments
Closed

The Contract Should Approve(0) first #153

code423n4 opened this issue Feb 2, 2022 · 2 comments
Labels
bug Something isn't working invalid This doesn't seem right sponsor acknowledged Technically the issue is correct, but we're not going to resolve it for XYZ reasons

Comments

@code423n4
Copy link
Contributor

Handle

defsec

Vulnerability details

Impact

Some tokens (like USDT L199) do not work when changing the allowance from an existing non-zero allowance value.
They must first be approved by zero and then the actual allowance must be approved.

IERC20(token).approve(address(operator), 0);
IERC20(token).approve(address(operator), amount);

Proof of Concept

  1. Navigate to the following contracts.
https://github.com/code-423n4/2022-01-notional/blob/main/contracts/TreasuryManager.sol#L79
  1. When trying to re-approve an already approved token, all transactions revert and the protocol cannot be used.

Tools Used

None

Recommended Mitigation Steps

Approve with a zero amount first before setting the actual amount.

@code423n4 code423n4 added 1 (Low Risk) Assets are not at risk. State handling, function incorrect as to spec, issues with comments bug Something isn't working labels Feb 2, 2022
code423n4 added a commit that referenced this issue Feb 2, 2022
@jeffywu jeffywu added sponsor acknowledged Technically the issue is correct, but we're not going to resolve it for XYZ reasons duplicate This issue or pull request already exists and removed sponsor acknowledged Technically the issue is correct, but we're not going to resolve it for XYZ reasons labels Feb 6, 2022
@jeffywu jeffywu added the sponsor disputed Sponsor cannot duplicate the issue, or otherwise disagrees this is an issue label Feb 6, 2022
@jeffywu
Copy link
Collaborator

jeffywu commented Feb 6, 2022

We do not support USDT so we are not affected by this issue.

@jeffywu jeffywu added sponsor acknowledged Technically the issue is correct, but we're not going to resolve it for XYZ reasons and removed sponsor disputed Sponsor cannot duplicate the issue, or otherwise disagrees this is an issue labels Feb 8, 2022
@CloudEllie CloudEllie removed the duplicate This issue or pull request already exists label Feb 8, 2022
@pauliax
Copy link
Collaborator

pauliax commented Feb 12, 2022

Even if such tokens were supported, I do not think this is an issue, because the approve function is external and callable by the owner, so an owner can explicitly make 2 calls if necessary specifying a 0 amount in the first one.

    function approveToken(address token, uint256 amount) external onlyOwner {
        IERC20(token).approve(ASSET_PROXY, amount);
    }

@pauliax pauliax closed this as completed Feb 12, 2022
@pauliax pauliax added invalid This doesn't seem right and removed 1 (Low Risk) Assets are not at risk. State handling, function incorrect as to spec, issues with comments labels Feb 12, 2022
weitianjie2000 added a commit to notional-finance/staked-note that referenced this issue Feb 15, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working invalid This doesn't seem right sponsor acknowledged Technically the issue is correct, but we're not going to resolve it for XYZ reasons
Projects
None yet
Development

No branches or pull requests

4 participants