
slither v0.11.6
Solidity 및 Vyper용 정적 분석기
Slither, 스마트 계약 정적 분석기
Empire Hacking Slack에 참여하세요
- 토론 및 지원
Slither는 Python3로 작성된 Solidity 및 Vyper 정적 분석 프레임워크입니다. 취약점 탐지기 모음을 실행하고, 계약 세부 정보에 대한 시각적 정보를 출력하며, 사용자 정의 분석을 쉽게 작성할 수 있는 API를 제공합니다. Slither는 개발자가 취약점을 찾고, 코드 이해도를 높이며, 사용자 정의 분석을 신속하게 프로토타입화할 수 있도록 합니다.
특징
- 낮은 오탐지율로 취약한 Solidity 코드를 탐지합니다 (트로피 목록 보기 trophies)
- 소스 코드에서 오류 조건이 발생하는 위치를 식별합니다
- 지속적 통합 및 Hardhat/Foundry 빌드에 쉽게 통합됩니다
- 내장된 '프린터'가 중요 계약 정보를 신속하게 보고합니다
- Python으로 사용자 정의 분석을 작성하기 위한 탐지기 API
- Solidity >= 0.4로 작성된 계약 분석 기능
- 중간 표현 (SlithIR)을 통해 간단하고 높은 정밀도의 분석 가능
- 모든 공개 Solidity 코드의 99.9%를 정확하게 파싱
- 계약당 평균 실행 시간 1초 미만
- CI에서 Github의 코드 스캔과 통합
- Vyper 스마트 계약 지원
사용법
Hardhat/Foundry/Dapp/Brownie 애플리케이션에서 Slither 실행:```console slither .
이 방법은 프로젝트에 의존성이 있을 때 권장됩니다. Slither는 기본 컴파일 프레임워크에 의존하여 소스 코드를 컴파일하기 때문입니다.
하지만 의존성을 임포트하지 않는 단일 파일에서 Slither를 실행할 수도 있습니다:```console
slither tests/uninitialized.sol
설치 방법
참고 Slither는 Python 3.10+가 필요합니다. 지원되는 컴파일 프레임워크 중 하나를 사용하지 않을 경우, solc, 즉 Solidity 컴파일러가 필요합니다. solc 버전 간 편리하게 전환하려면 solc-select 사용을 권장합니다.
uv 사용 (권장)
uv는 pip보다 10~100배 빠른 Python 패키지 관리자입니다.```console
Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh
Install slither as a tool
uv tool install slither-analyzer
Or run slither without installation
uvx --from slither-analyzer slither
업그레이드하려면:```console
uv tool upgrade slither-analyzer
Pip 사용하기```console
python3 -m pip install slither-analyzer
업그레이드하려면:```console
python3 -m pip install --upgrade slither-analyzer
Brew 사용하기```console
brew install slither-analyzer
### Git 사용하기 (개발)```bash
git clone https://github.com/crytic/slither.git && cd slither
# Install as editable for development
uv tool install -e .
# Or use uv run for testing without installation
uv run slither <target>
The -e 플래그는 편집 가능 모드로 설치하여, 소스 코드 변경 사항이 재설치 없이 즉시 반영됩니다.
Docker 사용
eth-security-toolbox 도커 이미지를 사용하세요. 이 이미지에는 모든 보안 도구와 모든 주요 Solidity 버전이 단일 이미지에 포함되어 있습니다. 컨테이너에서 /home/share가 /share에 마운트됩니다.```bash
docker pull trailofbits/eth-security-toolbox
컨테이너에서 디렉터리를 공유하려면:```bash
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
통합
- GitHub 액션 통합을 위해서는 slither-action을 사용하세요.
- pre-commit 통합을 위해서는 (
$GIT_TAG를 실제 태그로 바꾸세요) 사용하세요. ```YAML- repo: https://github.com/crytic/slither
rev: $GIT_TAG
hooks:
- id: slither
- repo: https://github.com/crytic/slither
rev: $GIT_TAG
hooks:
- To generate a Markdown report, use
slither [target] --checklist. - To generate a Markdown with GitHub source code highlighting, use
slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/(replaceORG,REPO,COMMIT)
탐지기
| 번호 | 탐지기 | 탐지 내용 | 영향 | 신뢰도 |
|---|---|---|---|---|
| 1 | abiencoderv2-array | 스토리지 abiencoderv2 배열 | 높음 | 높음 |
| 2 | arbitrary-send-erc20 | 임의의 from을 사용하는 transferFrom | 높음 | 높음 |
| 3 | array-by-reference | 값으로 스토리지 배열 수정 | 높음 | 높음 |
| 4 | encode-packed-collision | ABI encodePacked 충돌 | 높음 | 높음 |
| 5 | incorrect-shift | 시프트 명령어의 매개변수 순서가 잘못됨 | 높음 | 높음 |
| 6 | multiple-constructors | 다중 생성자 방식 | 높음 | 높음 |
| 7 | name-reused | 계약 이름 재사용 | 높음 | 높음 |
| 8 | protected-vars | 보호되지 않은 변수 감지 | 높음 | 높음 |
| 9 | public-mappings-nested | 중첩 변수가 있는 public 매핑 | 높음 | 높음 |
| 10 | rtlo | 오른쪽에서 왼쪽 재정의 제어 문자 사용 | 높음 | 높음 |
| 11 | shadowing-state | 상태 변수 섀도잉 | 높음 | 높음 |
| 12 | suicidal | 누구나 계약을 파괴할 수 있는 함수 | 높음 | 높음 |
| 13 | uninitialized-state | 초기화되지 않은 상태 변수 | 높음 | 높음 |
| 14 | uninitialized-storage | 초기화되지 않은 스토리지 변수 | 높음 | 높음 |
| 15 | unprotected-upgrade | 보호되지 않은 업그레이드 가능 계약 | 높음 | 높음 |
| 16 | arbitrary-send-erc20-permit | permint과 함께 임의의 from을 사용하는 transferFrom | 높음 | 중간 |
| 17 | arbitrary-send-eth | 임의의 대상으로 Ether를 보내는 함수 | 높음 | 중간 |
| 18 | controlled-array-length | 오염된 배열 길이 할당 | 높음 | 중간 |
| 19 | controlled-delegatecall | 제어되는 delegatecall 대상 | 높음 | 중간 |
| 20 | delegatecall-loop | 루프 내에서 delegatecall을 사용하는 지불 가능 함수 | 높음 | 중간 |
| 21 | incorrect-exp | 잘못된 지수 연산 | 높음 | 중간 |
| 22 | incorrect-return | 어셈블리 모드에서 return이 잘못 사용된 경우 | 높음 | 중간 |
| 23 | msg-value-loop | 루프 내의 msg.value | 높음 | 중간 |
| 24 | reentrancy-eth | 재진입 취약점 (Ether 도난) | 높음 | 중간 |
| 25 | reentrancy-balance | 오래된 잔액 확인으로 이어지는 재진입 취약점 | 높음 | 중간 |
| 26 | return-leave | leave 대신 return이 사용된 경우 | 높음 | 중간 |
| 27 | storage-array | 부호 있는 정수 배열 컴파일러 버그 | 높음 | 중간 |
| 28 | unchecked-transfer | 확인되지 않은 토큰 전송 | 높음 | 중간 |
| 29 | weak-prng | 약한 PRNG | 높음 | 중간 |
| 30 | domain-separator-collision | EIP-2612의 DOMAIN_SEPARATOR()와 서명이 충돌하는 함수가 있는 ERC20 토큰 감지 | 중간 | 높음 |
| 31 | enum-conversion | 위험한 enum 변환 감지 | 중간 | 높음 |
| 32 | erc20-interface | 잘못된 ERC20 인터페이스 | 중간 | 높음 |
| 33 | erc721-interface | 잘못된 ERC721 인터페이스 | 중간 | 높음 |
| 34 | incorrect-equality | 위험한 엄격한 동등성 | 중간 | 높음 |
| 35 | locked-ether | Ether를 잠그는 계약 | 중간 | 높음 |
| 36 | mapping-deletion | 구조체를 포함하는 매핑 삭제 | 중간 | 높음 |
| 37 | pyth-deprecated-functions | Pyth 사용 중단 함수 감지 | 중간 | 높음 |
| 38 | pyth-unchecked-confidence | Pyth 가격의 신뢰 수준이 확인되지 않은 경우 감지 | 중간 | 높음 |
| 39 | pyth-unchecked-publishtime | Pyth 가격의 publishTime이 확인되지 않은 경우 감지 | 중간 | 높음 |
| 40 | shadowing-abstract | 추상 계약의 상태 변수 섀도잉 | 중간 | 높음 |
| 41 | tautological-compare | 변수를 자기 자신과 비교하면 비교 유형에 따라 항상 참 또는 거짓을 반환함 | 중간 | 높음 |
| 42 | tautology | 동어 반복 또는 모순 | 중간 | 높음 |
| 43 | write-after-write | 사용되지 않는 쓰기 | 중간 | 높음 |
| 44 | boolean-cst | 부울 상수 오용 | 중간 | 중간 |
| 45 | chronicle-unchecked-price | Chronicle 가격이 확인되지 않은 경우 감지 | 중간 | 중간 |
| 46 | constant-function-asm | 어셈블리 코드를 사용하는 상수 함수 | 중간 | 중간 |
| 47 | constant-function-state | 상태를 변경하는 상수 함수 | 중간 | 중간 |
| 48 | divide-before-multiply | 부정확한 산술 연산 순서 | 중간 | 중간 |
| 49 | gelato-unprotected-randomness | 보호되지 않은 함수 내에서 _requestRandomness 호출 | 중간 | 중간 |
| 50 | out-of-order-retryable | 순서가 잘못된 재시도 가능 트랜잭션 | 중간 | 중간 |
| 51 | reentrancy-no-eth | 재진입 취약점 (Ether 도난 없음) | 중간 | 중간 |
| 52 | reused-constructor | 재사용된 기본 생성자 | 중간 | 중간 |
| 53 | tx-origin | tx.origin의 위험한 사용 | 중간 | 중간 |
| 54 | unchecked-lowlevel | 확인되지 않은 저수준 호출 | 중간 | 중간 |
| 55 | unchecked-send | 확인되지 않은 send | 중간 | 중간 |
| 56 | uninitialized-local | 초기화되지 않은 지역 변수 | 중간 | 중간 |
| 57 | unused-return | 사용되지 않는 반환 값 | 중간 | 중간 |
| 58 | chainlink-feed-registry | Chainlink 피드 레지스트리 사용 감지 | 낮음 | 높음 |
| 59 | incorrect-modifier | 기본 값을 반환할 수 있는 수정자 | 낮음 | 높음 |
| 60 | optimism-deprecation | 사용 중단된 Optimism 사전 배포 또는 함수가 사용된 경우 감지 | 낮음 | 높음 |
| 61 | shadowing-builtin | 내장 기호 섀도잉 | 낮음 | 높음 |
| 62 | shadowing-local | 지역 변수 섀도잉 | 낮음 | 높음 |
| 63 | uninitialized-fptr-cst | 생성자에서 초기화되지 않은 함수 포인터 호출 | 낮음 | 높음 |
| 64 | variable-scope | 선언 전에 사용된 지역 변수 | 낮음 | 높음 |
| 65 | void-cst | 호출되었지만 구현되지 않은 생성자 | 낮음 | 높음 |
| 66 | calls-loop | 루프 내의 다중 호출 | 낮음 | 중간 |
| 67 | events-access | 이벤트 접근 제어 누락 | 낮음 | 중간 |
| 68 | events-maths | 이벤트 산술 누락 | 낮음 | 중간 |
| 69 | incorrect-unary | 위험한 단항 표현식 | 낮음 | 중간 |
| 70 | missing-zero-check | 0 주소 검증 누락 | 낮음 | 중간 |
| 71 | reentrancy-benign | 양성 재진입 취약점 | 낮음 | 중간 |
| 72 | reentrancy-events | 순서가 잘못된 이벤트로 이어지는 재진입 취약점 | 낮음 | 중간 |
| 73 | return-bomb | 저수준 호출 대상이 예상치 못하게 모든 호출자의 가스를 소비할 수 있음 | 낮음 | 중간 |
| 74 | timestamp | block.timestamp의 위험한 사용 | 낮음 | 중간 |
| 75 | assembly | 어셈블리 사용 | 정보 | 높음 |
| 76 | assert-state-change | assert 상태 변경 | 정보 | 높음 |
| 77 | boolean-equal | 부울 상수와 비교 | 정보 | 높음 |
| 78 | cyclomatic-complexity | 높은 순환 복잡도(> 11)를 가진 함수 감지 | 정보 | 높음 |
| 79 | deprecated-standards | 사용 중단된 Solidity 표준 | 정보 | 높음 |
| 80 | erc20-indexed | 인덱싱되지 않은 ERC20 이벤트 매개변수 | 정보 | 높음 |
| 81 | function-init-state | 상태 변수를 초기화하는 함수 | 정보 | 높음 |
| 82 | incorrect-using-for | 주어진 라이브러리의 함수 중 주어진 유형과 일치하는 함수가 없을 때 using-for 문 사용 감지 | 정보 | 높음 |
| 83 | low-level-calls | 저수준 호출 | 정보 | 높음 |
| 84 | missing-inheritance | 상속 누락 | 정보 | 높음 |
| 85 | naming-convention | Solidity 명명 규칙 준수 | 정보 | 높음 |
| 86 | pragma | 다른 pragma 지시문이 사용된 경우 | 정보 | 높음 |
| 87 | redundant-statements | 중복 문 | 정보 | 높음 |
| 88 | solc-version | 잘못된 Solidity 버전 | 정보 | 높음 |
| 89 | unimplemented-functions | 구현되지 않은 함수 | 정보 | 높음 |
| 90 | unindexed-event-address | 인덱싱된 매개변수 없이 주소 매개변수를 사용하는 이벤트 | 정보 | 높음 |
| 91 | unused-state | 사용되지 않는 상태 변수 | 정보 | 높음 |
| 92 | costly-loop | 루프 내의 비용이 많이 드는 연산 | 정보 | 중간 |
| 93 | dead-code | 사용되지 않는 함수 | 정보 | 중간 |
| 94 | reentrancy-unlimited-gas | send 및 transfer를 통한 재진입 취약점 | 정보 | 중간 |
| 95 | too-many-digits | 숫자 표기법 모범 사례 준수 | 정보 | 중간 |
| 96 | cache-array-length | 루프 조건에서 일부 스토리지 배열의 length 멤버를 사용하고 이를 수정하지 않는 for 루프 감지 | 최적화 | 높음 |
| 97 | constable-states | 상수로 선언될 수 있는 상태 변수 | 최적화 | 높음 |
| 98 | external-function | external로 선언될 수 있는 public 함수 | 최적화 | 높음 |
| 99 | immutable-states | immutable로 선언될 수 있는 상태 변수 | 최적화 | 높음 |
| 100 | var-read-using-this | this를 사용하여 자체 변수를 읽는 계약 | 최적화 | 높음 |
자세한 내용은 다음을 참조하세요.
- 각 탐지기에 대한 자세한 내용은 탐지기 문서를 참조하세요.
- 선택한 탐지만 실행하려면 탐지 선택을 참조하세요. 기본적으로 모든 탐지기가 실행됩니다.
- 개별 결과를 필터링하려면 분류 모드를 참조하세요.
출력기
빠른 검토 출력기
human-summary: 계약의 사람이 읽을 수 있는 요약 출력inheritance-graph: 각 계약의 상속 그래프를 dot 파일로 내보내기contract-summary: 계약 요약 출력loc: 소스 파일(SRC), 종속성(DEP), 테스트 파일(TEST)에서 찾은 총 코드 줄 수(LOC), 소스 코드 줄 수(SLOC), 주석 코드 줄 수(CLOC) 계산entry-points: 계약의 모든 상태 변경 진입점 함수와 해당 변수 출력
심층 검토 출력기* call-graph: 컨트랙트의 호출 그래프를 dot 파일로 내보내기
cfg: 각 함수의 CFG 내보내기function-summary: 함수 요약 출력vars-and-auth: 쓰여진 상태 변수와 함수의 권한 출력not-pausable:whenNotPaused수정자를 사용하지 않는 함수 출력.
프린터를 실행하려면 --print와 함께 쉼표로 구분된 프린터 목록을 사용하세요.
전체 목록은 프린터 문서를 참조하세요.
도구
slither-check-upgradeability:delegatecall기반 업그레이드 가능성 검토slither-prop: 자동 단위 테스트 및 속성 생성slither-flat: 코드베이스 평탄화slither-check-erc: ERC 적합성 검사slither-read-storage: 컨트랙트에서 스토리지 값 읽기slither-interface: 컨트랙트에 대한 인터페이스 생성
추가 도구는 도구 문서를 참조하세요.
문의하기를 통해 사용자 정의 도구 구축에 대한 도움을 받을 수 있습니다.
API 문서
Slither 내부에 대한 문서는 여기에서 확인할 수 있습니다.
도움말
Slither 사용 또는 확장에 대한 도움을 받으려면 Slack 채널 (#ethereum)에 방문하세요.
- 프린터 문서는 Slither가 각 컨트랙트에 대해 시각화할 수 있는 정보를 설명합니다.
- 탐지기 문서는 새로운 취약점 분석을 작성하는 방법을 설명합니다.
- API 문서는 사용자 정의 분석에 사용 가능한 메서드와 객체를 설명합니다.
- SlithIR 문서는 SlithIR 중간 표현을 설명합니다.
자주 묻는 질문 (FAQ)
모의 객체(mocks)나 테스트를 제외하려면 어떻게 하나요?
- 경로 필터링에 대한 문서를 참조하세요.
"unknown file" 또는 컴파일 문제를 해결하려면 어떻게 하나요?
- slither는 solc AST가 필요하므로 모든 의존성을 사용할 수 있어야 합니다.
컨트랙트에 의존성이 있는 경우
slither contract.sol은 실패합니다. 대신contracts/의 상위 디렉토리에서slither .를 사용하세요(ls를 실행하면contracts/가 보여야 합니다).node_modules/폴더가 있다면contracts/와 같은 디렉토리에 있어야 합니다. 이 문제가 slither와 관련된 것인지 확인하려면 사용 중인 프레임워크의 컴파일 명령어(예:npx hardhat compile)를 실행하세요. 해당 명령어가 성공적으로 작동해야 합니다. 그렇지 않으면 slither의 컴파일 엔진인 crytic-compile이 AST를 생성할 수 없습니다.
라이선스
Slither는 AGPLv3 라이선스에 따라 라이선스가 부여되고 배포됩니다. 라이선스 예외가 필요하시면 문의해 주세요.
출판물
Trail of Bits 출판물
- Slither: A Static Analysis Framework For Smart Contracts, Josselin Feist, Gustavo Grieco, Alex Groce - WETSEB '19
외부 출판물
| 제목 | 사용법 | 저자 | 학술지/학회 | 코드 |
|---|---|---|---|---|
| ReJection: A AST-Based Reentrancy Vulnerability Detection Method | Slither 기반 AST 분석 | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
| MPro: Combining Static and Symbolic Analysis for Scalable Testing of Smart Contract | Slither를 통한 데이터 종속성 활용 | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
| ETHPLOIT: From Fuzzing to Efficient Exploit Generation against Smart Contracts | Slither를 통한 데이터 종속성 활용 | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
| Verification of Ethereum Smart Contracts: A Model Checking Approach | Slither의 CFG 기반 기호 실행 | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
| Smart Contract Repair | Slither의 취약점 탐지기에 의존 | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCRepair |
| Demystifying Loops in Smart Contracts | Slither를 통한 데이터 종속성 활용 | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
| Trace-Based Dynamic Gas Estimation of Loops in Smart Contracts | 루프 탐지를 위해 Slither의 CFG 사용 | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) | - |
| SAILFISH: Vetting Smart Contract State-Inconsistency Bugs in Seconds | 스토리지 종속성 그래프 구축을 위해 SlithIR에 의존 | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna | S&P 22 | Sailfish |
| SolType: Refinement Types for Arithmetic Overflow in Solidity | 정제 타입 시스템 구축을 위해 Slither를 프론트엔드로 사용 | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
| Do Not Rug on Me: Leveraging Machine Learning Techniques for Automated Scam Detection | 토큰 특징(mintable, pausable 등) 추출을 위해 Slither 사용 | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) | - |
| MANDO: Multi-Level Heterogeneous Graph Embeddings for Fine-Grained Detection of Smart Contract Vulnerabilities | CFG 및 호출 그래프 추출을 위해 Slither 사용 | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan and Lingxiao Jiang | IEEE 9th International Conference on Data Science and Advanced Analytics (DSAA, 2022) | ge-sc |
| Automated Auditing of Price Gouging TOD Vulnerabilities in Smart Contracts | CFG 및 데이터 종속성 추출을 위해 Slither 사용 | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris, and Fan Long | 2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC) | Smart-Contract-Repair |
| Modeling and Enforcing Access Control Policies for Smart Contracts | Slither의 데이터 종속성 확장 | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | IEEE International Conference on Decentralized Applications and Infrastructures (DAPPS), 2022 | SolidityAccessControlEnforcement |
| Smart Contract Vulnerability Detection Based on Deep Learning and Multimodal Decision Fusion | CFG 추출을 위해 Slither 사용 | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, and Xuan Hu | Sensors 2023, 23, 7246 | - |
| Semantic-enriched Code Knowledge Graph to Reveal Unknowns in Smart Contract Code Reuse | 코드 특징(CFG, 함수, 매개변수 타입 등) 추출을 위해 Slither 사용 | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | ACM Transactions on Software Engineering and Methodology, 2023 | - |
| Smart Contract Parallel Execution with Fine-Grained State Accesses | 상태 접근 그래프 구축을 위해 Slither 사용 | Xiaodong Qi, Jiao Jiao, Yi Li | International Conference on Distributed Computing Systems (ICDCS), 2023 | - |
| Bad Apples: Understanding the Centralized Security Risks in Decentralized Ecosystems | Slither 기반 내부 분석 구현 | Kailun Yan , Jilian Zhang , Xiangyu Liu , Wenrui Diao , Shanqing Guo | ACM Web Conference April 2023 | - |
| Identifying Vulnerabilities in Smart Contracts using Interval Analysis | Slither 기반 4개의 탐지기 생성 | Ştefan-Claudiu Susan, Andrei Arusoaie | FROM 2023 | - |
| Storage State Analysis and Extraction of Ethereum Blockchain Smart Contracts (open access에 PDF 없음) | Slither의 CFG 및 AST에 의존 | Maha Ayub , Tania Saleem , Muhammad Janjua , Talha Ahmad | TOSEM 2023 | SmartMuv |
학술 연구에 Slither를 사용하는 경우 Crytic $10,000 연구상 신청을 고려해 보세요.