Categories: 블록체인 글

블록체인 보안의 10가지 얼굴 (2부)


경제·프로토콜 레벨 공격

1부에서 다룬 취약점은 모두 코드 라인 안에 원인이 있었습니다. 재진입이든 오버플로우든, 문제가 된 함수 자체에 결함이 있었죠. 그러나 2부에서 다루는 공격들은 성격이 다릅니다. 이들은 코드가 완벽해도 성립합니다. 각 함수는 명세대로 한 치의 오차도 없이 정확히 동작하는데, 그 함수들이 놓인 경제적 환경을 공격자가 조작하기 때문입니다. 여기서는 오라클 조작(플래시론 결합)과 MEV, 두 가지를 다룹니다.


5. 오라클 조작 / 플래시론 공격

취약점 개요

스마트 컨트랙트는 온체인 데이터만 신뢰할 수 있습니다. 그런데 대출, 청산, 스테이블코인 같은 DeFi 프로토콜은 “ETH가 지금 얼마인가?” 같은 외부 가격을 반드시 알아야 합니다. 이 가격을 유동성이 얕은 단일 DEX의 현물 가격(spot price) 에서 가져오는 순간, 그 가격은 더 이상 객관적 사실이 아니라 조작 가능한 입력값이 됩니다. 유동성이 얕을수록 적은 자금으로도 가격을 크게 흔들 수 있기 때문입니다.

여기에 플래시론이 결합되면 파괴력이 극대화됩니다. 플래시론은 담보 없이 거대한 자금을 빌리되, 같은 트랜잭션 안에서 반드시 상환해야 한다는 조건이 붙은 대출입니다. 상환에 실패하면 트랜잭션 전체가 revert되어 원래 상태로 되돌아가므로, 대주(lender)는 원리금을 떼일 위험이 전혀 없습니다. 공격자 입장에서 이는 자기 자본이 거의 없이도 순간적으로 수백만 달러를 운용할 수 있다는 뜻입니다.

익스플로잇 흐름

이 모든 과정은 하나의 원자적(atomic) 트랜잭션 안에서 일어납니다.

  1. 플래시론으로 거대한 금액(예: 5천만 달러)을 담보 없이 빌린다.
  2. 유동성이 얕은 DEX에서 담보 토큰을 대량 매수한다. 이로 인해 그 토큰의 spot price가 순간적으로 급등한다.
  3. 이 조작된 가격을 오라클로 참조하는 대출 프로토콜에서, 부풀려진 담보 가치를 근거로 과도한 대출을 실행한다.
  4. 빼낸 자금의 일부로 플래시론을 상환한다.
  5. 남은 차액이 순수익이 된다. 트랜잭션이 끝나면 가격은 정상으로 돌아오지만, 자금은 이미 유출된 뒤다.
// 취약: 단일 DEX 의 즉석 가격에 의존
function getPrice() public view returns (uint) {
    // reserve0, reserve1 은 순간적으로 조작 가능하다
    return reserve1 * 1e18 / reserve0;
}

function borrow(uint collateralAmount) public {
    uint price = getPrice();                    // ← 조작된 가격
    uint borrowable = collateralAmount * price; // 부풀려진 담보 가치
    // ...과도한 대출 실행
}

실제 사례

2020년 bZx, Harvest Finance 등이 이 패턴으로 연쇄 피해를 입었습니다. bZx는 여러 프로토콜을 엮은 플래시론 공격으로 초기에 수십만 달러 규모의 손실을 봤고, 이후 추가 공격으로 피해가 누적되었습니다. Harvest Finance는 스테이블코인 풀의 가격을 왜곡하는 방식으로 약 3,400만 달러를 잃었습니다. 이 사건들은 업계에 “플래시론은 그 자체로 취약점이 아니라 증폭기(amplifier)“라는 인식을 확산시켰습니다. 근본 원인은 어디까지나 조작 가능한 오라클이며, 플래시론은 공격에 필요한 자본의 문턱을 사실상 0으로 낮춰줄 뿐입니다.

방어 패턴

  • TWAP (시간가중평균가격): 한 블록의 순간 가격 대신 일정 기간에 걸친 평균을 사용합니다. 이렇게 하면 단일 트랜잭션 안에서 가격을 순간적으로 흔드는 조작이 평균에 거의 영향을 주지 못해 무의미해집니다. Uniswap V3의 누적 tick 오라클이 대표적입니다.
  • 탈중앙 오라클 집계: Chainlink처럼 여러 거래소와 노드의 가격을 집계한 값을 사용해, 특정 한 곳의 조작만으로는 최종 가격이 흔들리지 않게 합니다.
  • 다중 소스 교차검증: 온체인 TWAP과 외부 오라클을 함께 확인하고, 둘 사이의 편차가 임계치를 넘으면 거래를 아예 차단합니다.
  • 유동성 임계: 조작 비용이 잠재 이익을 넘어서도록, 충분한 유동성을 확보한 소스만 가격 근거로 신뢰합니다.
// 개선: Chainlink 피드 + 신선도(staleness) 검사
AggregatorV3Interface internal feed;

function getPrice() public view returns (uint) {
    (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData();
    require(answer > 0, "invalid price");
    require(block.timestamp - updatedAt < 3600, "stale price"); // 1시간 이상 지난 값 거부
    return uint256(answer);
}

6. 프론트러닝 / MEV (Maximal Extractable Value)

취약점 개요

이더리움의 멤풀(mempool)은 공개되어 있습니다. 아직 블록에 포함되지 않은 대기 중인 트랜잭션을 누구나 들여다볼 수 있고, 검증자(validator)는 자신이 만드는 블록 안에서 트랜잭션의 순서를 결정할 권한을 가집니다. 이 두 성질이 결합되면, 트랜잭션 순서를 조작해 이익을 뽑아내는 MEV가 발생합니다. MEV는 특정 컨트랙트의 버그가 아니라 공개 블록체인의 구조에서 비롯되는 성질이지만, 최종 사용자에게는 실질적인 금전 손실로 나타납니다.

익스플로잇 흐름 — 샌드위치 공격

  1. 피해자가 DEX에서 큰 매수 주문(예: 토큰 X를 대량 매수)을 멤풀에 올린다.
  2. 공격자가 이를 감지하고, 더 높은 가스비를 지불해 자신의 매수 주문을 피해자 주문보다 앞에 끼워넣는다(front-run). 이로 인해 토큰 X의 가격이 먼저 오른다.
  3. 뒤이어 실행되는 피해자의 주문은 이미 오른 가격에 체결된다. 피해자는 슬리피지만큼 손해를 본다.
  4. 공격자가 피해자 주문 바로 뒤에서 토큰 X를 매도(back-run)해, 앞서 싸게 산 것과의 차익을 실현한다.

피해자의 거래는 코드상 정확히 명세대로 실행되었습니다. 그러나 앞뒤로 끼워진 두 거래 때문에 결과적으로 더 나쁜 가격을 받게 된 것입니다. MEV에는 이 샌드위치 외에도 청산 경쟁, 아비트리지, 백런 등 다양한 형태가 포함됩니다.

방어 패턴

  • 슬리피지 한도: amountOutMin을 타이트하게 설정해, 조작으로 가격이 크게 나빠지면 거래 자체가 revert되게 합니다. 사용자가 직접 걸 수 있는 1차 방어선입니다.
  • Commit-Reveal: 주문 내용을 먼저 해시로 커밋해 은닉하고, 다음 단계에서 공개합니다. 공격자가 순서를 조작해서 얻을 수 있는 정보(무엇을 얼마나 사려는지)를 원천 차단합니다.
  • 프라이빗 주문 흐름: Flashbots Protect 같은 프라이빗 멤풀을 통해 트랜잭션을 검증자에게 직접 전달함으로써, 공개 멤풀에 노출되는 것을 피합니다.
  • 배치 경매 DEX: CoW Protocol처럼 일정 시간 동안의 주문을 모아 동일한 청산가로 일괄 체결하면, 블록 내에서 누가 먼저인지 자체가 무의미해집니다.
// 사용자 측 방어: 슬리피지 보호가 있는 스왑 호출
router.swapExactTokensForTokens(
    amountIn,
    amountOutMin,   // ← 최소 수령량. 이보다 나쁘면 revert
    path,
    msg.sender,
    block.timestamp + 300
);

2부 요약

#공격조작 대상대표 사례핵심 방어
5오라클 조작 / 플래시론가격 오라클bZx, HarvestTWAP · 탈중앙 오라클
6MEV / 프론트러닝트랜잭션 순서샌드위치 공격슬리피지 · 프라이빗 멤풀

두 공격의 공통점은, 개별 함수는 결백하다는 것입니다. 취약한 것은 그 함수들이 신뢰한 입력(가격)과 그 함수들이 실행된 환경(공개 멤풀)입니다. 이는 스마트 컨트랙트 보안이 단순한 코드 검수를 넘어, 경제적 인센티브 설계의 영역으로 확장되어야 함을 분명히 보여줍니다.

다음 3부에서는 한 층 더 아래로 내려가, 블록체인의 토대 그 자체인 합의(consensus) 레벨 공격과 접근 제어 실패를 다룹니다. 51% 공격과, 무려 5억 달러 이상을 영구 동결시킨 Parity 사건이 등장합니다.

이 글은 ChainLab 기술 시리즈의 일부입니다.

Tags: 블록체인보안, 오라클문제, 플래시론, MEV, DeFi

Recent Posts

블록체인이 진짜 파는 것: “나는 못 고친다”

체인 위의 데이터 — 3부작 중 3편 · ChainLab 앞의 두 편은 배관에 관한 것이었습니다…

2개월 ago

데이터를 소비하는 것이 스마트컨트랙트일 때

체인 위의 데이터 — 3부작 중 2편 · ChainLab 1편에서 우리는 하나의 재정의에 도달했습니다. 블록체인은…

2개월 ago

무료 데이터를 블록체인에 얹어 판다는 것

체인 위의 데이터 — 3부작 중 1편 · ChainLab 솔깃한 아이디어가 하나 있습니다. 부동산 실거래가…

2개월 ago

한국에선 왜 아직? — 규제 이야기, 쉽게 (5/5)

기술은 세계 최고 수준인데, 왜 우리나라에선 AI 결제가 아직 잘 안 굴러갈까요? 답은 '실력'이 아니라…

2개월 ago

에스크로 — 돈을 안전하게 맡기는 금고, 그런데 왜 어려울까 (4/5)

중고거래 안전결제, 다들 써보셨죠? AI 결제에도 이게 필요합니다. 문제는, 생각보다 훨씬 까다롭다는 거예요. 중고거래를 떠올려…

2개월 ago

AP2 & MPP — ‘미리 허락받는’ 결제 vs ‘탭 열어두는’ 결제 (3/5)

앞 편의 x402가 자판기였다면, 이번 두 방식은 '용돈 한도'와 '술집 외상장부'에 가깝습니다. 앞 편 복습:…

2개월 ago