위험도 (Severity) | 개수 | 예시 |
---|---|---|
🔴 Critical | 19개 | Flash loan 재진입 (DeFi Saver), commit 덮어쓰기 (Fei), 주문 취소 무효 (MCDEX) 등 |
🟠 High | 42개 | 불충분한 입력검증, 프론트런, 관리 권한 오남용, 잘못된 수학 계산 등 |
🟡 Medium | 38개 | unchecked return, 잘못된 decimals, ERC20 비표준, 초기화 누락 등 |
🔵 Low / Informational | 2개 | 문서 불일치, 이벤트 누락 등 |
위험도 : Medium
프로젝트 : Aave V2
발생 위치 : token.transfer(…), token.transferFrom(…) 호출부 전반
왜 발생했는가 :
일부 ERC20 토큰 구현체는 실패 시 revert 하지 않고 false를 반환. 이러한 반환값을 확인하지 않고 무시하면, 전송 실패 시도조차 실패로 인식하지 못하고 다음 로직이 실행됨.
취약점 발생 시 결과 :
권고사항 : require(token.transfer(…))와 같은 반환값 확인 또는 OpenZeppelin의 SafeERC20.safeTransfer 사용
관련 개념 : ERC20 표준, SafeERC20, 반환값 검사, 비표준 구현 문제
// X 취약한 코드 예시
token.transfer(user, amount); // 반환값 확인 안함
token.transferFrom(user, address(this), amount); // 실패해도 계속 실행
// V 안전한 코드
require(token.transfer(user, amount), "Trnasfer failed");
require(token.transferFrom(user, address(this), amount), "TransferFrom failed");
// 또는 SafeERC20 사용
using SafeERC20 for IERC20;
token.safeTransfer(user, amount)
token.safeTransferFrom(user, address(this), amount);
위험도 : Critical
프로젝트 : DeFi Saver
발생 위치 : _parseFLAndExecute(), executeAction()
왜 발생했는가 :
Flash loan 처리 중 DSProxy에 대한 권한을 외부 flash loan wrapper에 일시적으로 부여. 외부 호출 중 악성 계약이 executeAction()을 재호출하여 다른 작업을 삽입할 수 있음.
취약점 발생 시 결과 :
권고 사항 : ReentrancyGuard 또는 mutex를 사용하여 executeAction() 재진입 차단
관련 개념 : Flash Loan, Delegatecall, Reentrancy