
Starknet 스마트 계약을 위한 정적 분석기
Caracal은 Starknet 스마트 계약을 위한 SIERRA 표현에 대한 정적 분석 도구입니다.
사전 컴파일된 바이너리는 릴리스 페이지에서 확인할 수 있습니다. 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 CLI 옵션 또는 CORELIB_PATH 환경 변수를 설정하여 corelib 라이브러리 경로를 전달해야 합니다.
탐지기 실행:
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 열은 해당 탐지기가 유효한 컴파일러 버전을 나타냅니다.
cfg: 각 함수의 CFG를 .dot 파일로 내보내기callgraph: 함수 호출 그래프를 .dot 파일로 내보내기다음 주제에 대한 위키를 확인하십시오:
| 번호 | 탐지기 | 탐지 대상 | 영향 | 신뢰도 | Cairo |
|---|
| 1 | controlled-library-call | 사용자 제어 클래스 해시를 사용한 라이브러리 호출 | 높음 | 중간 | 1 & 2 |
| 2 | unchecked-l1-handler-from | from 주소 확인 없는 L1 핸들러 감지 | 높음 | 중간 | 1 & 2 |
| 3 | felt252-unsafe-arithmetic | overflow/underflow에 안전하지 않은 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 | 외부 호출 후 이벤트가 발생하여 순서가 어긋난 이벤트가 발생하는 경우 감지 | 낮음 | 중간 | 1 & 2 |
| 13 | dead-code | 사용되지 않은 private 함수 | 낮음 | 중간 | 1 & 2 |
| 14 | use-after-pop-front | 요소 제거 후 배열 또는 span 사용 감지 | 낮음 | 중간 | 1 & 2 |