ton-vulnerability-scanner
TON(The Open Network)のスマートコントラクトを対象に、整数値のbool誤用・偽Jettonコントラクト・ガスチェックなしのTON転送の3種類の重大な脆弱性を検出します。FunCコントラクトのセキュリティ監査時に使用してください。
description の原文を見る
Scans TON (The Open Network) smart contracts for 3 critical vulnerabilities including integer-as-boolean misuse, fake Jetton contracts, and forward TON without gas checks. Use when auditing FunC contracts.
SKILL.md 本文
TON脆弱性スキャナー
1. 目的
FunCで記述されたTONブロックチェーンスマートコントラクトを、ブール論理、Jettonトークン処理、ガス管理に関連するプラットフォーム固有のセキュリティ脆弱性について体系的にスキャンします。このスキルはTONのアーキテクチャに固有の3つの重大な脆弱性パターンをエンコードしています。
2. このスキルを使用する場合
- TONスマートコントラクト(FunC言語)の監査
- Jettonトークン実装のレビュー
- トークン転送通知ハンドラーの検証
- TON dAppsの本番前セキュリティ評価
- ガス転送ロジックのレビュー
- ブール条件処理の評価
3. プラットフォーム検出
ファイル拡張子とインジケーター
- FunCファイル:
.fc,.func
言語/フレームワークマーカー
;; FunC contract indicators
#include "imports/stdlib.fc";
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
;; Contract logic
}
() recv_external(slice in_msg) impure {
;; External message handler
}
;; Common patterns
send_raw_message()
load_uint(), load_msg_addr(), load_coins()
begin_cell(), end_cell(), store_*()
transfer_notification operation
op::transfer, op::transfer_notification
.store_uint().store_slice().store_coins()
プロジェクト構造
contracts/*.fc- FunCコントラクトソースwrappers/*.ts- TypeScriptラッパーtests/*.spec.ts- コントラクトテストton.config.tsまたはwasm.config.ts- TONプロジェクト設定
ツールサポート
- TON Blueprint: TON用開発フレームワーク
- toncli: TONコントラクト用CLIツール
- ton-compiler: FunCコンパイラー
- 手動レビュー(自動化ツールは限定的)
4. このスキルの仕組み
起動すると、以下を実行します:
- コードベースを検索してFunC/Tactコントラクトを探す
- 各コントラクトを分析して3つの脆弱性パターンを調査
- 検出結果をレポートしてファイル参照と重大度を表示
- 各問題の修正方法を提供
- リプレイプロテクションと送信者検証をチェック
5. 出力例
脆弱性が見つかった場合、以下のようなレポートが出力されます:
=== TON VULNERABILITY SCAN RESULTS ===
Project: my-ton-contract
Files Scanned: 3 (.fc, .tact)
Vulnerabilities Found: 2
---
[CRITICAL] Missing Replay Protection
File: contracts/wallet.fc:45
Pattern: No sequence number or nonce validation
---
## 5. 脆弱性パターン(3パターン)
TONに固有の3つの重大な脆弱性パターンをチェックします。詳細な検出パターン、コード例、対応策、テスト戦略については、[VULNERABILITY_PATTERNS.md](resources/VULNERABILITY_PATTERNS.md)を参照してください。
### パターン概要:
1. **送信者チェックの欠落** ⚠️ CRITICAL - 特権操作の送信者検証なし
2. **整数オーバーフロー** ⚠️ CRITICAL - FunCの未チェック算術演算
3. **不適切なガス処理** ⚠️ HIGH - ガス予約不足
完全な脆弱性パターン、コード例については、[VULNERABILITY_PATTERNS.md](resources/VULNERABILITY_PATTERNS.md)を参照してください。
## 5. スキャンワークフロー
### ステップ1: プラットフォーム識別
1. FunC言語を確認(`.fc`または`.func`ファイル)
2. TON Blueprintまたはtoncliプロジェクト構造を確認
3. コントラクトソースファイルを特定
4. Jetton関連コントラクトを識別
### ステップ2: ブール論理レビュー
```bash
# Find boolean-like variables
rg "int.*is_|int.*has_|int.*flag|int.*enabled" contracts/
# Check for positive integers used as booleans
rg "= 1;|return 1;" contracts/ | grep -E "is_|has_|flag|enabled|valid"
# Look for NOT operations on boolean-like values
rg "~.*\(|~ " contracts/
各ブール値について:
- -1を真に、0を偽に使用
- 1または他の正の整数を使用していない
- 論理操作が正しく機能する
ステップ3: Jettonハンドラー分析
# Find transfer_notification handlers
rg "transfer_notification|op::transfer_notification" contracts/
各Jettonハンドラーについて:
- 送信者アドレスを検証
- 送信者が保存されたJettonウォレットアドレスと照合されている
- 送信者検証なしにforward_payloadを信頼できない
- Jettonウォレットアドレスを設定するadmin関数を持つ
ステップ4: ガス/転送額レビュー
# Find forward amount usage
rg "forward_ton_amount|forward_amount" contracts/
rg "load_coins\(\)" contracts/
# Find send_raw_message calls
rg "send_raw_message" contracts/
各アウトゴーイングメッセージについて:
- 転送額が固定/制限されている
- またはユーザー提供額がmsg_valueに対して検証されている
- コントラクト残高を枯渇させることができない
- 適切なsend_raw_messageフラグを使用
ステップ5: 手動レビュー
TONコントラクトは徹底的な手動レビューが必要です:
~,&,|演算子でのブール論理- メッセージパースと検証
- ガス経済とフィー計算
- ストレージ操作とデータシリアライズ
6. レポート形式
検出結果テンプレート
## [CRITICAL] 偽のJettonコントラクト - 送信者検証の欠落
**場所**: `contracts/staking.fc:85-95` (recv_internal, transfer_notification ハンドラー)
**説明**:
`transfer_notification`操作ハンドラーは、送信者が予想されるJettonウォレットコントラクトであることを検証しません。任意の攻撃者が偽の`transfer_notification`メッセージを送信し、実際にJettonをデポジットせずに、トークンを転送したと主張してクレジットを得ることができます。
**脆弱なコード**:
```func
// staking.fc, line 85
if (op == op::transfer_notification) {
int jetton_amount = in_msg_body~load_coins();
slice from_user = in_msg_body~load_msg_addr();
;; WRONG: No validation of sender_address!
;; Attacker can claim any jetton_amount
credit_user(from_user, jetton_amount);
}
攻撃シナリオ:
- 攻撃者が悪意あるコントラクトをデプロイ
- 悪意あるコントラクトがスキャッツングコントラクトに
transfer_notificationメッセージを送信 - メッセージが1,000,000 Jettonsの転送を主張
- スキャッツングコントラクトが送信者をチェックせずに攻撃者をクレジット
- 攻撃者はデポジットなしで引き出しまたはメリットを得られる
概念実証:
// Attacker sends fake transfer_notification
const attackerContract = await blockchain.treasury("attacker");
await stakingContract.sendInternalMessage(attackerContract.getSender(), {
op: OP_CODES.TRANSFER_NOTIFICATION,
jettonAmount: toNano("1000000"), // Fake amount
fromUser: attackerContract.address,
});
// Attacker successfully credited without sending real Jettons
const balance = await stakingContract.getUserBalance(attackerContract.address);
expect(balance).toEqual(toNano("1000000")); // Attack succeeded
推奨事項: 期待されるJettonウォレットアドレスを保存して送信者を検証してください:
global slice jetton_wallet_address;
() recv_internal(...) impure {
load_data(); ;; Load jetton_wallet_address from storage
slice cs = in_msg_full.begin_parse();
int flags = cs~load_uint(4);
slice sender_address = cs~load_msg_addr();
int op = in_msg_body~load_uint(32);
if (op == op::transfer_notification) {
;; CRITICAL: Validate sender
throw_unless(error::wrong_jetton_wallet,
equal_slices(sender_address, jetton_wallet_address));
int jetton_amount = in_msg_body~load_coins();
slice from_user = in_msg_body~load_msg_addr();
;; Safe to credit user
credit_user(from_user, jetton_amount);
}
}
参考資料:
- building-secure-contracts/not-so-smart-contracts/ton/fake_jetton_contract
---
## 7. 優先度ガイドライン
### Critical(即座の修正が必要)
- 偽のJettonコントラクト(不正な鋳造/クレジット)
### High(本番前に修正)
- 整数型ブール値(論理エラー、壊れた条件)
- ガスチェックなしのTON転送(残高枯渇)
---
## 8. テスト推奨事項
### ユニットテスト
```typescript
import { Blockchain } from "@ton/sandbox";
import { toNano } from "ton-core";
describe("Security tests", () => {
let blockchain: Blockchain;
let contract: Contract;
beforeEach(async () => {
blockchain = await Blockchain.create();
contract = blockchain.openContract(await Contract.fromInit());
});
it("should use correct boolean values", async () => {
// Test that TRUE = -1, FALSE = 0
const result = await contract.getFlag();
expect(result).toEqual(-1n); // True
expect(result).not.toEqual(1n); // Not 1!
});
it("should reject fake jetton transfer", async () => {
const attacker = await blockchain.treasury("attacker");
const result = await contract.send(
attacker.getSender(),
{ value: toNano("0.05") },
{
$$type: "TransferNotification",
query_id: 0n,
amount: toNano("1000"),
from: attacker.address,
}
);
expect(result.transactions).toHaveTransaction({
success: false, // Should reject
});
});
it("should validate gas for forward amount", async () => {
const result = await contract.send(
user.getSender(),
{ value: toNano("0.01") }, // Insufficient gas
{
$$type: "Transfer",
to: recipient.address,
forward_ton_amount: toNano("1"), // Trying to forward 1 TON
}
);
expect(result.transactions).toHaveTransaction({
success: false,
});
});
});
統合テスト
// Test with real Jetton wallet
it("should accept transfer from real jetton wallet", async () => {
// Deploy actual Jetton minter and wallet
const jettonMinter = await blockchain.openContract(JettonMinter.create());
const userJettonWallet = await jettonMinter.getWalletAddress(user.address);
// Set jetton wallet in contract
await contract.setJettonWallet(userJettonWallet);
// Real transfer from Jetton wallet
const result = await userJettonWallet.sendTransfer(
user.getSender(),
contract.address,
toNano("100"),
{}
);
expect(result.transactions).toHaveTransaction({
to: contract.address,
success: true,
});
});
9. 追加リソース
- Building Secure Contracts:
building-secure-contracts/not-so-smart-contracts/ton/ - TON Documentation: https://docs.ton.org/
- FunC Documentation: https://docs.ton.org/develop/func/overview
- TON Blueprint: https://github.com/ton-org/blueprint
- Jetton Standard: https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md
10. クイックリファレンスチェックリスト
TONコントラクト監査完了前に:
ブール論理(HIGH):
- すべてのブール値が-1(真)と0(偽)を使用
- ブール値として正の整数(1, 2など)を使用していない
- ブール値を返す関数が真に-1を返す
-
~,&,|演算子でのブール論理が正しい値を使用 - テストがブール操作を正しく機能することを検証
Jettonセキュリティ(CRITICAL):
-
transfer_notificationハンドラーが送信者アドレスを検証 - 送信者が保存されたJettonウォレットアドレスと照合されている
- Jettonウォレットアドレスが初期化時に保存されている
- Jettonウォレットを設定/更新するadmin関数を持つ
- 送信者検証なしにforward_payloadを信頼できない
- 偽のJettonコントラクトでのテストが却下を検証
ガスと転送額(HIGH):
- TON転送額が固定/制限されている
- またはユーザー提供額が検証されている:
msg_value >= tx_fee + forward_amount - コントラクト残高が枯渇から保護されている
- 適切な
send_raw_messageフラグを使用 - テストが過度な転送額でコントラクトを枯渇させることができないことを検証
テスト:
- 3つの脆弱性タイプすべてのユニットテスト
- 実際のJettonコントラクトとの統合テスト
- すべての操作のガスコスト分析
- テストネットでの本番前デプロイ
ライセンス: CC-BY-SA-4.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- trailofbits
- リポジトリ
- trailofbits/skills
- ライセンス
- CC-BY-SA-4.0
- 最終更新
- 不明
Source: https://github.com/trailofbits/skills / ライセンス: CC-BY-SA-4.0
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。