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

Improper Validation Of Chainlink's latestAnswer Function #162

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

Improper Validation Of Chainlink's latestAnswer Function #162

code423n4 opened this issue Feb 2, 2022 · 2 comments
Labels
2 (Med Risk) Assets not at direct risk, but function/availability of the protocol could be impacted or leak value bug Something isn't working duplicate This issue or pull request already exists

Comments

@code423n4
Copy link
Contributor

Handle

leastwood

Vulnerability details

Impact

The latestAnswer function does not allow EIP1271Wallet._validateOrder to validate the output of the Chainlink oracle query. As a result, it is possible for off-chain orders to use stale results, potentially allowing the taker of the order to extract more value from the treasury. latestRoundData is able to ensure the round is complete and has returned a valid/expected price by validating additional round data. This is documented here.

Proof of Concept

https://github.com/code-423n4/2022-01-notional/blob/main/contracts/utils/EIP1271Wallet.sol#L175-L177

uint256 oraclePrice = _toUint(
    AggregatorV2V3Interface(priceOracle).latestAnswer()
);

Tools Used

Manual code review.
Chainlink best practices.

Recommended Mitigation Steps

Consider using Chainlink's latestRoundData function instead of latestAnswer to validate the output correctly. This can be updated to match the following code snippet:

(
  uint80 roundID,
  int256 oraclePrice,
  ,
  uint256 updateTime,
  uint80 answeredInRound
) = AggregatorV2V3Interface(priceOracle).latestRoundData();
require(
  answeredInRound >= roundID,
  "Notional: Chainlink Price Stale"
);
require(oraclePrice > 0, "Notional: Chainlink Malfunction");
require(updateTime != 0, "Notional: Incomplete round");
@code423n4 code423n4 added 2 (Med Risk) Assets not at direct risk, but function/availability of the protocol could be impacted or leak value bug Something isn't working labels Feb 2, 2022
code423n4 added a commit that referenced this issue Feb 2, 2022
@jeffywu jeffywu added the duplicate This issue or pull request already exists label Feb 6, 2022
@jeffywu
Copy link
Collaborator

jeffywu commented Feb 6, 2022

Duplicate #178

@pauliax
Copy link
Collaborator

pauliax commented Feb 12, 2022

A duplicate of #197

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2 (Med Risk) Assets not at direct risk, but function/availability of the protocol could be impacted or leak value bug Something isn't working duplicate This issue or pull request already exists
Projects
None yet
Development

No branches or pull requests

4 participants