cairo-vulnerability-scanner
Cairo/StarkNetスマートコントラクトを対象に、felt252の算術オーバーフロー、L1-L2メッセージングの問題、アドレス変換の不具合、シグネチャリプレイなど6種類の重大な脆弱性をスキャンします。StarkNetプロジェクトのセキュリティ監査を行う際に使用してください。
description の原文を見る
Scans Cairo/StarkNet smart contracts for 6 critical vulnerabilities including felt252 arithmetic overflow, L1-L2 messaging issues, address conversion problems, and signature replay. Use when auditing StarkNet projects.
SKILL.md 本文
Cairo/StarkNet 脆弱性スキャナー
1. 目的
StarkNet 上の Cairo スマートコントラクトをシステマティックにスキャンして、算術、クロスレイヤーメッセージング、暗号操作に関連するプラットフォーム固有のセキュリティ脆弱性を検出します。このスキルは Cairo/StarkNet エコシステムに固有の 6 つの重大な脆弱性パターンを検出します。
2. このスキルを使用する場面
- StarkNet スマートコントラクト (Cairo) を監査する場合
- L1-L2 ブリッジ実装をレビューする場合
- StarkNet アプリケーション起動前のセキュリティ評価
- クロスレイヤーメッセージハンドリングを検証する場合
- 署名検証ロジックをレビューする場合
- L1 ハンドラー関数を評価する場合
3. プラットフォーム検出
ファイル拡張子とインジケーター
- Cairo ファイル:
.cairo
言語/フレームワークマーカー
// Cairo コントラクトインジケーター
#[contract]
mod MyContract {
use starknet::ContractAddress;
#[storage]
struct Storage {
balance: LegacyMap<ContractAddress, felt252>,
}
#[external(v0)]
fn transfer(ref self: ContractState, to: ContractAddress, amount: felt252) {
// Contract logic
}
#[l1_handler]
fn handle_deposit(ref self: ContractState, from_address: felt252, amount: u256) {
// L1 message handler
}
}
// 一般的なパターン
felt252, u128, u256
ContractAddress, EthAddress
#[external(v0)], #[l1_handler], #[constructor]
get_caller_address(), get_contract_address()
send_message_to_l1_syscall
プロジェクト構成
src/contract.cairo- メインコントラクト実装src/lib.cairo- ライブラリモジュールtests/- コントラクトテストScarb.toml- Cairo プロジェクト設定
ツールサポート
- Caracal: Trail of Bits 製 Cairo 静的解析ツール
- インストール:
pip install caracal - 使用方法:
caracal detect src/ - cairo-test: ビルトインテストフレームワーク
- Starknet Foundry: テストと開発ツールキット
4. このスキルの仕組み
呼び出されると、以下の処理を実行します:
- コードベースをスキャン して Cairo ファイルを検索
- 各コントラクトを分析 して 6 つの脆弱性パターンをチェック
- ファイル参照と深刻度とともに結果を報告
- 特定された各問題の修正案を提供
- L1-L2 インタラクションをチェック してメッセージング脆弱性を検出
5. 出力例
脆弱性が見つかった場合、次のようなレポートが得られます:
=== CAIRO/STARKNET VULNERABILITY SCAN RESULTS ===
6. 脆弱性パターン (6 パターン)
Cairo/Starknet に固有の 6 つの重大な脆弱性パターンをチェックします。検出パターン、コード例、軽減策、テスト戦略の詳細については、VULNERABILITY_PATTERNS.md を参照してください。
パターン概要:
- チェックされない算術演算 ⚠️ 重大 - felt252 の整数オーバーフロー/アンダーフロー
- ストレージ衝突 ⚠️ 重大 - ストレージ変数ハッシュの競合
- アクセス制御の欠落 ⚠️ 重大 - 機密関数での呼び出し元検証がない
- 不適切な Felt252 境界検証 ⚠️ 高 - felt252 範囲を検証していない
- 検証されていないコントラクトアドレス ⚠️ 高 - 信頼できないコントラクトアドレスを使用
- 呼び出し元検証の欠落 ⚠️ 重大 - get_caller_address() チェックがない
完全な脆弱性パターン、コード例については VULNERABILITY_PATTERNS.md を参照してください。
7. スキャン手順
ステップ 1: プラットフォーム識別
- Cairo 言語と StarkNet フレームワークを検証
- Cairo バージョンを確認 (Cairo 1.0+ vs レガシー Cairo 0)
- コントラクトファイルを特定 (
src/*.cairo) - L1-L2 ブリッジコントラクトを識別 (該当する場合)
ステップ 2: 算術安全スイープ
# felt252 の算術使用を検索
rg "felt252" src/ | rg "[-+*/]"
# balance/amount ストレージで felt252 を使用している箇所を検索
rg "felt252" src/ | rg "balance|amount|total|supply"
# u128, u256 を推奨
ステップ 3: L1 ハンドラー分析
各 #[l1_handler] 関数について:
-
from_addressパラメーターを検証 - アドレス != ゼロをチェック
- 適切なアクセス制御がある
- 監視用のイベントを出力
ステップ 4: 署名検証レビュー
署名ベースの関数について:
- ノンス追跡を含む
- 使用後にノンスがインクリメント
- ドメインセパレーターにチェーン ID とコントラクトアドレスを含む
- 署名をリプレイできない
ステップ 5: L1-L2 ブリッジ監査
コントラクトがブリッジ機能を含む場合:
- L1 がアドレス < STARKNET_FIELD_PRIME を検証
- L1 がメッセージキャンセルを実装
- L2 がハンドラーで from_address を検証
- 対称的なアクセス制御 L1 ↔ L2
- 完全なラウンドトリップフローをテスト
ステップ 6: Caracal による静的解析
# Caracal デテクターを実行
caracal detect src/
# 特定のデテクター
caracal detect src/ --detectors unchecked-felt252-arithmetic
caracal detect src/ --detectors unchecked-l1-handler-from
caracal detect src/ --detectors missing-nonce-validation
8. レポート形式
結果テンプレート
## [CRITICAL] L1 ハンドラーでの from_address 未検証
**場所**: `src/bridge.cairo:145-155` (handle_deposit 関数)
**説明**:
`handle_deposit` L1 ハンドラー関数は `from_address` パラメーターを検証しません。任意の L1 コントラクトがこの関数にメッセージを送信でき、意図した L1 ブリッジアクセス制御を回避して任意のユーザーのためにトークンをミントできます。
**脆弱性コード**:
```rust
// bridge.cairo, line 145
#[l1_handler]
fn handle_deposit(
ref self: ContractState,
from_address: felt252, // 検証されていない!
user: ContractAddress,
amount: u256
) {
let current_balance = self.balances.read(user);
self.balances.write(user, current_balance + amount);
}
攻撃シナリオ:
- 攻撃者が悪意のある L1 コントラクトをデプロイ
- 悪意のあるコントラクトが
starknetCore.sendMessageToL2(l2Contract, selector, [attacker_address, 1000000])を呼び出し - L2 ハンドラーが送信者をチェックせずにメッセージを処理
- 攻撃者が資金をデポジットしないで 1,000,000 トークンを受け取る
- プロトコルが無限ミント脆弱性に遭遇
推奨:
from_address を認可された L1 ブリッジに対して検証:
#[l1_handler]
fn handle_deposit(
ref self: ContractState,
from_address: felt252,
user: ContractAddress,
amount: u256
) {
// L1 送信者を検証
let authorized_l1_bridge = self.l1_bridge_address.read();
assert(from_address == authorized_l1_bridge, 'Unauthorized L1 sender');
let current_balance = self.balances.read(user);
self.balances.write(user, current_balance + amount);
}
参考資料:
- building-secure-contracts/not-so-smart-contracts/cairo/unchecked_l1_handler_from
- Caracal デテクター:
unchecked-l1-handler-from
---
## 9. 優先度ガイドライン
### 重大 (即座の修正が必要)
- L1 ハンドラーで from_address が未検証 (無限ミント)
- L1-L2 アドレス変換の問題 (ゼロアドレスへの送金)
### 高 (デプロイ前に修正)
- Felt252 算術オーバーフロー/アンダーフロー (残高操作)
- 署名リプレイ保護の欠落 (リプレイ攻撃)
- L1-L2 メッセージ失敗でキャンセルなし (資金のロック)
### 中 (監査で対応)
- L1-L2 インタラクションの過度な制約 (資金が閉じ込められる)
---
## 10. テスト推奨事項
### ユニットテスト
```rust
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_felt252_overflow() {
// 算術エッジケースをテスト
}
#[test]
#[should_panic]
fn test_unauthorized_l1_handler() {
// 間違った from_address は失敗する必要がある
}
#[test]
fn test_signature_replay_protection() {
// 同じ署名を 2 回使用すると失敗する必要がある
}
}
統合テスト (L1 を含む)
// L1-L2 完全フローをテスト
#[test]
fn test_deposit_withdraw_roundtrip() {
// 1. L1 でデポジット
// 2. L2 処理を待つ
// 3. L2 残高を検証
// 4. L1 に引き出す
// 5. L1 残高が復元されたことを検証
}
Caracal CI インテグレーション
# .github/workflows/security.yml
- name: Run Caracal
run: |
pip install caracal
caracal detect src/ --fail-on high,critical
11. 追加リソース
- Building Secure Contracts:
building-secure-contracts/not-so-smart-contracts/cairo/ - Caracal: https://github.com/crytic/caracal
- Cairo ドキュメント: https://book.cairo-lang.org/
- StarkNet ドキュメント: https://docs.starknet.io/
- OpenZeppelin Cairo Contracts: https://github.com/OpenZeppelin/cairo-contracts
12. クイックリファレンスチェックリスト
Cairo/StarkNet 監査を完了する前に:
算術安全性 (高):
- balance/amount に felt252 を使用していない (u128/u256 を使用)
- OR felt252 算術に明示的な境界チェックがある
- オーバーフロー/アンダーフロー シナリオがテストされている
L1 ハンドラーセキュリティ (重大):
- すべての
#[l1_handler]関数がfrom_addressを検証 - from_address が格納された L1 コントラクトアドレスと比較
- 代替 L1 コントラクトをデプロイしてバイパスできない
L1-L2 メッセージング (高):
- L1 ブリッジがアドレス < STARKNET_FIELD_PRIME を検証
- L1 ブリッジがメッセージキャンセルを実装
- L2 ハンドラーが from_address をチェック
- 対称的な検証ルール L1 ↔ L2
- 完全なラウンドトリップフローがテストされている
署名セキュリティ (高):
- 署名にノンス追跡が含まれている
- 各使用後にノンスがインクリメント
- ドメインセパレーターにチェーン ID とコントラクトアドレスを含む
- 署名リプレイがテストされ、防止されている
- クロスチェーン リプレイが防止されている
ツール使用:
- Caracal スキャンが完了し、重大な結果がない
- ユニットテストがすべての脆弱性シナリオをカバー
- 統合テストが L1-L2 フローを検証
- メインネット前にテストネットデプロイを実施
ライセンス: CC-BY-SA-4.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- trailofbits
- リポジトリ
- trailofbits/skills
- ライセンス
- CC-BY-SA-4.0
- 最終更新
- 不明
Source: https://github.com/trailofbits/skills / ライセンス: CC-BY-SA-4.0
関連スキル
seo-maps
ローカルSEO向けのマップインテリジェンス機能です。ジオグリッドのランク追跡、APIを通じたGBPプロフィール監査、Google・Tripadvisor・Trustpilotなど複数プラットフォームのレビュー分析、Google・Bing・Apple・OSM間のNAP(名前・住所・電話番号)検証、競合他社の半径マッピング、APIデータからのLocalBusinessスキーマ生成が可能です。3段階の機能レベルで対応でき、無料版(Overpass + Geoapify)、DataForSEO(フル機能)、DataForSEO + Google(最大カバレッジ)から選択できます。「maps」「geo-grid」「rank tracking」「GBP audit」「review velocity」「competitor radius」「maps analysis」「local rank tracking」「Share of Local Voice」「SoLV」などのキーワードで利用できます。
seo-content-brief
セクションごとの文字数、競合スコアリング、キーワード密度ガイダンス、ページタイプテンプレートを含む競争力のあるSEOコンテンツブリーフを生成します。新規ページのブリーフと既存ページの改善ブリーフの両方に対応しています。ユーザーが「コンテンツブリーフ」「ブリーフを作成」「コンテンツアウトライン」「ブログブリーフ」「サービスページブリーフ」「ブリーフ〜」「ライティングブリーフ」「コンテンツプラン」「アウトライン〜」などと言った場合に使用します。
rakuten-seo
楽天市場の商品名・キャッチコピーをSEO最適化するスキル。「楽天SEO」「商品名最適化」「楽天の商品名」「キャッチコピー」「楽天のタイトル」「商品名を直して」「楽天検索対策」など、楽天市場の商品名やキャッチコピーの作成・改善・チェックに関するリクエストで必ずこのスキルを使う。既存の商品名の改善も、ゼロからの作成も対応。あらゆるジャンル(食品・ファッション・化粧品・家電・サプリ・インテリア・ベビー・ペット・業務用など)に対応。 【ALSEL独自スキル】株式会社ALSEL が、19年・5,000社超の EC 支援で得たノウハウをもとに開発したオリジナルスキルです。
amazon-seo-jp
Amazon.co.jp商品ページのSEO分析・最適化・自動採点スキル v2.0。 COSMO/Rufus/A10アルゴリズムに基づく採点。セラーセントラル出品レポート(.xlsm)を入力すると、 商品タイトル・箇条書き・検索キーワード・商品説明文を100点満点で採点し、 4項目すべての改善案を日本語で出力する。 トリガー: 「Amazon SEO」「商品ページ採点」「Amazon最適化」 「リスティング改善」「Amazon商品名」「箇条書き改善」 「COSMO対応」「Rufus最適化」「Amazon タイトル」 【ALSEL独自スキル】株式会社ALSEL が、19年・5,000社超の EC 支援で得たノウハウをもとに開発したオリジナルスキルです。
rakuten-bulk-control-csv
楽天RMSの一括登録/一括除外/一括更新用CSV(コントロールカラム,商品管理番号 の2列フォーマット)を作成するスキル。商品DL CSV・商品管理画面のコピペ・Excel・PDFなどから商品管理番号を抽出し、Shift-JIS+LF改行で出力する。「一括除外リスト作って」「楽天の除外CSV」「コントロールカラムnで」「2800円以下の商品をdで」「在庫0の商品を一括削除」「商品管理番号抜いてshift-jsで」「このフォーマットで」など、楽天RMSの商品一括処理用CSVを作るタスクで必ずこのスキルを使う。コントロールカラム値(n=新規/d=削除/u=更新)と抽出条件(全件・価格・在庫・販売状態など)をユーザー指示に応じて柔軟に切り替える。 【ALSEL独自スキル】株式会社ALSEL が、19年・5,000社超の EC 支援で得たノウハウをもとに開発したオリジナルスキルです。
amazon-a-plus-content-brief
Amazon A+コンテンツの構成・モジュール選定・画像指示・比較表・FAQを設計するスキル。「A+コンテンツ作って」「Aプラス構成」「ブランドストーリー」「比較表つきA+」「A+モジュール選定」「Amazonのページに画像入れたい」「A+のヘッダー画像」「A+コンテンツマネージャー」など、Amazon A+コンテンツの企画・設計・改善のリクエストで必ずこのスキルを使う。ベーシック17モジュール/Premium追加機能/画像サイズ規定/文字数目安/審査リジェクト要因を踏まえて、デザイナーに渡せるブリーフ形式で出力。あらゆるジャンル(家電・コスメ・食品・アパレル・日用品・ベビー・ペット等)に対応。※ブランドストア(マルチページ)の設計は別スキル `amazon-brand-store-planner`、タイトル・bullet改善は `amazon-title-bullet-rewriter-jp`、メイン画像のチェックは `amazon-main-image-checker`。 【ALSEL独自スキル】株式会社ALSEL が、19年・5,000社超の EC 支援で得たノウハウをもとに開発したオリジナルスキルです。