Agent Skills by ALSEL
Anthropic Claudeセキュリティ⭐ リポ 0品質スコア 50/100

v4-security-foundations

Uniswap v4のフック開発におけるセキュリティを最優先に対応するスキルです。「v4 hooks」「hook security」「PoolManager」「beforeSwap」「afterSwap」などのキーワードが挙がった際や、V4フックのベストプラクティス・脆弱性・監査要件について質問があった場合に使用します。

description の原文を見る

Security-first Uniswap v4 hook development. Use when user mentions "v4 hooks", "hook security", "PoolManager", "beforeSwap", "afterSwap", or asks about V4 hook best practices, vulnerabilities, or audit requirements.

SKILL.md 本文

v4 Hook セキュリティ基礎

Uniswap v4 hooks を構築するためのセキュリティ第一ガイド。Hook の脆弱性はユーザー資金を流出させる可能性があります。Hook コードを記述する前に、これらの概念を理解してください。

脅威モデル

コードを記述する前に、v4 セキュリティコンテキストを理解してください:

脅威領域説明緩和策
呼び出し元検証PoolManager のみが hook 関数を呼び出すべきmsg.sender == address(poolManager) を確認
送信元IDmsg.sender は常に PoolManager で、エンドユーザーではないsender パラメータでユーザー ID を使用
ルーターコンテキストsender パラメータはルーターを識別し、ユーザーではないルーター許可リストを実装
状態露出Hook 状態はトランザクション実行中に読み取り可能機密データをオンチェーンに保存しない
リエントランシー表面Hook からの外部呼び出しでリエントランシーが可能リエントランシーガード を使用; 外部呼び出しを最小化

パーミッションフラグリスクマトリックス

すべての 14 個の hook パーミッションと関連するリスクレベル:

パーミッションフラグリスクレベル説明セキュリティ上の注意
beforeInitializeプール作成前に呼び出されるプール パラメータを検証
afterInitializeプール作成後に呼び出される状態初期化に安全
beforeAddLiquidityLP 預金前に呼び出される正当な LP をブロック可能
afterAddLiquidityLP 預金後に呼び出される追跡/報酬に安全
beforeRemoveLiquidityLP 引き出し前に呼び出されるユーザー資金をトラップ可能
afterRemoveLiquidityLP 引き出し後に呼び出される追跡に安全
beforeSwapスワップ実行前に呼び出される価格を操作可能
afterSwapスワップ実行後に呼び出される最終状態を観察可能
beforeDonateドネーション前に呼び出されるアクセス制御のみ
afterDonateドネーション後に呼び出される追跡に安全
beforeSwapReturnDelta致命的カスタムスワップ額を返すNoOp 攻撃ベクトル
afterSwapReturnDeltaスワップ後額を変更価値を抽出可能
afterAddLiquidityReturnDeltaLP トークン額を変更LP を過少請求可能
afterRemoveLiquidityReturnDelta引き出し額を変更資金を盗む可能

リスク閾値

  • : 資金喪失の可能性は低い
  • : 慎重な実装が必要
  • : 不適切な実装で資金喪失が発生する可能性
  • 致命的: 完全な資金盗難を可能にする

致命的: NoOp ラグプル攻撃

BEFORE_SWAP_RETURNS_DELTA パーミッション (ビット 10) は最も危険な hook パーミッションです。悪意のある hook は次のことができます:

  1. スワップ全体を処理したと主張するデルタを返す
  2. PoolManager がこれを受け入れ、トレードを決済する
  3. Hook はアウトプットを提供せずにすべての入力トークンを保持する
  4. ユーザーはスワップ全額を失う

攻撃パターン

// 悪意のある - 使用しないこと
function beforeSwap(
    address,
    PoolKey calldata,
    IPoolManager.SwapParams calldata params,
    bytes calldata
) external override returns (bytes4, BeforeSwapDelta, uint24) {
    // スワップを処理すると主張しながらトークンを盗む
    int128 amountSpecified = int128(params.amountSpecified);
    BeforeSwapDelta delta = toBeforeSwapDelta(amountSpecified, 0);
    return (BaseHook.beforeSwap.selector, delta, 0);
}

検出

beforeSwapReturnDelta: true を持つ ANY hook と相互作用する前に:

  1. Hook コードを監査 - 正当な用途を検証
  2. 所有権を確認 - アップグレード可能か? 誰が?
  3. 実績を確認 - 評判の良い企業による監査を受けているか?
  4. 小額から始める - 最初に最小額でテスト

正当な使用

NoOp パターンは以下に有効です:

  • Just-in-time liquidity (JIT)
  • カスタム AMM カーブ
  • インテントベース取引システム
  • RFQ/PMM 統合

ただし、各々は慎重な実装と監査が必要です。

デルタ会計の基礎

v4 は PoolManager を通じたクレジット/デビットシステムを使用します:

コアイン変量

すべてのトランザクションについて: sum(deltas) == 0

PoolManager は各アドレスが何を負っているか、何を受け取るべきかを追跡します。トランザクション終了時に、すべての債務を決済する必要があります。

主要な関数

関数目的方向
take(currency, to, amount)PoolManager からトークンを引き出すトークンを受け取る
settle(currency)PoolManager にトークンを支払うトークンを送信する
sync(currency)PoolManager 残高追跡を更新settle の準備

決済パターン

// 正しいパターン: settle 前に sync
poolManager.sync(currency);
currency.transfer(address(poolManager), amount);
poolManager.settle(currency);

よくある間違い

  1. sync の忘却: sync がないと決済が失敗
  2. 順序が違う: sync → transfer → settle の順序が必須
  3. 部分的な決済: トランザクションを無効な状態のままにする
  4. 二重決済: 会計エラーを引き起こす

アクセス制御パターン

PoolManager 検証

すべての hook コールバックは呼び出し元を検証する必要があります:

modifier onlyPoolManager() {
    require(msg.sender == address(poolManager), "Not PoolManager");
    _;
}

function beforeSwap(
    address sender,
    PoolKey calldata key,
    IPoolManager.SwapParams calldata params,
    bytes calldata hookData
) external override onlyPoolManager returns (bytes4, BeforeSwapDelta, uint24) {
    // 安全に続行可能
}

なぜこれが重要か

このチェックなしでは:

  • 誰でも直接 hook 関数を呼び出せる
  • 攻撃者は hook 状態を操作できる
  • 偽の callback を通じて資金が流出する可能性

ルーター検証パターン

sender パラメータはエンドユーザーではなくルーターです。ユーザー ID が必要な hook の場合:

許可リストパターン

mapping(address => bool) public allowedRouters;

function beforeSwap(
    address sender,  // これはルーター
    PoolKey calldata key,
    IPoolManager.SwapParams calldata params,
    bytes calldata hookData
) external override onlyPoolManager returns (bytes4, BeforeSwapDelta, uint24) {
    require(allowedRouters[sender], "Router not allowed");
    // スワップを続行
}

hookData 経由でのユーザー ID

function beforeSwap(
    address sender,
    PoolKey calldata key,
    IPoolManager.SwapParams calldata params,
    bytes calldata hookData
) external override onlyPoolManager returns (bytes4, BeforeSwapDelta, uint24) {
    // hookData からユーザー アドレスをデコード (ルーターがそれを含める必要がある)
    address user = abi.decode(hookData, (address));
    // 注意: ルーターは正確なユーザーを提供するために信頼される必要があります
}

msg.sender トラップ

// 間違い - hook では msg.sender は常に PoolManager
function beforeSwap(...) external {
    require(msg.sender == someUser); // 常に失敗するか、間違い
}

// 正しい - sender パラメータを使用
function beforeSwap(address sender, ...) external {
    require(allowedRouters[sender], "Invalid router");
}

トークン処理の危険性

すべてのトークンが標準的な ERC-20 のように動作するわけではありません:

トークンタイプ危険性緩和策
手数料転送受け取り額 < 送信額実際の残高変化を測定
リベース転送なしで残高が変化生の残高の保存を避ける
ERC-777トランザファー callback でリエントランシー可能リエントランシー ガードを使用
一時停止可能転送がブロック可能転送失敗を優雅に処理
ブロックリスト特定のアドレスがブロック本番アドレスでテスト
低デシマル計算での精度喪失適切なスケーリングを使用

安全な残高チェック パターン

function safeTransferIn(
    IERC20 token,
    address from,
    uint256 amount
) internal returns (uint256 received) {
    uint256 balanceBefore = token.balanceOf(address(this));
    token.safeTransferFrom(from, address(this), amount);
    received = token.balanceOf(address(this)) - balanceBefore;
}

ベース Hook テンプレート

すべてのパーミッションを無効化した状態で開始します。必要なもののみを有効化:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import {BaseHook} from "v4-periphery/src/base/hooks/BaseHook.sol";
import {Hooks} from "v4-core/src/libraries/Hooks.sol";
import {IPoolManager} from "v4-core/src/interfaces/IPoolManager.sol";
import {PoolKey} from "v4-core/src/types/PoolKey.sol";
import {BeforeSwapDelta, BeforeSwapDeltaLibrary} from "v4-core/src/types/BeforeSwapDelta.sol";

contract SecureHook is BaseHook {
    constructor(IPoolManager _poolManager) BaseHook(_poolManager) {}

    function getHookPermissions() public pure override returns (Hooks.Permissions memory) {
        return Hooks.Permissions({
            beforeInitialize: false,
            afterInitialize: false,
            beforeAddLiquidity: false,
            afterAddLiquidity: false,
            beforeRemoveLiquidity: false,
            afterRemoveLiquidity: false,
            beforeSwap: false,           // 必要な場合のみ有効化
            afterSwap: false,            // 必要な場合のみ有効化
            beforeDonate: false,
            afterDonate: false,
            beforeSwapReturnDelta: false,      // 危険: NoOp 攻撃ベクトル
            afterSwapReturnDelta: false,       // 危険: 価値を抽出可能
            afterAddLiquidityReturnDelta: false,
            afterRemoveLiquidityReturnDelta: false
        });
    }

    // 上で有効化したコールバックのみを実装
}

完全な実装テンプレートについては references/base-hook-template.md を参照してください。

セキュリティチェックリスト

任意の hook をデプロイする前に:

#チェック項目ステータス
1すべての hook callback が msg.sender == poolManager を検証[ ]
2必要な場合、ルーター許可リストが実装されている[ ]
3OOG を引き起こす可能性のある無制限ループがない[ ]
4外部呼び出しにリエントランシーガードがある[ ]
5デルタ会計が 0 に合計される[ ]
6手数料転送トークンが処理される[ ]
7ハードコードされたアドレスがない[ ]
8スリッページパラメータが尊重されている[ ]
9機密データがオンチェーンに保存されていない[ ]
10アップグレードメカニズムが保護されている (該当する場合)[ ]
11beforeSwapReturnDelta が有効な場合、正当化されている[ ]
12ファズテストが完了している[ ]
13イン変量テストが完了している[ ]

ガス予算ガイドライン

Hook callback は PoolManager のトランザクションコンテキスト内で実行されます。過度なガス消費はスワップをリバートさせるか、経済的に実行不可能にする可能性があります。

コールバック別ガス予算

コールバック目標予算ハード上限注釈
beforeSwap< 50,000 gas150,000 gasすべてのスワップで実行; 精によく保つ
afterSwap< 30,000 gas100,000 gas分析/追跡のみ
beforeAddLiquidity< 50,000 gas200,000 gasアクセス制御を含む可能性
afterAddLiquidity< 30,000 gas100,000 gas報酬追跡
beforeRemoveLiquidity< 50,000 gas200,000 gasロック検証
afterRemoveLiquidity< 30,000 gas100,000 gas追跡/会計
外部呼び出しを伴うコールバック< 100,000 gas300,000 gas外部 DEX ルーティング、オラクル

よくあるガスの落とし穴

  1. 無制限ループ: 動的配列 (たとえば、すべてのアクティブなポジション) を反復処理するとブロック ガス制限を超える可能性があります。配列サイズを制限するか、ページネーションを使用してください。
  2. ホットパスでの SSTORE: 新しいストレージ スロットごとに約 20,000 ガスがかかります。トランザクションを超えて永続化しないデータについては、トランジェント ストレージ (tstore/tload) を推奨します。Solidity >= 0.8.24 と EVM ターゲットが cancun 以降に設定されている必要があります。
  3. 外部呼び出し: クロスコントラクト呼び出しは約 2,600 ガスのベース コスト、さらに呼び出し先の実行を追加します。可能な限り呼び出しをバッチ処理します。
  4. 文字列操作: コールバック内で string 操作を避けます。識別子には bytes32 を使用します。
  5. 冗長な読み取り: poolManager 呼び出しをキャッシュします — getSlot0()getLiquidity() の読み取りは毎回ガスがかかります。

ガスの測定

# Foundry で特定の hook コールバックをプロファイル
forge test --match-test test_beforeSwapGas --gas-report

# すべてのテストをまたいでガス使用量をスナップショット
forge snapshot --match-contract MyHookTest

リスク スコアリング システム

hook のリスク スコアを計算します (0-33):

カテゴリポイント基準
パーミッション0-14有効化されたパーミッション リスク レベルの合計
外部呼び出し0-5外部相互作用の数とタイプ
状態の複雑性0-5変更可能な状態の量
アップグレード メカニズム0-5プロキシ、管理者機能など
トークン処理0-4非標準トークン サポート

監査レベルの推奨事項

スコアリスク レベル推奨事項
0-5自己監査 + ピアレビュー
6-12専門家による監査が推奨される
13-20専門家による監査が必須
21-33致命的複数の監査が必須

絶対禁止事項

hook では決してこれらのことをしないでください:

  1. msg.sender をユーザー ID として信頼しない — これは常に PoolManager です
  2. NoOp 攻撃を理解せずに beforeSwapReturnDelta を有効化しない
  3. パスワード、キー、個人識別情報をオンチェーン に保存しない
  4. ETH の転送に transfer() を使用しないcall{value:}("") を使用
  5. トークン デシマルを仮定しない — 常にトークンをクエリ
  6. ランダム性のために block.timestamp を使用しない
  7. 呼び出しでガス制限をハードコードしない
  8. 外部呼び出しの戻り値を無視しない
  9. 認可のために tx.origin を使用しない — これはフィッシング ベクトルです。悪意のあるコントラクトは元のユーザーの tx.origin で呼び出しをリレーできます

デプロイ前の監査チェックリスト

#項目必須対象
1セキュリティ重視の開発者によるコード レビューすべての hook
2すべてのコールバックの単体テストすべての hook
3Foundry によるファズ テストすべての hook
4イン変量テストデルタ リターンの hook
5メインネット上でのフォーク テストすべての hook
6ガス プロファイリングすべての hook
7形式検証致命的な hook
8Slither/Mythril 分析すべての hook
9外部監査中+ リスク の hook
10バグ バウンティ プログラム高+ リスク の hook
11モニタリング/アラート設定すべての本番 hook

詳細な監査要件については references/audit-checklist.md を参照してください。

本番環境 Hook リファレンス

監査済みの本番 hook から学びます:

プロジェクト説明注目すべきセキュリティ機能
Flaunchトークン起動プラットフォームマルチシグ管理者、タイムロック
EulerSwap貸出統合マーケット別リスク分離
Zaha TWAMM時間加重 AMM段階的実行で MEV を低減
BunniLP 管理集中流動性ガード

外部リソース

公式ドキュメント

セキュリティ リソース

コミュニティ


その他の参考資料

  • ベース Hook テンプレート - 完全な実装スターター
  • 脆弱性カタログ - よくあるパターンと緩和策
  • 監査チェックリスト - 詳細なデプロイ前チェックリスト

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
uniswap
リポジトリ
uniswap/uniswap-ai
ライセンス
MIT
最終更新
不明

Source: https://github.com/uniswap/uniswap-ai / ライセンス: MIT

関連スキル

Anthropic Claudeセキュリティ⭐ リポ 8,981

secure-code-guardian

認証・認可の実装、ユーザー入力の保護、OWASP Top 10の脆弱性対策が必要な場合に使用します。bcrypt/argon2によるパスワードハッシング、パラメータ化ステートメントによるSQLインジェクション対策、CORS/CSPヘッダーの設定、Zodによる入力検証、JWTトークンの構築などのカスタムセキュリティ実装に対応します。認証、認可、入力検証、暗号化、OWASP Top 10対策、セッション管理、セキュリティ強化全般で活用できます。ただし、構築済みのOAuth/SSO統合や単独のセキュリティ監査が必要な場合は、より特化したスキルの検討をお勧めします。

by Jeffallan
汎用セキュリティ⭐ リポ 1,982

claude-authenticity

APIエンドポイントが本物のClaudeによって支えられているか(ラッパーやプロキシ、偽装ではないか)を、claude-verifyプロジェクトを模した9つの重み付きルールベースチェックで検証できます。また、Claudeの正体を上書きしているプロバイダーから注入されたシステムプロンプトも抽出します。完全に自己完結しており、httpx以外の追加パッケージは不要です。Claude APIキーまたはエンドポイントを検証したい場合、サードパーティのClaudeサービスが本物か確認したい場合、APIプロバイダーのClaude正当性を監査したい場合、複数モデルを並行してテストしたい場合、またはプロバイダーが注入したシステムプロンプトを特定したい場合に使用できます。

by LeoYeAI
Anthropic Claudeセキュリティ⭐ リポ 2,159

anth-security-basics

Anthropic Claude APIのセキュリティベストプラクティスを適用し、キー管理、入力値の検証、プロンプトインジェクション対策を実施します。APIキーの保護、Claudeに送信する前のユーザー入力検証、コンテンツセーフティガードレールの実装が必要な場合に活用できます。「anthropic security」「claude api key security」「secure anthropic」「prompt injection defense」といったフレーズでトリガーされます。

by jeremylongshore
汎用セキュリティ⭐ リポ 699

x-ray

x-ray.mdプレ監査レポートを生成します。概要、強化された脅威モデル(プロトコルタイプのプロファイリング、Gitの重み付け攻撃面分析、時間軸リスク分析、コンポーザビリティ依存関係マッピング)、不変条件、統合、ドキュメント品質、テスト分析、開発者・Gitの履歴をカバーしています。「x-ray」「audit readiness」「readiness report」「pre-audit report」「prep this protocol」「protocol prep」「summarize this protocol」のキーワードで実行されます。

by pashov
汎用セキュリティ⭐ リポ 677

semgrep

Semgrepスタティック分析スキャンを実行し、カスタム検出ルールを作成します。Semgrepでのコードスキャン、セキュリティ脆弱性の検出、カスタムYAMLルールの作成、または特定のバグパターンの検出が必要な場合に使用します。重要:ユーザーが「バグをスキャンしたい」「コード品質を確認したい」「脆弱性を見つけたい」「スタティック分析」「セキュリティlint」「コード監査」または「コーディング標準を適用したい」と尋ねた場合も、Semgrepという名称を明記していなくても、このスキルを使用してください。Semgrepは30以上の言語に対応したパターンベースのコードスキャンに最適なツールです。

by wimpysworld
汎用セキュリティ⭐ リポ 591

ghost-bits-cast-attack

Java「ゴーストビッツ」/キャストアタック プレイブック(Black Hat Asia 2026)。16ビット文字が8ビットバイトに暗黙的に縮小されるJavaサービスへの攻撃時に使用します。WAF/IDSを回避して、SQLインジェクション、デシリアライゼーション型RCE、ファイルアップロード(Webシェル)、パストトラバーサル、CRLF インジェクション、リクエストスマグリング、SMTPインジェクションを実行できます。Tomcat、Spring、Jetty、Undertow、Vert.x、Jackson、Fastjson、Apache Commons BCEL、Apache HttpClient、Angus Mail、JDK HttpServer、Lettuce、Jodd、XMLWriterに影響し、WAFバイパスにより多くの「パッチ済み」CVEを再度有効化します。

by yaklang
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: uniswap · uniswap/uniswap-ai · ライセンス: MIT