스마트 컨트랙트 보안 체크리스트
스마트 컨트랙트
보안
solidity
중급
스마트 컨트랙트 개발 체크리스트
스마트 컨트랙트를 작성할 때 따를 것을 권장하는 전반적인 프로세스는 다음과 같습니다.
알려진 보안 문제 확인:
- 슬리더 (opens in a new tab)를 사용하여 컨트랙트를 검토하세요. 일반적인 취약점을 찾아내는 40개 이상의 내장 탐지기가 있습니다. 새로운 코드를 체크인할 때마다 실행하여 문제없는 보고서를 받는지 확인하세요(또는 특정 문제를 무시하려면 분류(triage) 모드를 사용하세요).
- Crytic (opens in a new tab)을 사용하여 컨트랙트를 검토하세요. 슬리더가 확인하지 않는 50가지 문제를 검사합니다. 또한 Crytic은 GitHub의 풀 리퀘스트(Pull Request)에서 보안 문제를 쉽게 드러내어 팀원들이 서로의 코드를 잘 파악할 수 있도록 돕습니다.
컨트랙트의 특수 기능 고려:
- 컨트랙트가 업그레이드 가능한가요?
slither-check-upgradeability(opens in a new tab) 또는 Crytic (opens in a new tab)을 사용하여 업그레이드 가능성 코드에 결함이 없는지 검토하세요. 업그레이드가 잘못될 수 있는 17가지 방법을 문서화해 두었습니다. - 컨트랙트가 ERC를 준수한다고 명시되어 있나요?
slither-check-erc(opens in a new tab)로 확인해 보세요. 이 도구는 6가지 일반적인 사양에서 벗어난 부분을 즉시 식별합니다. - 서드파티 토큰과 연동하나요? 외부 컨트랙트에 의존하기 전에 토큰 연동 체크리스트를 검토하세요.
코드의 중요한 보안 기능을 시각적으로 검사:
- 슬리더의 inheritance-graph (opens in a new tab) 프린터를 검토하세요. 의도치 않은 섀도잉(shadowing) 및 C3 선형화 문제를 피하세요.
- 슬리더의 function-summary (opens in a new tab) 프린터를 검토하세요. 함수의 가시성(visibility) 및 접근 제어를 보고합니다.
- 슬리더의 vars-and-auth (opens in a new tab) 프린터를 검토하세요. 상태 변수에 대한 접근 제어를 보고합니다.
중요한 보안 속성을 문서화하고 자동화된 테스트 생성기를 사용하여 평가:
- 코드의 보안 속성을 문서화하는 방법을 배우세요. 처음에는 어렵지만, 좋은 결과를 얻기 위해 가장 중요한 단일 활동입니다. 또한 이 튜토리얼의 고급 기술을 사용하기 위한 전제 조건이기도 합니다.
- 에키드나 (opens in a new tab) 및 맨티코어 (opens in a new tab)와 함께 사용할 수 있도록 Solidity로 보안 속성을 정의하세요. 상태 머신, 접근 제어, 산술 연산, 외부 상호작용 및 표준 준수에 집중하세요.
- 슬리더의 Python API를 사용하여 보안 속성을 정의하세요. 상속, 변수 종속성, 접근 제어 및 기타 구조적 문제에 집중하세요.
- Crytic (opens in a new tab)을 사용하여 모든 커밋에서 속성 테스트를 실행하세요. Crytic은 보안 속성 테스트를 사용하고 평가할 수 있으므로 팀의 모든 사람이 GitHub에서 테스트 통과 여부를 쉽게 확인할 수 있습니다. 실패한 테스트는 커밋을 차단할 수 있습니다.
마지막으로, 자동화된 도구가 쉽게 찾을 수 없는 문제에 유의하세요:
- 프라이버시 부족: 트랜잭션이 풀(pool)에 대기하는 동안 다른 모든 사람이 이를 볼 수 있습니다.
- 프론트 러닝(Front running) 트랜잭션
- 암호화 연산
- 외부 탈중앙화 금융 (DeFi) 컴포넌트와의 위험한 상호작용
도움 요청하기
이더리움 오피스 아워 (opens in a new tab)는 매주 화요일 오후에 진행됩니다. 이 1시간짜리 1대1 세션은 보안에 관한 질문을 하고, 도구를 사용하여 문제를 해결하며, 현재 접근 방식에 대해 전문가의 피드백을 받을 수 있는 기회입니다. 이 가이드를 잘 활용할 수 있도록 도와드리겠습니다.
Slack에 참여하세요: Empire Hacking (opens in a new tab). 질문이 있으시면 언제든지 #crytic 및 #ethereum 채널에서 답변해 드립니다.