Omniscia Myso Finance Audit
LoanProposalFactory Manual Review Findings
LoanProposalFactory Manual Review Findings
LPF-01M: Unsanitized Funding Pool
| Type | Severity | Location |
|---|---|---|
| Input Sanitization | ![]() | LoanProposalFactory.sol:L23-L58 |
Description:
The LoanProposalFactory::createLoanProposal function accepts an arbitrary _fundingPool as an argument, permitting malicious pool implementations to underpin loan proposals.
Impact:
Depending on how created proposals are expected to be handled by the Myso Finance front-end implementations, this exhibit's severity can vary from minor to major.
As an example, if all loan proposals are listed in the Myso Finance application, it would be trivial to impersonate other funding pools and generally social engineer unsuspecting users into depositing funds in the funding pool of a lucrative loan proposal.
Example:
23function createLoanProposal(24 address _fundingPool,25 address _collToken,26 uint256 _arrangerFee,27 uint256 _unsubscribeGracePeriod,28 uint256 _conversionGracePeriod,29 uint256 _repaymentGracePeriod30) external {31 bytes32 salt = keccak256(32 abi.encodePacked(loanProposalImpl, msg.sender, loanProposals.length)33 );34 address newLoanProposal = Clones.cloneDeterministic(35 loanProposalImpl,36 salt37 );38 loanProposals.push(newLoanProposal);39 isLoanProposal[newLoanProposal] = true;40 ILoanProposalImpl(newLoanProposal).initialize(41 msg.sender,42 _fundingPool,43 _collToken,44 _arrangerFee,45 _unsubscribeGracePeriod,46 _conversionGracePeriod,47 _repaymentGracePeriod48 );49
50 emit LoanProposalCreated(51 newLoanProposal,52 _fundingPool,53 msg.sender,54 _collToken,55 _arrangerFee,56 _unsubscribeGracePeriod57 );58}Recommendation:
We advise a dedicated factory to be introduced to the codebase for funding pools via which the _fundingPool input of the LoanProposalFactory::createLoanProposal function will be validated, disallowing malicious implementations from being utilized in the creation of a loan proposal.
Alleviation (c740f7c6b5ebd365618fd2d7ea77370599e1ca11):
The LoanProposalFactory implementation has been replaced by a singleton Factory implementation that deploys both FundingPoolImpl as well as LoanProposalImpl instances.
In this implementation, the Factory::createLoanProposal function properly validates that the _fundingPool has been deployed via it thus alleviating this exhibit.
