
Статический анализатор для смарт-контрактов Starknet
Caracal — это инструмент статического анализа на основе представления SIERRA для смарт-контрактов Starknet.
Предварительно собранные бинарные файлы доступны на странице релизов. Если вы используете компилятор Cairo версии 1.x.x, используйте бинарный файл v0.1.x; если вы используете компилятор Cairo версии 2.x.x, используйте v0.2.x.
Вам потребуются компилятор Rust и Cargo. Сборка из репозитория Git:
cargo install --git https://github.com/crytic/caracal --profile release --force
Сборка из локальной копии:
git clone https://github.com/crytic/caracal
cd caracal
cargo install --path . --profile release --force
Список детекторов:
caracal detectors
Список принтеров:
caracal printers
Для использования с отдельным файлом Cairo при наличии локального бинарного файла компилятора Cairo достаточно указать путь к файлу. В противном случае используется встроенный компилятор, и вам нужно указать путь к библиотеке corelib либо с помощью опции --corelib, либо установив переменную окружения CORELIB_PATH.
Запуск детекторов:
caracal detect path/file/to/analyze
caracal detect path/file/to/analyze --corelib path/to/corelib/src
Запуск принтеров:
caracal print path/file/to/analyze --printer printer_to_use --corelib path/to/corelib/src
Если у вас есть проект Cairo с несколькими файлами и контрактами, вам может потребоваться указать конкретные контракты с помощью --contract-path. Если доступен локальный бинарный файл компилятора Cairo, он используется; в противном случае используется встроенный компилятор. В последнем случае также необходимо указать corelib, как описано выше для автономного режима. Путь — это каталог, где находится cairo_project.toml.
Запуск детекторов:
caracal detect path/to/dir
caracal detect path/to/dir --contract-path token::myerc20::... token::myerc721::...
Запуск принтеров:
caracal print path/to/dir --printer printer_to_use
Если у вас есть проект, использующий Scarb, необходимо добавить следующее в Scarb.toml:
[[target.starknet-contract]]
sierra = true
[cairo]
sierra-replace-ids = true
Затем передайте путь к каталогу, где находится Scarb.toml. Запуск детекторов:
caracal detect path/to/dir
Запуск принтеров:
caracal print path/to/dir --printer printer_to_use
| № | Детектор | Что он обнаруживает | Влияние | Уверенность | Cairo |
|---|---|---|---|---|---|
| 1 | controlled-library-call | Библиотечные вызовы с хешом класса, контролируемым пользователем | Высокий | Средняя | 1 & 2 |
| 2 | unchecked-l1-handler-from | Обнаруживает L1-обработчики без проверки адреса отправителя | Высокий | Средняя | 1 & 2 |
| 3 | felt252-unsafe-arithmetic | Обнаруживает операции, контролируемые пользователем, с типом felt252, который не защищает от переполнения/потери значимости | Средний | Средняя | 1 & 2 |
| 4 | reentrancy | Обнаруживает, когда переменная хранилища читается перед внешним вызовом и записывается после | Средний | Средняя | 1 & 2 |
| 5 | read-only-reentrancy | Обнаруживает, когда view-функция читает переменную хранилища, записанную после внешнего вызова | Средний | Средняя | 1 & 2 |
| 6 | unused-events | Определённые, но не эмитированные события | Средний | Средняя | 1 & 2 |
| 7 | unused-return | Неиспользуемые возвращаемые значения | Средний | Средняя | 1 & 2 |
| 8 | unenforced-view | Функция имеет декоратор view, но изменяет состояние | Средний | Средняя | 1 |
| 9 | tx-origin | Обнаруживает использование адреса источника транзакции для контроля доступа | Средний | Средняя | 2 |
| 10 | unused-arguments | Неиспользуемые аргументы | Низкий | Средняя | 1 & 2 |
| 11 | reentrancy-benign | Обнаруживает, когда переменная хранилища записывается после внешнего вызова, но не читается до него | Низкий | Средняя | 1 & 2 |
| 12 | reentrancy-events | Обнаруживает, когда событие эмитируется после внешнего вызова, что приводит к нарушению порядка событий |
Столбец Cairo указывает версию(и) компилятора, для которых применим детектор.
cfg: Экспорт CFG каждой функции в файл .dotcallgraph: Экспорт графа вызовов функций в файл .dotОзнакомьтесь с вики по следующим темам:
| Низкий |
| Средняя |
| 1 & 2 |
| 13 | dead-code | Частные функции, которые никогда не используются | Низкий | Средняя | 1 & 2 |
| 14 | use-after-pop-front | Обнаруживает использование массива или span после удаления элемента(ов) | Низкий | Средняя | 1 & 2 |