Empire Hacking Slack에 참여하세요
- 토론 및 지원
Slither는 Python3으로 작성된 Solidity & Vyper 정적 분석 프레임워크입니다. 취약점 탐지기 제품군을 실행하고, 계약 세부 정보에 대한 시각적 정보를 인쇄하며, 맞춤형 분석을 쉽게 작성할 수 있는 API를 제공합니다. Slither를 사용하면 개발자는 취약점을 찾고, 코드 이해력을 향상시키며, 맞춤형 분석 프로토타입을 신속하게 제작할 수 있습니다.
Hardhat/Foundry/Dapp/Brownie 애플리케이션에서 Slither를 실행하세요.
slither .
Slither가 소스 코드를 컴파일하기 위해 기본 컴파일 프레임워크에 의존하므로 프로젝트에 종속성이 있는 경우 이는 선호되는 옵션입니다.
그러나 종속성을 가져오지 않는 단일 파일에서 Slither를 실행할 수 있습니다.
slither tests/uninitialized.sol
메모
Slither에는 Python 3.8 이상이 필요합니다. 지원되는 컴파일 프레임워크 중 하나를 사용하지 않으 려면 Solidity 컴파일러인 solc가 필요합니다. solc 버전 간을 편리하게 전환하려면 solc-select를 사용하는 것이 좋습니다.
python3 -m pip install slither-analyzer
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
git을 통해 Slither를 설치하려는 경우 개발자 설치 지침에 자세히 설명된 대로 Python 가상 환경을 사용하는 것이 좋습니다.
eth-security-toolbox
도커 이미지를 사용하세요. 여기에는 모든 보안 도구와 Solidity의 모든 주요 버전이 단일 이미지에 포함되어 있습니다. /home/share
컨테이너의 /share
에 마운트됩니다.
docker pull trailofbits/eth-security-toolbox
컨테이너의 디렉터리를 공유하려면 다음 안내를 따르세요.
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG
실제 태그로 교체). - repo : https://github.com/crytic/slither
rev : $GIT_TAG
hooks :
- id : slither
slither [target] --checklist
사용하세요.ORG
를 사용하여 Markdown을 생성하려면 slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/
, REPO
, COMMIT
대체)를 사용하세요. 숫자 | 탐지기 | 탐지 대상 | 영향 | 신뢰 |
---|---|---|---|---|
1 | abiencoderv2-array | 스토리지 abiencoderv2 배열 | 높은 | 높은 |
2 | arbitrary-send-erc20 | transferFrom은 임의의 from 사용합니다. | 높은 | 높은 |
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 | 중첩된 변수를 사용한 공개 매핑 | 높은 | 높은 |
10 | rtlo | 오른쪽에서 왼쪽 재정의 제어 문자가 사용됩니다. | 높은 | 높은 |
11 | shadowing-state | 상태 변수 섀도잉 | 높은 | 높은 |
12 | suicidal | 누구나 계약을 파기할 수 있는 기능 | 높은 | 높은 |
13 | uninitialized-state | 초기화되지 않은 상태 변수 | 높은 | 높은 |
14 | uninitialized-storage | 초기화되지 않은 저장소 변수 | 높은 | 높은 |
15 | unprotected-upgrade | 보호되지 않은 업그레이드 가능한 계약 | 높은 | 높은 |
16 | codex | Codex를 사용하여 취약점을 찾으십시오. | 높은 | 낮은 |
17 | arbitrary-send-erc20-permit | transferFrom은 허가를 받아 임의의 것을 사용합니다. | 높은 | 중간 |
18 | arbitrary-send-eth | Ether를 임의의 목적지로 보내는 기능 | 높은 | 중간 |
19 | controlled-array-length | 오염된 배열 길이 할당 | 높은 | 중간 |
20 | controlled-delegatecall | 제어된 대리자 호출 대상 | 높은 | 중간 |
21 | delegatecall-loop | 루프 내에서 delegatecall 사용하는 지불 가능 함수 | 높은 | 중간 |
22 | incorrect-exp | 잘못된 지수 | 높은 | 중간 |
23 | incorrect-return | 조립 모드에서 return 잘못 사용한 경우. | 높은 | 중간 |
24 | msg-value-loop | 루프 내부의 msg.value | 높은 | 중간 |
25 | reentrancy-eth | 재진입 취약점(이더 도난) | 높은 | 중간 |
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 | 위험한 열거형 변환 감지 | 중간 | 높은 |
32 | erc20-interface | 잘못된 ERC20 인터페이스 | 중간 | 높은 |
33 | erc721-interface | 잘못된 ERC721 인터페이스 | 중간 | 높은 |
34 | incorrect-equality | 위험한 엄격한 평등 | 중간 | 높은 |
35 | locked-ether | 에테르를 잠그는 계약 | 중간 | 높은 |
36 | mapping-deletion | 구조를 포함하는 매핑 시 삭제 | 중간 | 높은 |
37 | shadowing-abstract | 추상 계약의 상태 변수 그림자 | 중간 | 높은 |
38 | tautological-compare | 변수를 자신과 비교하면 비교 결과에 따라 항상 true 또는 false가 반환됩니다. | 중간 | 높은 |
39 | tautology | 동어반복 또는 모순 | 중간 | 높은 |
40 | write-after-write | 미사용 쓰기 | 중간 | 높은 |
41 | boolean-cst | 부울 상수의 오용 | 중간 | 중간 |
42 | constant-function-asm | 어셈블리 코드를 사용한 상수 함수 | 중간 | 중간 |
43 | constant-function-state | 상태를 변경하는 상수 함수 | 중간 | 중간 |
44 | divide-before-multiply | 부정확한 산술 연산 순서 | 중간 | 중간 |
45 | out-of-order-retryable | 순서가 잘못되어 재시도 가능한 트랜잭션 | 중간 | 중간 |
46 | reentrancy-no-eth | 재진입 취약점(이더 도난 없음) | 중간 | 중간 |
47 | reused-constructor | 재사용된 기본 생성자 | 중간 | 중간 |
48 | tx-origin | tx.origin 의 위험한 사용 | 중간 | 중간 |
49 | unchecked-lowlevel | 확인되지 않은 낮은 수준의 통화 | 중간 | 중간 |
50 | unchecked-send | 선택하지 않은 보내기 | 중간 | 중간 |
51 | uninitialized-local | 초기화되지 않은 지역 변수 | 중간 | 중간 |
52 | unused-return | 사용되지 않은 반환 값 | 중간 | 중간 |
53 | incorrect-modifier | 기본값을 반환할 수 있는 수정자 | 낮은 | 높은 |
54 | shadowing-builtin | 내장된 심볼 섀도잉 | 낮은 | 높은 |
55 | shadowing-local | 지역 변수 섀도잉 | 낮은 | 높은 |
56 | uninitialized-fptr-cst | 생성자의 초기화되지 않은 함수 포인터 호출 | 낮은 | 높은 |
57 | variable-scope | 선언 전에 사용된 지역 변수 | 낮은 | 높은 |
58 | void-cst | 호출된 생성자가 구현되지 않았습니다. | 낮은 | 높은 |
59 | calls-loop | 루프의 여러 호출 | 낮은 | 중간 |
60 | events-access | 누락된 이벤트 액세스 제어 | 낮은 | 중간 |
61 | events-maths | 누락된 이벤트 산술 | 낮은 | 중간 |
62 | incorrect-unary | 위험한 단항 표현식 | 낮은 | 중간 |
63 | missing-zero-check | 누락된 0 주소 검증 | 낮은 | 중간 |
64 | reentrancy-benign | 양성 재진입 취약점 | 낮은 | 중간 |
65 | reentrancy-events | 잘못된 순서의 이벤트로 이어지는 재진입 취약점 | 낮은 | 중간 |
66 | return-bomb | 낮은 수준의 수신자는 예기치 않게 모든 발신자의 가스를 소비할 수 있습니다. | 낮은 | 중간 |
67 | timestamp | block.timestamp 의 위험한 사용 | 낮은 | 중간 |
68 | assembly | 조립 사용법 | 정보 제공 | 높은 |
69 | assert-state-change | 상태 변경 주장 | 정보 제공 | 높은 |
70 | boolean-equal | 부울 상수와의 비교 | 정보 제공 | 높은 |
71 | cyclomatic-complexity | 순환 복잡성이 높은(> 11) 기능을 감지합니다. | 정보 제공 | 높은 |
72 | deprecated-standards | 더 이상 사용되지 않는 Solidity 표준 | 정보 제공 | 높은 |
73 | erc20-indexed | 색인화되지 않은 ERC20 이벤트 매개변수 | 정보 제공 | 높은 |
74 | function-init-state | 상태 변수를 초기화하는 함수 | 정보 제공 | 높은 |
75 | incorrect-using-for | 주어진 라이브러리의 함수가 주어진 유형과 일치하지 않을 때 using-for 문 사용을 감지합니다. | 정보 제공 | 높은 |
76 | low-level-calls | 낮은 수준의 통화 | 정보 제공 | 높은 |
77 | missing-inheritance | 누락된 상속 | 정보 제공 | 높은 |
78 | naming-convention | Solidity 명명 규칙 준수 | 정보 제공 | 높은 |
79 | pragma | 다른 pragma 지시문을 사용하는 경우 | 정보 제공 | 높은 |
80 | redundant-statements | 중복된 진술 | 정보 제공 | 높은 |
81 | solc-version | 잘못된 Solidity 버전 | 정보 제공 | 높은 |
82 | unimplemented-functions | 구현되지 않은 기능 | 정보 제공 | 높은 |
83 | unused-import | 사용되지 않은 가져오기를 감지합니다. | 정보 제공 | 높은 |
84 | unused-state | 사용되지 않은 상태 변수 | 정보 제공 | 높은 |
85 | costly-loop | 루프에서 비용이 많이 드는 작업 | 정보 제공 | 중간 |
86 | dead-code | 사용되지 않는 기능 | 정보 제공 | 중간 |
87 | reentrancy-unlimited-gas | 전송 및 전송을 통한 재진입 취약점 | 정보 제공 | 중간 |
88 | too-many-digits | 숫자 표기법 모범 사례 준수 | 정보 제공 | 중간 |
89 | cache-array-length | 루프 조건에서 일부 스토리지 배열의 length 멤버를 사용하는 for 루프를 감지하고 수정하지 않습니다. | 최적화 | 높은 |
90 | constable-states | 상수로 선언될 수 있는 상태 변수 | 최적화 | 높은 |
91 | external-function | 외부에 선언할 수 있는 공용 함수 | 최적화 | 높은 |
92 | immutable-states | 불변으로 선언될 수 있는 상태 변수 | 최적화 | 높은 |
93 | var-read-using-this | 계약은 this 사용하여 자체 변수를 읽습니다. | 최적화 | 높은 |
자세한 내용은 다음을 참조하세요.
human-summary
: 사람이 읽을 수 있는 계약 요약을 인쇄합니다.inheritance-graph
: 각 계약의 상속 그래프를 도트 파일로 내보냅니다.contract-summary
: 계약 요약을 인쇄합니다.loc
: 소스 파일(SRC), 종속성(DEP) 및 테스트 파일(TEST)에서 발견된 코드 라인(LOC), 소스 코드 라인(SLOC) 및 코드 주석 라인(CLOC)의 총 개수를 계산합니다.call-graph
: 계약의 콜그래프를 도트 파일로 내보냅니다.cfg
: 각 함수의 CFG를 내보냅니다.function-summary
: 함수 요약을 인쇄합니다.vars-and-auth
: 작성된 상태 변수와 함수 인증을 인쇄합니다.not-pausable
: whenNotPaused
수정자를 사용하지 않는 함수를 인쇄합니다. 프린터를 실행하려면 --print
와 쉼표로 구분된 프린터 목록을 사용하세요.
전체 목록은 프린터 설명서를 참조하세요.
slither-check-upgradeability
: delegatecall
기반 업그레이드 가능성 검토slither-prop
: 자동 단위 테스트 및 속성 생성slither-flat
: 코드베이스를 평면화slither-check-erc
: ERC의 적합성을 확인합니다.slither-format
: 자동 패치 생성slither-read-storage
: 컨트랙트에서 스토리지 값을 읽습니다.slither-interface
: 계약을 위한 인터페이스를 생성합니다.추가 도구에 대해서는 도구 설명서를 참조하세요.
맞춤형 도구 구축에 대한 도움을 받으려면 당사에 문의하세요.
Slither의 내부에 대한 문서는 여기에서 확인할 수 있습니다.
Slither 사용 또는 확장에 도움이 필요하시면 언제든지 Slack 채널(#ethereum)에 들러주세요.
프린터 문서에는 Slither가 각 계약에 대해 시각화할 수 있는 정보가 설명되어 있습니다.
Detector 문서에서는 새로운 취약점 분석을 작성하는 방법을 설명합니다.
API 문서에서는 사용자 정의 분석에 사용할 수 있는 방법과 개체에 대해 설명합니다.
SlithIR 문서는 SlithIR 중간 표현을 설명합니다.
모의 또는 테스트를 어떻게 제외하나요?
"알 수 없는 파일" 또는 컴파일 문제를 해결하려면 어떻게 해야 합니까?
slither contract.sol
실패합니다. 대신 slither .
contracts/
의 상위 디렉토리에 있습니다( ls
실행하면 contracts/
표시되어야 합니다). node_modules/
폴더가 있는 경우 contracts/
와 동일한 디렉터리에 있어야 합니다. 이 문제가 Slither와 관련이 있는지 확인하려면 사용 중인 프레임워크에 대한 컴파일 명령(예: npx hardhat compile
을 실행하십시오. 성공적으로 작동해야 합니다. 그렇지 않으면 slither의 컴파일 엔진인 crytic-compile이 AST를 생성할 수 없습니다. Slither는 AGPLv3 라이선스에 따라 라이선스가 부여되고 배포됩니다. 약관에 대한 예외를 찾고 있는 경우 당사에 문의하세요.
제목 | 용법 | 저자 | 장소 | 암호 |
---|---|---|---|---|
ReJection: AST 기반 재진입 취약점 탐지 방법 | Slither를 기반으로 구축된 AST 기반 분석 | 루이 마, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
MPro: 스마트 계약의 확장 가능한 테스트를 위해 정적 및 기호 분석 결합 | Slither를 통해 데이터 종속성 활용 | 윌리엄 장, 세바스티안 바네스쿠, 레오다르도 파소스, 스티븐 스튜어트, 비자이 가네쉬 | ISSRE 2019 | MPro |
ETHPLOIT: 퍼징에서 스마트 계약에 대한 효율적인 익스플로잇 생성까지 | Slither를 통해 데이터 종속성 활용 | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | 사네르 20 | - |
이더리움 스마트 계약 검증: 모델 확인 접근 방식 | Slither의 CFG 위에 구축된 상징적 실행 | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
스마트 계약 수리 | Slither의 취약점 감지기에 의존하세요 | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | 토셈 20 | SC수리 |
스마트 계약의 루프 이해하기 | Slither를 통해 데이터 종속성 활용 | 벤 마리아노, 얀주 첸, 유 펭, 슈벤두 라히리, 이실 딜리그 | ASE 20 | - |
스마트 계약 내 루프의 추적 기반 동적 가스 추정 | Slither의 CFG를 사용하여 루프 감지 | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE 오픈 J. 컴퓨팅. Soc. 1 (2020) | - |
SAILFISH: 스마트 계약 상태 불일치 버그를 몇 초 만에 조사 | SlithIR을 사용하여 스토리지 종속성 그래프 구축 | 프리얀카 보스(Priyanka Bose), 디판잔 다스(Dipanjan Das), 얀주 첸(Yanju Chen), 유 펭(Yu Feng), 크리스토퍼 크루겔(Christopher Kruegel), 조반니 비냐(Giovanni Vigna) | S&P 22 | 돛새치 |
SolType: Solidity의 산술 오버플로에 대한 개선 유형 | Slither를 프런트엔드로 사용하여 개선 유형 시스템 구축 | 브라이언 탄, 벤자민 마리아노, 슈벤두 K. 라히리, 이실 딜리그, 유 펭 | 포플 22 | - |
비난하지 마세요: 자동화된 사기 탐지를 위한 머신 러닝 기술 활용 | Slither를 사용하여 토큰의 기능 추출(mintable, pausable, ..) | 마조라, 브루노, 빅터 아단, 바네사 다자 | 수학 10.6 (2022) | - |
MANDO: 스마트 계약 취약점을 세밀하게 탐지하기 위한 다단계 이종 그래프 임베딩 | Slither를 사용하여 CFG 및 호출 그래프 추출 | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan 및 Lingxiao Jiang | IEEE 9차 데이터 과학 및 고급 분석에 관한 국제 컨퍼런스(DSAA, 2022) | ge-sc |
스마트 계약의 가격 폭리 TOD 취약점에 대한 자동 감사 | Slither를 사용하여 CFG 및 데이터 종속성 추출 | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris 및 Fan Long | 2022 IEEE 블록체인 및 암호화폐 국제 컨퍼런스(ICBC) | 스마트 계약 수리 |
스마트 계약에 대한 액세스 제어 정책 모델링 및 시행 | Slither의 데이터 종속성 확장 | 얀-필립 토베르그, 요나스 쉬플, 프레데릭 라이쉬, 베른하르트 베케르트, 로베르트 하인리히, 랄프 로이스너 | 분산형 애플리케이션 및 인프라(DAPPS)에 관한 IEEE 국제 컨퍼런스, 2022 | SolidityAccessControlEnforcement |
딥러닝과 다중모달 의사결정 융합을 기반으로 한 스마트 계약 취약점 탐지 | Slither를 사용하여 CFG 추출 | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng 및 Xuan Hu | 센서 2023, 23, 7246 | - |
스마트 계약 코드 재사용에서 알려지지 않은 내용을 밝히는 의미 강화 코드 지식 그래프 | Slither를 사용하여 코드 특징(CFG, 함수, 매개변수 유형 등)을 추출합니다. | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | 소프트웨어 엔지니어링 및 방법론에 대한 ACM 거래, 2023 | - |
세분화된 상태 액세스를 통한 스마트 계약 병렬 실행 | Slither를 사용하여 상태 액세스 그래프 구축 | 샤오동 치, 자오 자오, 이 리 | 분산 컴퓨팅 시스템(ICDCS)에 관한 국제 컨퍼런스, 2023 | - |
나쁜 사과: 분산형 생태계의 중앙 집중식 보안 위험 이해 | Slither를 기반으로 내부 분석 구현 | Kailun Yan, Jilian Zhang, Xiangyu Liu, Wenrui Diao, Shanqing Guo | ACM 웹 컨퍼런스 2023년 4월 | - |
간격 분석을 사용하여 스마트 계약의 취약점 식별 | Slither 위에 탐지기 4개 만들기 | 슈테판-클라우디우 수잔, 안드레이 아루소아이에 | 2023년부터 | - |
이더리움 블록체인 스마트 계약의 저장 상태 분석 및 추출(공개 액세스에는 PDF 없음) | Slither의 CFG 및 AST를 활용하세요 | 마하 아유브, 타니아 살림, 무하마드 잔주아, 탈하 아마드 | 토셈 2023 | 스마트머브 |
학술 작업에 Slither를 사용하는 경우 Crytic $10,000 연구상 신청을 고려해 보세요.