
Rustle은 Rust에서 거의 스마트 계약을위한 자동 정적 분석기입니다. 근접한 현명한 계약에서 수십 가지 다양한 취약점을 찾는 데 도움이 될 수 있습니다. Defillama에 따르면, 가까운 상위 10 개 DAPP 중 8 개는 Blocksec에 의해 감사됩니다. 풍부한 감사 경험과 가까운 프로토콜에 대한 깊은 이해를 통해이 도구를 구축하고 커뮤니티와 공유합니다.
Linux의 Rossle 에 대한 다음 명령으로 필요한 툴킷을 설치하십시오. 명령은 Ubuntu 20.04 LTS에서 테스트됩니다.
# install Rust Toolchain
curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# install LLVM 15
sudo bash -c " $( wget -O - https://apt.llvm.org/llvm.sh ) " 15
# install Python toolchain
sudo apt install python3 python3-pip # requires python >= 3.8
pip3 install -r utils/requirements.txt # you need to clone this repo first
# add WASM target
rustup target add wasm32-unknown-unknown
# install other components
sudo apt install figlet
cargo install rustfilt
# [optional] useful tools for developing
LLVM_VERSION=
sudo apt install clangd- $LLVM_VERSION clang-format- $LLVM_VERSION clang-tidy- $LLVM_VERSION 다음 명령은 MACOS를 사용하는 사용자를위한 것이므로 Apple Silicon Mac에서만 테스트되므로주의해서 사용하십시오.
# install Rust Toolchain
curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# install LLVM 15
brew install llvm@15
# install Python packages
pip3 install -r utils/requirements.txt # you need to clone this repo first
# using macOS default python3
# add WASM target
rustup target add wasm32-unknown-unknown
# install other components
brew install figlet coreutils gsed
cargo install rustfilt우리는 Docker 솔루션을 제공합니다.
# build the image
docker build --build-arg UID= ` id -u ` --build-arg GID= ` id -g ` -t rustle .
# run a container from the image
docker run --name rustle -it -v ` pwd ` :/rustle -w /rustle rustle bash
# exec the container
docker start rustle
docker exec -it -w /rustle rustle bash./rustle [-t | --tg_dir < tg_dir > ] [-d | --detector < detector_list > ] [-o | --output < output_dir > ] [-h | --help] < src_dir >src_dir : 계약 소스로가는 경로.tg_dir : 계약 빌드 대상의 경로. 기본값은 src_dir 와 동일합니다.detector : 검출기 목록. 그것은 여러 검출기 또는 그룹 에 의해 분리 된 그룹을 통과하는 데 사용할 수 있습니다 , all 에게 기본값.all 그룹을 통과하여 모든 탐지기를 활성화하십시오.high , medium , low 및 info 그룹을 통과하여 심각도가 다른 탐지기 그룹을 가능하게합니다 (탐지기 참조)nep-ft , nep-storage 및 nep-nft 그룹을 통과하십시오.output : 감사 보고서가 ./audit-result 로 기본값을 생성하는 경로. 참고 :화물에 의해 구축 된 대상 비트 코드 ( .bc Binary)가 $src_dir 에 있지 않은 경우 -t|--tg_dir 사용하여 대상의 디렉토리를 설정하거나 기본적으로 $src_dir 로 설정됩니다.
아래 명령은 선형을 분석하는 예를 보여줍니다.
# clone LiNEAR
git clone https://github.com/linear-protocol/LiNEAR.git ~ /near-repo/LiNEAR
# run Rustle
./rustle -t ~ /near-repo/LiNEAR ~ /near-repo/LiNEAR/contracts/linear
# [optional] run Rustle on specified detectors or severity groups and save audit reports in `~/linear-report`
./rustle -t ~ /near-repo/LiNEAR ~ /near-repo/LiNEAR/contracts/linear -d high,medium,complex-loop -o ~ /linear-reportCSV 형식 보고서는 디렉토리 "./audit-Result"에서 생성됩니다.
모든 취약점이 Rostle을 찾을 수 있습니다.
| 탐지기 ID | 설명 | 심각성 |
|---|---|---|
unhandled-promise | 처리되지 않은 Promises 찾으십시오 | 높은 |
non-private-callback | 콜백 함수의 경우 매크로 #[private] 누락 | 높은 |
reentrancy | 재창조 공격에 취약한 기능을 찾으십시오 | 높은 |
unsafe-math | 산술 작동에 대한 오버플로 점검 부족 | 높은 |
self-transfer | sender != receiver | 높은 |
incorrect-json-type | 매개 변수 또는 반환 값에 사용되는 잘못된 유형 | 높은 |
unsaved-changes | 컬렉션 변경은 저장되지 않습니다 | 높은 |
nft-approval-check | approval id 확인하지 않고 nft_transfer 찾으십시오 | 높은 |
nft-owner-check | 소유자 확인없이 승인 또는 취소 기능을 찾으십시오 | 높은 |
div-before-mul | 잘못된 작동 순서로 인한 정밀 손실 | 중간 |
round | 천장이나 바닥을 지정하지 않고 반올림 | 중간 |
lock-callback | 콜백 함수의 공황은 계약을 잠글 수 있습니다 | 중간 |
yocto-attach | 권한있는 기능에서 assert_one_yocto 없습니다 | 중간 |
dup-collection-id | 중복 ID는 컬렉션에 사용됩니다 | 중간 |
unregistered-receiver | 등록되지 않은 전송 수신기에는 공황이 없습니다 | 중간 |
nep${id}-interface | 구현되지 않은 모든 NEP 인터페이스를 찾으십시오 | 중간 |
prepaid-gas | ft_transfer_call 에서 선불 가스 점검 누락 | 낮은 |
non-callback-private | Macro #[private] 비 통화 기능에 사용됩니다 | 낮은 |
unused-ret | 기능 결과를 사용하거나 확인하지 않았습니다 | 낮은 |
upgrade-func | 계약에서 업그레이드 기능이 없습니다 | 낮은 |
tautology | 조건부 지점에서 사용되는 대상 | 낮은 |
storage-gas | 저장 확장에 대한 잔액 검사 누락 | 낮은 |
unclaimed-storage-fee | 저장 전지가 등록되지 않기 전에 잔액 검사 누락 | 낮은 |
inconsistency | 비슷하지만 약간 다른 기호의 사용 | 정보 |
timestamp | timestamp 의 모든 사용을 찾으십시오 | 정보 |
complex-loop | 복잡한 논리가있는 모든 루프를 찾아 DOS로 이어질 수 있습니다. | 정보 |
ext-call | 모든 크로스 계약 호출을 찾으십시오 | 정보 |
promise-result | 약속 결과의 모든 용도를 찾으십시오 | 정보 |
transfer | 모든 전송 조치를 찾으십시오 | 정보 |
public-interface | 모든 공개 인터페이스를 찾으십시오 | 정보 |
심각도 수준의 그룹과는 별도로 Rustle은 해당 NEP에 의해 일부 탐지기 그룹을 제공합니다. 현재 Rustle은 다음 그룹을 지원합니다.
| NEP | 탐지기 그룹 ID | 탐지기 ID |
|---|---|---|
| NEP-141 | nep-ft | nep141-interface , self-transfer , unregistered-receiver |
| NEP-145 | nep-storage | nep145-interface , unclaimed-storage-fee |
| NEP-171, NEP-178 | nep-nft | nep171-interface , nft-approval-check , nft-owner-check |
audit 대상의 종속성 및 이름을 ./rustle 스크립트의 탐지기 목록 및 심각도 그룹에 대상에 추가하십시오.audit.py 의 다른 감지기 코드 참조).Rustle은 개발 프로세스에서 사용하여 거의 스마트 계약을 반복적으로 스캔 할 수 있습니다. 이를 통해 많은 수동 노력을 절약하고 잠재적 인 문제의 일부를 완화 할 수 있습니다. 그러나 복잡한 논리 또는 의미와 관련된 취약점은 여전히 Rustle 의 한계입니다. 복잡한 의미 론적 문제를 찾으려면 Blocksec의 전문가가 철저하고 철저한 검토를 수행해야합니다. 감사 서비스는 당사에 문의하십시오.
이 프로젝트는 AGPLV3 라이센스에 따라 있습니다. 전체 라이센스 텍스트는 라이센스 파일을 참조하십시오.