
Churle - автоматический статический анализатор для почти умных контрактов в ржавчине. Это может помочь найти десятки различных уязвимостей в почти умных контрактах. По словам Дефолламы, среди 10 лучших дапсов вблизи 8 проверяются BlockSec. Благодаря богатому опыту аудита и глубоким пониманием ближнего протокола мы строим этот инструмент и делимся им с сообществом.
Установите необходимые инструментальные наборы со следующими командами для Churle In Linux. Команды тестируются в 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 чтобы дметировать детекторы, реализованные для указанного NEP (см. Группы детекторов NEP)output : Путь, ./audit-result котором отчеты по аудиту будут генерироваться. ПРИМЕЧАНИЕ. Если код целевого бита ( .bc Binary), созданный Cargo, не находится в $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-reportОтчет CSV-формата будет получен в каталоге "./Audit-result".
Все уязвимости могут найти.
| Идентификатор детектора | Описание | Тяжесть |
|---|---|---|
unhandled-promise | Найдите Promises , которые не обрабатываются | Высокий |
non-private-callback | Отсутствует макрос #[private] для функций обратного вызова | Высокий |
reentrancy | Найти функции, которые уязвимы для повторной атаки | Высокий |
unsafe-math | Отсутствие проверки переполнения на арифметическую операцию | Высокий |
self-transfer | Отсутствует чек sender != receiver | Высокий |
incorrect-json-type | Неправильный тип, используемый в параметрах или возвращаемых значениях | Высокий |
unsaved-changes | Изменения в коллекциях не сохранены | Высокий |
nft-approval-check | Найти nft_transfer без проверки approval id | Высокий |
nft-owner-check | Найдите функции одобрения или отозвать без проверки владельца | Высокий |
div-before-mul | точность потери из -за неправильного заказа эксплуатации | Середина |
round | округление без указания ceil или пола | Середина |
lock-callback | Паника в функции обратного вызова может блокировать контракт | Середина |
yocto-attach | Нет assert_one_yocto в привилегированной функции | Середина |
dup-collection-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 | Найдите все публичные интерфейсы | Информация |
Помимо групп по уровню серьезности, ruxle предоставляет некоторые группы детекторов соответствующим NEP. В настоящее время rustle поддерживает следующие группы.
| Непа | Идентификатор группы детекторов | Идентификаторы детектора |
|---|---|---|
| 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 ).Шелеска можно использовать в процессе разработки, чтобы итеративно сканировать почти умные контракты. Это может сэкономить много ручных усилий и смягчить часть потенциальных проблем. Тем не менее, уязвимости в сложной логике или связанных с семантикой по -прежнему являются ограничением шелеста . Расположение сложных семантических проблем требует, чтобы эксперты в BlockSec провели исчерпывающие и тщательные обзоры. Свяжитесь с нами для аудита.
Этот проект находится под лицензией AGPLV3. См. Файл лицензии для полного текста лицензии.