BBB Day4 F team Masaru ## [H-3] 借り手が自分の貸し手となって資金を奪うことができる ### ■ カテゴリー reentrancy ### ■ 条件 借り手は、createLoan() でローンを作成します。 同じ借り手がlend()を呼び出し、自分自身のローンに資金を供給します。借り手はlendチケットを受け取り、資金は自分自身に転送されます。 新しい貸し手が、ローンを買い取ろうとします。元の融資額+経過利息が、元の貸し手(借り手と同じ人)に送られます。 ### ■ ハッキングの詳細 CEIパターンがないため、借り手は、貸し出しチケットが新しい貸し手に転送される前に、直ちにrepayAndCloseLoan()を呼び出すことができる。 ### ■ 修正方法 OpenZepperinのreentrancyGuardを使用する ## [M-5] `closeLoan`ではなく、`repayAndCloseLoan`をcallすると、借り手は資金を失う。 ### ■ カテゴリー ERC20 safeTransfer ### ■ 条件 closeLoanではなく、repayAndCloseLoanが呼ばれる(なぜ?) ### ■ ハッキングの詳細 `ERC20(loan.loanAssetContractAddress).safeTransferFrom(msg.sender, lender, interest + loan.loanAmount)` を実行します。`interest` はタイムスタンプ 0 から蓄積された高い値、`loan.loanAmount` は `createLoan` で設定した当初希望の最小ローン額 `minLoanAmount` になります。ユーザーが承認した場合、これらの資金は失われます。 ### ■ 修正方法 ```solodity /// Before ERC20(loan.loanAssetContractAddress).safeTransferFrom(msg.sender, lender, interest + loan.loanAmount); ///After require(loan.lastAccumulatedTimestamp > 0, "loan was never matched by a lender. use closeLoan instead"); ERC20(loan.loanAssetContractAddress).safeTransferFrom(msg.sender, lender, interest + loan.loanAmount); ``` ## [M-7] mintではなくsafeMintを使う ### ■ カテゴリー ERC721 safeMint ### ■ 条件 `mintBorrowTicketTo` が ERC721 を適切に処理できない場合に問題となることがあります。 ### ■ ハッキングの詳細 mintではなくsafeMintを使うべき ### ■ 修正方法 ```solidity= ///before function mint(address to, uint256 tokenId) external override loanFacilitatorOnly { _mint(to, tokenId); } ///after function mint(address to, uint256 tokenId) external override loanFacilitatorOnly { _safeMint(to, tokenId); } ```