본문으로 건너뛰기
블록체인Mar 28, 2026

Deep EVM #4: 보안 기본 요소 — msg.sender, 접근 제어, 재진입

OS
Open Soft Team

Engineering Team

EVM 수준의 보안

스마트 컨트랙트 보안은 작동하는 코드 위에 검사를 추가하는 것이 아닙니다 — EVM의 실행 모델이 공격 표면을 만드는 방식을 이해하는 것입니다. 모든 외부 호출은 잠재적 재진입 지점입니다. 모든 delegatecall은 스토리지 하이재킹 벡터입니다.

msg.sender vs tx.origin

  • msg.sender (CALLER 옵코드): 현재 실행 컨텍스트의 즉시 호출자. 각 CALL마다 변경.
  • tx.origin (ORIGIN 옵코드): 트랜잭션을 시작한 외부 소유 계정(EOA). 호출 깊이에 관계없이 변경 없음.

tx.origin을 인증에 사용하는 것은 잘 알려진 취약점입니다. 항상 msg.sender를 사용하십시오.

재진입: DAO 공격 패턴

재진입은 가장 악명 높은 스마트 컨트랙트 취약점입니다 — 2016년 $60M DAO 해킹을 일으켰습니다.

Checks-Effects-Interactions 패턴

표준 방어는 연산 순서를 올바르게 하는 것입니다:

  1. Checks — 모든 조건 검증
  2. Effects — 모든 상태 변수 업데이트
  3. Interactions — 외부 호출을 마지막에
function withdraw() external {
    uint256 amount = balances[msg.sender];  // Check
    require(amount > 0);                     // Check
    balances[msg.sender] = 0;                // Effect (호출 전에)
    (bool success, ) = msg.sender.call{value: amount}("");  // Interaction
    require(success);
}

일시적 스토리지 재진입 가드 (EIP-1153)

modifier nonReentrant() {
    assembly {
        if tload(0) { revert(0, 0) }
        tstore(0, 1)
    }
    _;
    assembly {
        tstore(0, 0)
    }
}
// 비용: ~200 가스 vs 스토리지 기반 가드의 ~5000 가스

DELEGATECALL: 힘과 위험

DELEGATECALL은 호출하는 컨트랙트의 컨텍스트에서 다른 컨트랙트의 코드를 실행합니다. 프록시 패턴의 기반이지만 스토리지 충돌 공격에 취약합니다.

접근 제어 패턴

  • Ownable — 가장 단순한 패턴: 단일 owner 주소.
  • 역할 기반 접근 제어 (RBAC) — 다중 역할 관리.
  • 멀티시그와 타임락 — 고가치 운영에 적합.

MEV 봇을 위한 실용적 보안 체크리스트

  1. tx.origin 절대 사용하지 말 것
  2. 모든 곳에서 CEI 패턴
  3. 모든 반환 값 확인
  4. DELEGATECALL 대상 검증
  5. 재진입 가드 사용
  6. 콜데이터 검증
  7. 샌드위치 공격 방어
  8. 접근 제어 구현
  9. 회로 차단기 구현
  10. Yul/Huff 코드 특별히 주의해서 감사

결론

EVM의 보안은 추가하는 레이어가 아닙니다 — 외부 호출에 대한 상태 전환 구조의 속성입니다. CEI 패턴, 재진입 가드, 신중한 delegatecall 사용은 모범 사례가 아닌 생존 요건입니다.