Solidity 프로토콜이 Mutation Testing을 도입해 100% 라인 커버리지의 한계를 노출하고 보안 테스트 품질을 정량화
Mutation Testing for Solidity: The Audit Quality Metric Your Protocol Is Ignoring
AI 요약
Context
라인 커버리지 100%를 달성한 프로토콜도 2026년 Q1에만 $137백만의 손실을 입었으며, 이는 테스트가 코드 실행 여부만 검증하고 실제 버그 탐지 능력은 측정하지 못한다는 한계를 드러냈다. 예를 들어 require(shares > 0)을 require(shares >= 0)으로 변경해도 기존 테스트는 통과하지만 공격자가 악용 가능한 취약점이 숨어 있을 수 있다.
Technical Solution
- Mutation Testing 도입: 코드에 의도적인 버그(mutant)를 삽입한 후 기존 테스트 스위트가 이를 감지하는지 검증
- Gambit 도구 운영: Certora의 Rust 기반 도구로 Solidity AST 분석을 통해 mutant 생성, Certora Prover 스펙과 통합 지원
- Vertigo-rs 도구 운영: RareSkills의 오픈소스 도구로 mutant 생성, 테스트 실행, 점수 산출을 자동화하며 Foundry/Hardhat/Truffle 네이티브 통합
- 테스트 강화 워크플로우: survived mutant(테스트를 통과한 버그)를 식별하여 해당 케이스를 커버하는 추가 테스트 작성
- Mutation Score 목표 설정: 보안 크리티컬 계약에 대해 75% 이상의 mutation score를 감사 제출 전 달성 목표
Impact
아티클에는 구체적인 도입 후 성능 수치가 없으나, 예시 withdraw 함수에서 100% 라인 커버리지 상태에서 4개의 주요 취약점 mutant를 모두 놓친 사례를 제시했고, 실제 mutation score는 50-70%(잘 테스트된 DeFi), 70-85%(강한 테스트), 85% 이상(수익 감소 영역)으로 분류했다.
Key Takeaway
Mutation Testing은 라인 커버리지라는 거짓 안정감을 제거하고 테스트 스위트의 실제 결함 탐지 능력을 정량화하는 도구로, Solidity 보안의 방어 심층화 전략에서 단위 테스트와 퍼지 테스팅 사이의 필수 계층이다.
실천 포인트
Solidity 프로토콜 개발팀이 Vertigo-rs를 설치한 후 `vertigo-rs run --framework foundry`로 현재 mutation score를 측정하면, survived mutant 목록에서 보안 크리티컬한 취약점을 우선 제거하는 테스트를 작성함으로써 실제 공격 가능성이 높은 버그 클래스를 사전에 차단할 수 있다.