Auditing Foundry Smart Contract Security
개요
배포된 스마트 컨트랙트는 불변이며 실제 자금을 관리하므로 메인넷에 배포된 버그는 패치할 수 없고 악용될 수만 있습니다. 대부분의 치명적인 DeFi 손실은 재진입, 손상된 접근 제어, 오라클/가격 조작, unchecked arithmetic 또는 외부 호출 등 소수의 반복되는 클래스에서 발생합니다.
이 스킬은 Foundry 프로젝트에 대한 심층 방어, 사전 배포 감사를 실행하며, 각각 다른 기법이 놓치는 것을 포착하는 네 가지 독립적인 기술을 계층화합니다:
- 정적 분석 —
slither(90개 이상의 탐지기) 및aderyn(Cyfrin, Rust)이 AST/IR을 초 단위로 스캔하여 알려진 안티패턴을 찾습니다. - 심볼릭 실행 —
mythril(선택 사항, 느림)이 실행 경로를 탐색하고 SMT 솔버를 통해 심층 산술/재진입 버그를 해결합니다. - 속성 기반 테스트 —
forge test와 퍼징(testFuzz_*) 및 불변 테스트(invariant_*+ 핸들러 컨트랙트와 ghost 변수)를 통해 프로토콜 수준의 속성이 수백만 개의 무작위 시퀀스에서 유지됨을 증명합니다. - 수동 검토 + 키 보안 — 구조화된 체크리스트 (
references/vulnerability-checklist.md참조) 및 비밀/키스토어 감사를 통해 개인 키가 평문에 존재하지 않고 암호화된cast키스토어를 통해 배포되도록 합니다 (references/secure-deployment-and-keys.md참조).
이 스킬은 개발자 측면, 사전 배포 단계입니다 — SOC가 사고 후에 실행하는 것이 아니라 컨트랙트를 구축하는 엔지니어가 실행합니다. 발견 사항은 배포를 제한합니다: 높음/심각도 정적 분석 결과, 실패한 테스트, 유출된 키 또는 낮은 커버리지 = FAIL.
사용 시기
- Solidity 컨트랙트를 테스트넷 또는 메인넷 EVM 체인에 배포하기 전.
- Foundry 프로젝트 (
foundry.toml,src/,test/,script/)를 작성하거나 검토할 때. - 컨트랙트가 가치(토큰(ERC-20/721/1155), 볼트, 스테이킹, AMM, 브리지, 거버넌스)를 처리할 때.
- 퍼즈 또는 불변 테스트를 추가하거나, 가치 이동 함수의 커버리지가 알려지지 않은 경우.
- 배포 스크립트를 연결할 때 — 키가
.env평문이 아닌 암호화된 키스토어에 있는지 확인하기 위해. - 가격 오라클, 외부 호출,
delegatecall또는 업그레이드 가능한 프록시를 통합할 때. - Slither/Aderyn 보고서를 분류하고 실제 버그와 오탐지를 구분해야 할 때.
사전 요구 사항
- Foundry 설치됨 (
forge,cast,anvil):curl -L https://foundry.paradigm.xyz | bash && foundryup - Slither + solc:
pip install slither-analyzer및solc-select install <ver> && solc-select use <ver> - Aderyn (권장):
cargo install aderyn(또는npm i -g @cyfrin/aderyn) - Mythril (선택 사항, 느린 심볼릭 실행):
pip install mythril - gitleaks (키 유출 스캔): 동반 스킬
implementing-secret-scanning-with-gitleaks참조 - 컴파일되는 Foundry 프로젝트 (
forge build성공) — 분석기가 빌드 아티팩트를 필요로 함. - Solidity ^0.8.x 가정 (내장 오버플로 검사); 0.8 미만 컨트랙트는 추가 SafeMath 검토 필요.
Python 도구는 virtualenv에 설치하십시오 (외부 관리 배포판에서 권장). 절대 잠금 해제된 지갑이 있는 머신에서 신뢰할 수 없는 컨트랙트 소스에 대해 분석을 실행하지 마십시오.
단계
1단계: 프로젝트 빌드 및 정합성 확인
forge build # 분석기는 신선한 아티팩트 필요
forge fmt --check # 스타일 게이트 (선택 사항)
cat foundry.toml # solc 버전, 옵티마이저, 리매핑, evm_version 확인
2단계: 정적 분석 (빠름, 매번 실행)
# Slither — 전체 프로젝트 (foundry.toml + 리매핑 자동 사용)
slither . --json slither-report.json
# Aderyn — Cyfrin Rust 분석기, 보완 탐지기
aderyn . -o aderyn-report.json
또는 두 가지를 모두 실행하고 중복을 제거하며 결과를 게이트하는 번들 오케스트레이터 실행:
python3 scripts/agent.py --project . --output audit-report.json
3단계: 중요 컨트랙트에 대한 심볼릭 실행 (선택 사항, 느림)
# 가장 가치가 높은 컨트랙트에만 — Mythril은 경로 폭발적
myth analyze src/Vault.sol --solc-json mythril.config.json --execution-timeout 300 -o json
# 또는: python3 scripts/agent.py --project . --mythril src/Vault.sol
4단계: 속성 기반 테스트 — 퍼즈 + 불변
forge test -vvv # 단위 + 퍼즈 테스트
forge coverage --report summary # 가치 이동 코드 커버리지
forge test --match-test invariant_ -vvv # 불변 스위트 (핸들러 기반)
모든 가치 이동 컨트랙트는 핸들러가 있는 불변 테스트(제한된 입력, ghost 변수, targetContract(handler))를 가져야 합니다 — 단위 테스트만으로는 충분하지 않습니다. 핸들러 패턴은 references/api-reference.md를 참조하고, 각 접근 제어 가드에 대해 test_RevertWhen_* (vm.expectRevert 포함)를 작성하십시오.
5단계: 체크리스트에 따른 수동 검토
모든 컨트랙트에 대해 references/vulnerability-checklist.md를 검토: 재진입(checks-effects-interactions / nonReentrant), 접근 제어, 오라클 조작, delegatecall/프록시 스토리지 레이아웃, unchecked 반환 값, tx.origin, 약한 무작위성, DoS, 프론트러닝/MEV, ERC 특정 함정(approve 경쟁, 수수료 전송, 리베이싱).
6단계: 키 보안 및 안전한 배포
gitleaks detect --no-banner # 개인 키 / 니모닉 / .env 커밋 금지
git ls-files | grep -E '\.env$|keystore' && echo "경고: git에 추적된 비밀"
# 배포 키를 암호화된 키스토어에 한 번 가져오기 — 절대 평문 PRIVATE_KEY env 사용 금지
cast wallet import deployer --interactive
# 키스토어 계정을 통해 배포 (먼저 테스트넷), --broadcast 전 시뮬레이션
forge script script/Deploy.s.sol --account deployer --rpc-url <testnet> --broadcast --verify
references/secure-deployment-and-keys.md에서 전체 강화 규칙 참조 (MetaMask 위생, 메인넷용 하드웨어 지갑, RPC 신뢰, 배포 후 검증).
7단계: 분류 및 보고
Slither + Aderyn + Mythril + 테스트 결과를 결합하고 (파일, 줄)별로 중복 제거, 확인된 오탐지 제거, 악용 가능성 × 재정적 영향으로 순위 매기고 각각을 SWC ID에 매핑합니다. 오케스트레이터는 PASS/FAIL 게이트가 포함된 audit-report.json을 생성합니다.
예상 출력
SWC 식별자, 심각도, 도구 출처, 영향을 받는 컨트랙트/함수/라인 및 수정 권장 사항이 포함된 JSON 감사 보고서; 테스트/커버리지 요약 및 단일 PASS / FAIL 배포 게이트. 높음/심각도 정적 분석 결과, 실패한 테스트, 유출된 비밀 또는 가치 이동 코드에 대한 구성된 임계값 미만의 커버리지에서 FAIL.