← Back to Blog

Solidity 취약점 TOP 5와 자동 탐지 방법

2026-03-29 솔리디티 취약점 보안 접근제어 오라클 플래시론

English summary: This post covers the top 5 Solidity vulnerability classes responsible for the vast majority of DeFi exploits: access control flaws, integer overflow/underflow, oracle manipulation, flash loan attacks, and front-running. Each section includes vulnerable code, the attack vector, safe implementation, and how automated scanners detect it.


들어가며: 왜 같은 취약점이 반복되는가

블록체인 보안 연구소 Chainalysis에 따르면 2023년 DeFi 해킹의 73%는 이미 알려진 취약점 패턴에서 발생했습니다. 새로운 공격 벡터보다, 알고 있음에도 예방하지 못한 사례가 훨씬 많습니다.


1. 접근 제어 취약점 (Access Control)

피해 사례: 2022년 Ronin Bridge (6.25억 달러) — 검증자 개인 키 노출

// ⚠️ 취약: onlyOwner 없음
contract VulnerableToken {
    mapping(address => uint256) public balances;

    // 누구나 호출 가능 — 무한 민팅 가능
    function mint(address to, uint256 amount) external {
        balances[to] += amount;
    }
}
// ✅ 안전: 접근 제어 추가
import "@openzeppelin/contracts/access/Ownable.sol";

contract SecureToken is Ownable {
    mapping(address => uint256) public balances;

    function mint(address to, uint256 amount) external onlyOwner {
        balances[to] += amount;
    }
}

탐지 방법: Slither의 suicidal, unprotected-ether-withdrawal 탐지기가 권한 없는 위험 함수를 플래그합니다.


2. 정수 오버플로우/언더플로우

피해 사례: 2018년 BatchOverflow (BEC Token) — 수조 개 토큰 불법 생성

// ⚠️ Solidity 0.7.x 이하 — 오버플로우 발생
contract OldToken {
    mapping(address => uint8) public balances;

    function transfer(address to, uint8 amount) external {
        // uint8 max = 255. balances[msg.sender] = 5, amount = 250
        // 5 - 250 = 오버플로우 → 11 (wraparound)
        balances[msg.sender] -= amount;
        balances[to] += amount;
    }
}
// ✅ Solidity 0.8.0+: 자동 오버플로우 체크
// 또는 OpenZeppelin SafeMath (0.7.x 이하용)
contract NewToken {
    mapping(address => uint256) public balances;

    function transfer(address to, uint256 amount) external {
        // 0.8.0+는 오버플로우 시 자동 revert
        balances[msg.sender] -= amount;
        balances[to] += amount;
    }
}

핵심: Solidity 0.8.0 이상을 사용하거나, unchecked 블록 사용 시 수동 검증이 필수입니다.


3. 가격 오라클 조작 (Price Oracle Manipulation)

피해 사례: 2020년 Harvest Finance (3,400만 달러), 2020년 bZx (100만 달러)

온체인 오라클(Uniswap spot price 등)은 단일 트랜잭션 내에서 조작 가능합니다.

// ⚠️ 취약: 현재 블록의 spot price 직접 사용
contract VulnerableLending {
    IUniswapV2Pair public pair;

    function getCollateralPrice() public view returns (uint256) {
        (uint112 reserve0, uint112 reserve1,) = pair.getReserves();
        // 플래시론으로 reserve를 조작하면 가격 왜곡됨
        return reserve1 * 1e18 / reserve0;
    }
}
// ✅ 안전: Chainlink TWAP (시간 가중 평균 가격) 사용
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract SecureLending {
    AggregatorV3Interface internal priceFeed;

    function getCollateralPrice() public view returns (uint256) {
        (, int256 price,, uint256 updatedAt,) = priceFeed.latestRoundData();
        require(block.timestamp - updatedAt < 1 hours, "Stale price");
        return uint256(price);
    }
}

4. 플래시 론 공격 (Flash Loan Attacks)

피해 사례: 2021년 PancakeBunny (4,500만 달러), 2022년 Mango Markets (1.14억 달러)

플래시 론은 담보 없이 수백만 달러를 빌려 단일 트랜잭션 내에서 상환할 수 있는 DeFi 메커니즘입니다. 취약한 프로토콜에서는 이를 이용해 가격을 조작하거나 거버넌스를 장악합니다.

공격 흐름:
1. 플래시론으로 10,000 ETH 차용
2. DEX에서 대량 매수 → 토큰 가격 폭등
3. 취약한 프로토콜의 과대평가된 가격 기준으로 담보 대출
4. 가격 폭락 전 자산 추출
5. 플래시론 상환
6. 순이익 확보

방어 전략:
- Chainlink 외부 오라클 사용 (TWAP 우선)
- 단일 블록 내 대규모 가격 변동에 회로 차단기 적용
- 거버넌스: 스냅샷 블록 이전의 투표권만 인정


5. 프론트러닝 (Front-running / MEV)

피해 사례: Uniswap 거래자들은 MEV 봇에 의해 연간 수억 달러 손실

// ⚠️ 취약: 거래 내용이 mempool에 노출됨
function buyToken(uint256 maxPrice) external payable {
    uint256 currentPrice = getTokenPrice(); // mempool에서 읽기 가능
    require(currentPrice <= maxPrice);
    _executeBuy(msg.value);
}

방어 전략:
- 슬리피지 허용 범위 명시적으로 설정
- Commit-Reveal 패턴: 먼저 의도를 암호화해 제출, 나중에 공개
- Flashbots / Private mempool 사용으로 트랜잭션 노출 방지

// ✅ Commit-Reveal 패턴
contract SecureAuction {
    mapping(bytes32 => address) public commitments;

    // 1단계: 입찰가를 해시로만 제출
    function commit(bytes32 hashedBid) external {
        commitments[hashedBid] = msg.sender;
    }

    // 2단계: 해시 공개 (타임락 이후)
    function reveal(uint256 bidAmount, bytes32 salt) external {
        bytes32 hash = keccak256(abi.encodePacked(bidAmount, salt));
        require(commitments[hash] == msg.sender);
        // 실제 입찰 처리
    }
}

자동 취약점 탐지 도구 비교

취약점 Slither Semgrep AI (ContractScan)
Access Control ✅ 높음 ✅ 높음
정수 오버플로우 ✅ 높음 ✅ 중간
Reentrancy ✅ 높음 ✅ 중간
오라클 조작 ⚠️ 낮음 ⚠️ 낮음 ✅ 문맥 분석
프론트러닝 ⚠️ 낮음 ⚠️ 낮음 ✅ 로직 이해

AI 기반 분석은 정적 분석이 놓치는 비즈니스 로직 취약점을 문맥으로 파악할 수 있습니다.

ContractScan은 Slither + Semgrep + AI 분석을 통합해 단일 리포트로 제공합니다. 무료 스캔으로 지금 바로 확인해보세요.


다음 편에서는 이 도구들의 실제 사용법을 비교합니다 — Slither, Mythril, Semgrep을 직접 설치하고 실행하는 방법, 각 도구의 강점과 한계를 상세히 다룹니다.