yof について
yof は、AI などを使ってアプリを開発する人向けのコマンドラインセキュリティチェッカーです。キーや危険なパッケージをローカルで検出し、自分が運用するアプリのアクセス制御もテストできます。確認された問題は回帰テストにでき、コードはアップロードされません。
主な機能
- 01ローカルで漏えいキーを検出
- 02架空・類似パッケージを確認
- 03コミット前にステージ済み変更を検査
- 04所有アプリのアクセス制御をテスト
- 05検出結果から回帰テストを生成
活用シーン
- 01コミット前にコード内のキーを発見
- 02追加した依存パッケージを確認
- 03ユーザーアカウント間の分離を検証
- 04確認済みの問題に回帰テストを追加
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.yof.io/mcpclaude mcp add --transport http io-yof-yof https://mcp.yof.io/mcp{"mcpServers":{"io-yof-yof":{"type":"http","url":"https://mcp.yof.io/mcp"}}}Cursor で開く{"servers":{"io-yof-yof":{"type":"http","url":"https://mcp.yof.io/mcp"}}}VS Code で開く{"mcpServers":{"io-yof-yof":{"type":"http","url":"https://mcp.yof.io/mcp"}}}{"mcpServers":{"io-yof-yof":{"serverUrl":"https://mcp.yof.io/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://mcp.yof.io/mcp認証が必要ツール
詳細
AI で構築したアプリのセキュリティチェック
リリース前に、漏えいしたキー、リスクのあるパッケージや架空のパッケージ、アカウント間のアクセスの穴を検出します。無料のオープンソースです。
リリース前に、漏えいしたキーや架空のパッケージを検出します。
yof(sōtem の yof)は、ノートパソコン上で使える yof です。AI アシスタントで構築したアプリ(およびその他の方法で構築したアプリ)をチェックする、小さなコマンドラインツールです。コード内に残されたシークレットキーや、存在しない、または人気のあるパッケージを装った依存関係を、コミット、プルリクエスト、本番環境に到達する前に検出します。
ルールベースのみで、パターンは厳密、高速かつプライベートです。マシン上で実行され、アカウントは不要で、コードを外部に送信することもありません。
30 秒で試す
npx @yof/cli check
現在のフォルダーをチェックします。Node 20 以降が必要です。設定は不要です。
yof checked 2 files (profile: balanced)
Keys
src/config.ts:1 Stripe live secret key sk_live_FwIw•••••••• (fix now)
A key that was ever committed or shipped counts as leaked: rotate it in the provider's dashboard,
then keep it on the server only (an environment variable, not the code).
Packages
package.json reqeusts-helper (npm) (fix now)
This package doesn't exist on npm. AI assistants sometimes invent package names, and attackers register those names with malware. Check the spelling or remove it.
package.json expres (npm) (fix this week)
This name is one or two letters away from the popular package express. Make sure you meant this one and not express.
Found 3 problems: 2 to fix now, 1 to fix this week.
Want this on every pull request? https://yof.io
yof はキー全体を表示しません。キーを特定するのに十分な、先頭部分と 4 文字が表示されます。
頻繁に使う場合はインストールしてください。
npm install --save-dev @yof/cli
npx yof check
すべてのコミットをチェックする(pre-commit フック)
npx @yof/cli hook install
.git/hooks/pre-commit が追加され、各コミットの前に yof check --staged が実行されます。ステージ済みモードでは、yof はコミットされる内容そのもの(作業コピーではなく、ステージ済みの内容)を読み取り、コミットで追加される依存関係のみをチェックします。今すぐ修正が必要なものがある場合、コミットは中断され、yof が理由を示します。
npx @yof/cli hook uninstallで削除できます。git commit --no-verifyで一度だけスキップできます。- すでに pre-commit フックがある場合、yof はそのまま残し、追加すべき 1 行を知らせます。
すべてのプッシュをチェックする(GitHub Action)
# .github/workflows/yof.yml
name: yof
on: [push, pull_request]
permissions:
contents: read
jobs:
yof:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: yof-dev/[email protected]
with:
path: . # optional, default .
offline: false # optional, true = keys only, no registry lookups
yof が今すぐ修正すべきものを検出するとジョブは失敗するため、コミットまたはプルリクエストに赤いチェックとして表示されます。
設定:.yof.yml
任意です。リポジトリのルートに配置してください。GitHub 上の yof Guard が読み込むファイルと同じなので、1 つのファイルで両方に対応できます。
profile: balanced # relaxed | balanced | strict
ignore:
- fixtures/ # a folder
- docs/examples.md # a file
- "**/*.snap" # a glob: * stays inside one folder, ** matches any depth
| プロファイル | 表示する項目 | 失敗する条件(終了コード 1) |
|---|---|---|
relaxed | 今すぐ修正 | 今すぐ修正 |
balanced(デフォルト) | 今すぐ修正、今週中に修正 | 今すぐ修正 |
strict | 問題のない公開キーも含むすべて | 今すぐ修正、今週中に修正 |
コマンドラインで --profile strict を指定すると、ファイルの設定より優先されます。yof は node_modules、.git、dist、build、.next などのフォルダー、ロックファイル、バイナリファイル、1 MB を超えるファイル、およびルートの .gitignore に記載された項目もスキップします(簡単に言うと、プレーンな名前、フォルダー、glob が対象です。! の行は適用されません)。
受け入れ済みリスク:.yof/accepted.json
テスト用フィクスチャ内の失効したテストキーなど、意図的に問題のない検出結果もあります。エディターから(VS Code:「yof: このリスクを受け入れる…」のクイックフィックスを使って)1 文の理由を添えて受け入れ、書き込まれたファイルをコミットしてください。
{ "version": 1, "accepted": [ { "rule": "secret.stripe_test", "file": "tests/pay.ts", "fingerprint": "…", "reason": "A test key in a fixture", "acceptedBy": "Ada", "acceptedAt": "2026-11-07T10:00:00.000Z" } ] }
yof check は、受け入れ済みの検出結果も理由、受け入れた人、日時とともに「Accepted risks」に表示しますが、未対応として数えたり、チェックを失敗させたりすることはありません。フィンガープリントにはルール、ファイル、検出行が含まれるため、その行が変更されると、検出結果は再び未対応になります。エントリーを削除すると、再び未対応になります。yof の署名付きレポートでは、付録「Accepted risks and why」にこれらのエントリーが記載されます。
チェック対象
キー(正確な形式のみを対象とするため、無作為なハッシュで警告が出ることはありません):
| 今すぐ修正 | 今週中に修正 | 問題ありません。設計上公開されるものです(strict モードで表示) |
|---|---|---|
| Stripe の本番用シークレットキーと制限付きキー、Stripe の Webhook シークレット | Stripe のテスト用シークレットキー | Stripe の公開可能キー |
| OpenAI、Anthropic、Groq、Hugging Face、Replicate | AWS アクセスキー ID 単独 | Firebase のウェブキー |
| シークレットと隣り合っている AWS アクセスキー | シークレットのような名前(VITE_、NEXT_PUBLIC_、REACT_APP_、EXPO_PUBLIC_ … SECRET/PASSWORD/PRIVATE)が付いた、ブラウザーから見える設定 | Supabase の anon キー |
| Supabase の service-role キー(JWT は推測せずにデコードします) | ||
| GitHub トークン、Slack トークン、Webhook URL | ||
| Resend、SendGrid、Mailgun、Twilio | ||
秘密鍵(BEGIN … PRIVATE KEY) |
sk_live_xxxxxxxx や sk_live_your_key_here などのプレースホルダーはスキップされるため、ドキュメントやサンプルに警告が出ることはありません。
package.json、requirements*.txt、pyproject.toml 内のパッケージ:
- 架空:npm または PyPI に存在しない名前です。AI アシスタントがパッケージ名を捏造することがあり、攻撃者はその名前をマルウェア付きで登録します。(今すぐ修正)
- 類似名:人気のパッケージから 1、2 文字だけ異なり(
expres、reqeusts)、それ自体は十分に定着していません。(今週中に修正) - 新規:過去 14 日以内に初めて公開されました。(今週中に修正)
- 既知のアドバイザリ:OSV データベースで公開済みのアドバイザリがある、正確に固定されたバージョンです。深刻度が高または重大なものは今すぐ修正し、それ以外は今週中に修正します。
レジストリから応答がない場合、yof はその旨を伝え、そのパッケージについて何も断定しません。
対象外:git の履歴の読み取り、稼働中のウェブサイトのスキャン、データベースルールの確認、コードロジックのレビューは行いません。これらは yof アプリと Guard(以下を参照)で扱います。
自分のアプリを攻撃する:yof attack
yof attack は、作成した2つのテストアカウント(A と B、用意している場合は管理者アカウントも)を使い、攻撃者の視点で自分が実行中のアプリをテストします。実際に2回確認できたことだけを報告し、各検出結果を回帰テストに変換します。
npx @yof/cli attack http://localhost:3000
npx @yof/cli attack --mode light
テスト内容:
| グループ | 実行内容 |
|---|---|
auth | サインインせず、また無効なトークンを使って、サインインが必要な各ルートを開きます |
tenant | アカウント A がテストレコードを作成し、アカウント B がその ID で読み取り、一覧から見つけて変更します |
rbac | 通常のメンバーとして各管理者ルートを開きます |
ai | 独自のアシスタントルートに対し、隠された指示を尋ね、メッセージにコマンドを入力し、読み取るレコードに隠し(HTML コメント、リンクのタイトル、「system」フィールドなど)、アカウント B のレコードや、アカウント B のレコードの名前変更、管理者データを要求します。アカウント B のレコードがアカウント A への一般的な回答を誘導するか(RAG ポイズニング)を確認し、ライブ HTML や画像リンクを使った回答、無害な単語を1つ出力するためのルールの無効化、内部アドレスやツール一覧、.invalid アドレスへのメール送信も要求します。また、"limits": true の場合に限り、短いメッセージを2件ずつ10件送り、非常に長い物語を1つ要求します |
surface | オープンリダイレクト、セキュリティヘッダー、サインイン Cookie のフラグ、および(有効にした場合)連続する12回の誤ったパスワードをテストします |
安全性を設計段階から考慮し、コードで強制しています:
- 所有権を証明したホストのみを対象とします。
localhost、テスト対象のコミットについて GitHub がこのリポジトリのデプロイ成功を報告したプレビュー、または yof アプリの証明トークン(yof アプリが使用するのと同じファイル、メタタグ、または DNS レコードに設定するYOF_VERIFY_TOKEN)を使った本番ホストです。 - アプリごとに明示的な同意が必要です。 設定ファイルに、アプリ名を記載した同意文を一字一句そのまま記述します。
- 設定でこのアプリに対して有効にしない限り、本番環境は対象外です。 有効にした場合は、軽量テスト(読み取り専用)はいつでも実行でき、完全なテストは設定した時間枠内でのみ実行できます。
- 破壊的なリクエストは送信しません。 GET と HEAD に加え、指定した作成、サインイン、アシスタントの各ルートに限り POST を使用します。PATCH、PUT、DELETE の対象は、テスト実行中に作成したレコードのみで、テスト終了時には必ず削除します。
- 厳格な上限を設定します。デフォルトではリクエスト300件、110秒(上限は2,000件、15分)、一定の送信間隔、タイムアウト10秒です。上限に達すると、テストは停止し、その旨を報告します。停止後、作成したテストレコードを削除します。
- いつでも停止できます。 エディターや CI からキャンセルされたときの Ctrl+C(SIGINT)または SIGTERM を受け取ると、それ以上リクエストは送信されません。テストで作成したレコードは10秒以内に削除され、削除したものと削除できなかったものが報告され、終了コード130または143で終了します。Ctrl+C をもう一度押すと、直ちに終了します。
- アシスタントへのメッセージは固定で穏当な内容です。 アシスタントのプローブでは、毎回同じ固定テキスト(OWASP Top 10 for LLM Applications 2025 のカテゴリ)を使います。有害な内容は要求しません。ジェイルブレイクでは無害なテスト用の単語だけを要求し、画像リンクは
yof-canary.invalid、メールプローブはexample.invalidアドレスを使用するため、どちらも名前解決されません。各検出結果はモデルではなくルールで判定します。内部情報については種類(プライベートアドレス、接続文字列、サーバーパス、ツール一覧)のみを保持し、内容そのものは保持しません。 - 使用量の上限テストはオプトインです。
aiエントリに"limits": trueを設定すると、短いメッセージを10件送るテストと、非常に長い物語を1つ要求するテストが追加されます。モデルの利用量が少し増えるためです。設定しない場合、このようなメッセージは送信されません。 - テストアカウントの情報は CI シークレット内に保管されます。 設定ファイルに記載するのは環境変数名のみで、トークンやパスワードは記載しません。また、yof が情報を保存することはありません。
設定ファイルは .yof/attack.json にあります:
{
"app": "shop.example.com",
"consent": "I own shop.example.com and allow yof attack to test it and its preview builds with my own test accounts.",
"accounts": {
"a": { "header": "Authorization", "env": "YOF_ATTACK_A" },
"b": { "header": "Authorization", "env": "YOF_ATTACK_B" },
"admin": { "header": "Authorization", "env": "YOF_ATTACK_ADMIN" }
},
"routes": ["/api/me", "/api/notes"],
"admin": ["/api/admin/users"],
"objects": [{
"create": { "path": "/api/notes", "body": "{\"title\":\"{{marker}}\"}" },
"idPath": "id",
"read": "/api/notes/{id}",
"list": "/api/notes",
"update": { "method": "PATCH", "path": "/api/notes/{id}", "body": "{\"title\":\"{{marker}}\"}" },
"delete": "/api/notes/{id}"
}],
"ai": [{
"path": "/api/chat", "body": "{\"message\":\"{{message}}\"}", "replyPath": "reply",
"ingest": { "create": { "path": "/api/notes", "body": "{\"title\":\"{{document}}\"}" }, "idPath": "id", "delete": "/api/notes/{id}" },
"limits": false
}],
"surface": { "redirectPaths": ["/login"], "rateLimit": false },
"production": { "enabled": false, "window": "02:00-04:00" },
"budget": { "requests": 300, "seconds": 110, "perSecond": 8 }
}
アカウントは CI シークレットのメールアドレスとパスワードを使ってサインインすることもできます:{ "login": { "path": "/api/login", "body": "{\"email\":\"{{email}}\",\"password\":\"{{password}}\"}", "tokenPath": "token" }, "emailEnv": "YOF_ATTACK_A_EMAIL", "passwordEnv": "YOF_ATTACK_A_PASSWORD" }。tokenPath を指定しない場合は、セッション Cookie が使用されます。
回帰テスト
--write-tests を指定すると、確認済みのすべての検出結果が、独自のテストフレームワーク(リポジトリから検出した Vitest、Jest、Playwright、pytest、またはいずれにも該当しない場合は node --test のファイル)のテストになります。記録された攻撃を再現し、逆の結果を期待します。つまり、攻撃がまだ成功する間はテストが失敗し、修正されるとテストが成功します。AI がテストを書くことはありません。YOF_ATTACK_TARGET が設定されていない場合はテストをスキップするため、通常のテスト実行には影響しません。
すべてのプルリクエストで
# .github/workflows/yof-attack.yml
name: yof attack
on: [pull_request]
permissions:
contents: read
deployments: read
pull-requests: write
issues: write
jobs:
attack:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: yof-dev/yof/[email protected]
env:
YOF_ATTACK_A: ${{ secrets.YOF_ATTACK_A }}
YOF_ATTACK_B: ${{ secrets.YOF_ATTACK_B }}
YOF_ATTACK_ADMIN: ${{ secrets.YOF_ATTACK_ADMIN }}
プルリクエストのプレビュー環境がデプロイされるまで待ってから、変更によって到達できる箇所だけを攻撃します。対象となるのは、変更したファイルのルート(Next.js の app および pages のルート、Hono と Express のルートファイル、変更したヘルパーをインポートしているルート)です。コメントには「partial run: N attack groups」と表示されます。共通コード(ミドルウェア、認証、権限、データベースアクセス、依存関係)が変更された場合や、対応付けに確信が持てない場合はすべてを実行し、その理由を表示します。フォークからのプルリクエストはスキップされます。
コメントには検出内容が一覧表示されます。プルリクエストに /patch apply とコメントすると、yof GitHub App が回帰テスト(該当する場合はセキュリティヘッダーの修正も)をコミットし、プルリクエストの専用ブランチに反映します。利用できるのは書き込み権限があるユーザーのみです。フォークやデフォルトブランチでは実行されず、強制プッシュも行いません。
YOF_HOOK_URL(yof アプリのデプロイフックアドレス)を設定すると、yof attack --upload によってマスキング済みの検出内容が yof アプリに送信され、ほかの検出内容とともに表示されます。
オプション
yof attack [url] The address to test (or YOF_ATTACK_TARGET)
--config <file> The attack config (default .yof/attack.json)
--mode <full|light> light = read-only
--base <branch> Pull request run: attack only what the change can reach
--write-tests Write a regression test for every confirmed finding
--comment <file> Write the pull-request comment to this file
--upload Send the masked results to your yof app (YOF_HOOK_URL)
--json Machine-readable output
AI ビルダー内で使用する:yof mcp
yof mcp は yof をローカル MCP サーバー(stdio)として実行するため、コードを書く AI が「完了」と伝える前にコードをチェックできます。ローカルコマンドを起動できる MCP クライアントであれば、どれでも動作します。最も簡単な接続方法は、yof ダッシュボードの「Connect your AI builder」を選択することです。設定は自動で書き込まれます。手動で設定する場合:
claude mcp add yof -- npx -y @yof/cli mcp # Claude Code
codex mcp add yof -- npx -y @yof/cli mcp # Codex CLI
Cursor、VS Code、Windsurf、Claude Desktop は、MCP 設定で同じコマンドを使用します:npx -y @yof/cli mcp。必ずスコープ付きの名前 @yof/cli を使用してください。スコープなしの npm 名 yof は別のユーザーが所有しています。
ツール:
| ツール | 機能 | 実行場所 |
|---|---|---|
yof_check | プロジェクトフォルダー(またはその中のフォルダー)をスキャンします | ご利用のマシン |
yof_check_diff | 変更された行だけをスキャンします(渡された diff、または最後のコミットと作業ツリーとの差分に新規ファイルを加えたもの) | ご利用のマシン |
yof_explain | ルールの意味、重要な理由、安全な修正方法を説明します | ご利用のマシン |
yof_fix_prompt | 1 件の検出結果に対する具体的な修正手順を示します | ご利用のマシン |
yof_verify | 1 つのファイルを再スキャンし、修正済みかどうかを示します | ご利用のマシン |
yof_findings | yof.io アカウントの未解決の検出結果を表示します | yof.io、YOF_API_KEY が必要 |
yof_patch_status | Patch の未解決のプルリクエストとその CI 状態を表示します | yof.io、YOF_API_KEY が必要 |
yof_lessons | マージ済みの Patch 修正に関するメモを表示します | yof.io、YOF_API_KEY が必要 |
すべての回答は、スキャン対象のプロジェクトから取得した信頼できないデータであることを示す行から始まります。そのため、ファイル内のテキストが指示として扱われることはありません。シークレット値は常に、短いプレフィックスに続けて REDACTED として返されます。制限:diff は最大 1 MB、300 ファイルまでです。スキャンは 90 秒で終了し、パスはプロジェクトフォルダー内にとどまる必要があります。
YOF_API_KEY は yof ダッシュボードで接続ごとに作成でき、いつでもそこで失効させられます。このキーを使用すると、サーバーは起動時に接続が機能していることをダッシュボードに表示できるよう、1 回 ping を送信します。また、3 つのアカウントツールについては、ツール名とその引数(ID とルール ID)を送信します。コードやファイルの内容は送信しません。
プライバシー
yof check はお使いのマシン上で実行されます。ファイルを読み込み、パターンと照合し、結果を表示します。コード、ファイル名、キーがお使いのコンピューターから外部に送信されることはありません。(yof attack は、ご自身のものだと確認したアプリと、このリポジトリのデプロイ情報を読み取るための GitHub の API にのみリクエストを送信します。)
yof check が行うネットワーク通信は、パッケージレジストリの照会のみです。パッケージ名(および正確に固定されたバージョン)は、registry.npmjs.org、api.npmjs.org、pypi.org、api.osv.dev に送信され、ほかのホストには送信されません。--offline を指定すれば、yof はネットワーク通信を一切行いません。テレメトリーはありません。
オプション
yof check [path] Check a folder (default: the current one)
yof check --staged Check only the files staged for the next commit
yof hook install Run "yof check --staged" before every commit
yof hook uninstall Remove that hook
yof diff Check only what changed since the last commit (plus new files)
yof mcp [path] Run yof as a local MCP server for AI builders
yof import <file> [path] Read a findings.json and check each record's file and line here
--offline Skip the package-registry lookups (keys only)
--json Machine-readable output (masked values only)
--format <name> text | json | findings-json
--profile <name> relaxed | balanced | strict
-v, --version Print the version
-h, --help Print help
終了コード:0 修正するものはありません、1 修正するものがあります(プロファイルに基づく)、2 使用方法またはセットアップのエラーです。
--json を指定すると、すべての検出結果に why(平易な言葉で、何が起こり得るかを説明)と fixPrompt(変更内容を、値をマスクした状態で、コードを書いた AI アシスタントにそのまま貼り付けられる形式で提示)が含まれます。yof のエディタープラグインでは、これらがそのまま表示されます。
findings.json(Cloudflare のセキュリティ監査形式)
yof check --format findings-json は、Cloudflare のセキュリティ監査スキルの findings.json 形式で検出結果を書き出します(MIT ライセンス、NOTICE を参照)。そのため、この形式を読み取るツールは yof の結果も読み取れます。各レコードには判定が含まれます。フォルダー内に正確な証拠がある場合(プロバイダーの形式に合致するキー、レジストリに存在しないパッケージ、アドバイザリに記載されたインストール済みバージョン)は confirmed、可能性は高いものの確認できない場合(人気のパッケージ名と1、2文字だけ異なる名前、公開から数日しか経っていないパッケージ)は needs_validation です。設計上公開されているキーは検出結果ではなく、セキュリティ強化に関する注意事項として扱われ、含まれません。yof check の検出結果が critical と評価されることはありません。コードを実行したり、稼働中のアプリにアクセスしたりしないため、評価は最大でも「high」です。
yof import findings.json [path] は findings.json を厳密に読み込みます(未知のフィールドがあるレコード、必須フィールドが欠けているレコード、値が誤っているレコード、または実証された影響を超える深刻度のレコードは、名前を示して除外され、修正されることはありません)。その後、各レコードを読み取り専用でフォルダーと照合します。ファイルがフォルダー内に存在するか、またその行が存在するかを確認します。何も実行されず、何も送信されません。ファイルがスキーマに一致しない場合は終了コード 2、レコードの確認が必要な場合は 1、却下されたレコードだけが残る場合は 0 です。
ライブラリとしても使用できます:import { scanText, checkPackages, runCheck } from "@yof/cli"。
もっと知りたいですか?
yof は、AI が構築したアプリ向けのセキュリティウォッチャーです。この CLI は、素早くプライベートに実行できる、ルールベースの機能です。そのほかの機能は yof.io にあります。
- yof アプリ(yof.io)は稼働中のアプリを監視し、検出結果を平易な言葉で説明し、修正方法を示して、アプリの状態を継続的に追跡します。
- Guard は GitHub 上のすべてのプルリクエストをレビューし、明確なコメントを1つ残します:github.com/apps/yof-by-sotem。
- Patch は yof の AI エージェントで、修正を作成し、ドラフトのプルリクエストとして提示します。
コントリビューション
Issue やプルリクエストを歓迎します。特に、形式を文書化した新しいキーのルールを歓迎します。CONTRIBUTING.md を参照してください。セキュリティ上の問題については、SECURITY.md をご覧ください。
ライセンス
Apache-2.0。LICENSE と NOTICE を参照してください。yof は Mondaily が開発しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。