Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
wardn — 为AI代理提供凭证隔离。代理永远不会看到真实的API密钥 - 结构性保障,而非策略。 | Kitploit
工具/GitHubGitHub/rohansx/wardn
身份验证与授权加密/解密工具云安全DevSecOps实用工具与框架秘密检测身份与访问管理 (IAM)供应链安全API 安全
GitHubrohansx/wardn

wardn

为AI代理提供凭证隔离。代理永远不会看到真实的API密钥 - 结构性保障,而非策略。

36352个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库

wardn

AI 代理的凭据防火墙。

核心主张是结构性的,而非策略性的:代理接收的是占位令牌,而非真实的 API 密钥。真实的密钥仅跨越一个网络边界——在 wardn 代理内部,前往上游 API 的途中——并在响应返回代理之前被剥离。日志、环境、LLM 上下文窗口、临时文件以及 shell 历史中仅保留占位符。```text agent process OPENAI_KEY=wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) agent logs Authorization: Bearer wdn_placeholder_a1b2... (useless) LLM context wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) wardn proxy injects the real key in-flight, single seam (deleted on response) ~/.vibeguard/vault.enc AES-256-GCM(Argon2id(passphrase)) (encrypted at rest)

root@kitploit:~
这是关键的安全声明,且目前能够抵御智能体受损、提示注入、日志窃取和技能外泄。阅读 [docs/THREAT-MODEL.md](https://github.com/rohansx/wardn/blob/main/docs/THREAT-MODEL.md) 以了解已覆盖和未覆盖范围的诚实划分——包括在何种层级下可实现更强的“主机受损不会泄露任何信息”这一声明。

保险库本身(静态加密,基于口令派生的密钥)是一个真实组件,也是防火墙可以在单台机器上运行的原因。即将推出的 [docs/HOSTED-TIER.md](https://github.com/rohansx/wardn/blob/main/docs/HOSTED-TIER.md) 层级还将在代理周围包裹一个机密计算飞地,即使 VPS 被完全入侵,也无法读取密钥。

[![Crates.io](https://img.shields.io/crates/v/wardn.svg)](https://crates.io/crates/wardn)
[![License](https://img.shields.io/crates/l/wardn.svg)](LICENSE)

## 问题所在

如今,每个 AI 智能体框架都将 API 密钥存储在环境变量或 `.env` 文件中。一个受损的智能体、恶意技能、商品级窃密软件或提示注入,只要从 LLM 日志中提取出 `Authorization: Bearer sk-...`,就能完全获得你的凭证。```
~/.env              → OPENAI_KEY=sk-proj-real-key      # plaintext, readable by anyone
agent context       → "Use OPENAI_KEY=sk-proj-real-key" # leaked into LLM context window
agent logs          → Authorization: Bearer sk-proj-... # sitting in log files

修复方案:凭证防火墙

wardn 向代理程序提供一个无用的占位字符串,并从其能触及的每个表面移除真实密钥。真实密钥在网络层注入——单个接缝处——并在响应到达代理程序之前从中剥离。``` agent environment → OPENAI_KEY=wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) wardn vault → OPENAI_KEY=sk-proj-real-key (encrypted at rest) upstream request → Authorization: Bearer sk-proj-real-key (network transit only) upstream response → ...real keys stripped, placeholders returned... (re-injected on the way back) agent logs → Authorization: Bearer wdn_placeholder_a1b2... (useless) LLM context window → wdn_placeholder_a1b2c3d4e5f6g7h8 (useless)

root@kitploit:~
## 架构```mermaid
flowchart TB
    subgraph Agent["AI Agent Process"]
        A1["Agent Code"]
        A2["ENV: OPENAI_KEY=wdn_placeholder_a1b2..."]
    end

    subgraph Wardn["wardn daemon · localhost:7777"]
        direction TB
        P["HTTP Proxy"]
        MCP["MCP Server\n(stdio)"]

        subgraph Pipeline["Request Pipeline"]
            direction LR
            S1["Identify\nAgent"] --> S2["Resolve\nPlaceholder"] --> S3["Check\nAuth"] --> S4["Rate\nLimit"] --> S5["Inject\nReal Key"]
        end

        subgraph ResponsePipeline["Response Pipeline"]
            direction RL
            R1["Strip Real\nKeys"] --> R2["Replace with\nPlaceholders"]
        end

        subgraph Vault["Encrypted Vault"]
            V1["AES-256-GCM"]
            V2["Argon2id KDF"]
            V3["Placeholder Map\nper agent × credential"]
        end
    end

    subgraph External["External APIs"]
        E1["api.openai.com"]
        E2["api.anthropic.com"]
        E3["..."]
    end

    A1 -- "placeholder token\nin headers/body" --> P
    A1 -. "MCP: get_credential_ref\nlist_credentials\ncheck_rate_limit" .-> MCP
    MCP -. "placeholder token\n(never real keys)" .-> A1
    P --> Pipeline
    Pipeline --> External
    External --> ResponsePipeline
    ResponsePipeline -- "response with\nplaceholders only" --> A1
    Pipeline <--> Vault
    ResponsePipeline <--> Vault

    style Agent fill:#1a1a2e,stroke:#e94560,color:#fff
    style Wardn fill:#0f3460,stroke:#16213e,color:#fff
    style Pipeline fill:#16213e,stroke:#e94560,color:#fff
    style ResponsePipeline fill:#16213e,stroke:#e94560,color:#fff
    style Vault fill:#1a1a2e,stroke:#00d2ff,color:#fff
    style External fill:#0a0a0a,stroke:#533483,color:#fff

工作原理```

Agent sends request with placeholder in Authorization header │ ▼ ┌─────────────────────────┐ │ wardn proxy │ │ localhost:7777 │ │ │ │ 1. Identify agent │ │ 2. Resolve placeholder │ │ 3. Check authorization │ │ 4. Check rate limit │ │ 5. Inject real key │ │ 6. Forward request │ │ 7. Strip key from resp │ │ 8. Return to agent │ └─────────────────────────┘ │ ▼ External API (only place real key exists in transit)

root@kitploit:~
## Demo

<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/12823/1fa6109ffd855ec98c173c5edd2d7ee77f6b0c918a3cdecb1ea5fbfe8326161d.gif" alt="wardn demo" width="800">
</p>

## 信任级别(坦诚版)

| 层级 | 部署位置 | 保障内容 |
|---|---|---|
| **自托管(当前)** | 你的笔记本电脑、你的VPS、CI | 静态加密保险库、防火墙声明对抗代理。**不**防御主机上的root权限。 |
| **托管(即将推出)** | wardn管理或自带云 | 机密计算环境(Nitro / SEV-SNP) + 远程证明 + 加密到代理流程。真正实现'主机被攻破也不泄露任何信息'的声明。 |

自托管层级是当前的主力保障,现已发布。托管层级是严格升级路径:需要费用和运维复杂度,其设计见 [docs/HOSTED-TIER.md](https://github.com/rohansx/wardn/blob/main/docs/HOSTED-TIER.md)。以下是涵盖与未涵盖内容的完整坦诚清单:

👉 **[docs/THREAT-MODEL.md](https://github.com/rohansx/wardn/blob/main/docs/THREAT-MODEL.md)** — 涵盖/未涵盖表格,明确指出'任何软件保险库都无法消除主机被攻破的风险',以及升级路径。

## 安装```bash
# Prebuilt binary (Linux/macOS, amd64/arm64), checksum-verified
curl -sSf https://raw.githubusercontent.com/rohansx/wardn/main/install.sh | sh

# or from crates.io
cargo install wardn

# or Homebrew, once the tap is published (see Formula/wardn.rb)
brew install rohansx/wardn/wardn

快速开始```bash

Create an encrypted vault and store your keys

wardn vault create wardn vault set OPENAI_KEY wardn vault set ANTHROPIC_KEY

Set up Claude Code integration (one command)

wardn setup claude-code

root@kitploit:~
就这样。Claude Code 现在使用 wardn 的 MCP 服务器来获取占位符令牌,而不是从你的环境中读取真实密钥。

### 接下来会发生什么

1. Claude Code 调用 `get_credential_ref` → 获取 `wdn_placeholder_a1b2...`(非真实密钥)
2. 代理通过 wardn 代理发送包含占位符的请求
3. 代理将占位符替换为真实密钥,转发给 API
4. 代理在返回响应前从代理处剥离真实密钥

真实密钥永远不会进入代理的内存、日志或 LLM 上下文窗口。

## 本地仪表盘

一旦守护进程启动(`wardn serve` 或由 `wardn run` 生成),在浏览器中打开 **http://127.0.0.1:7777/ui**。它是一个只读、仅限本地的视图,包含:

- **凭证** — 每个存储的凭证及其 ACL(允许的代理、允许的域、速率限制 + 预算徽章)。
- **最近活动** — 最近 50 个代理事件,包括方法、域、路径、状态、代理、request_id 和记录的成本(`request_completed`、`credential_injected`、`rate_limit`、`budget_exceeded`、`loop_detected`、`request_error`)。
- **预算** — 每个凭证的配置预算(最大值、已花费、剩余、窗口、模式),并带有进度条,当超过 50%/80% 时从警告变为错误。

每 2 秒自动轮询。没有变更端点 —— 离开仪表盘的唯一途径是 API 本身(`/api/summary`、`/api/credentials`、`/api/audit?limit=N`、`/api/budgets`)。```bash
# Static, anonymous, never sees real keys
curl http://127.0.0.1:7777/api/summary | jq

手动设置```bash

Get a placeholder token (never the real key)

wardn vault get OPENAI_KEY

→ wdn_placeholder_a1b2c3d4e5f6g7h8

List stored credentials (names only, no values)

wardn vault list

Start the proxy

wardn serve

Start proxy + MCP server for Claude Code / Cursor

wardn serve --mcp --agent my-agent

root@kitploit:~
## CLI 参考

### Vault 管理```bash
wardn vault create                        # create encrypted vault
wardn vault set OPENAI_KEY                # store credential (prompts for value, no echo)
wardn vault get OPENAI_KEY                # get placeholder token (never the real value)
wardn vault get OPENAI_KEY --agent bot    # get placeholder for specific agent
wardn vault list                          # list all credentials
wardn vault rotate OPENAI_KEY             # rotate value, placeholders unchanged
wardn vault remove OPENAI_KEY             # remove credential

# Custom vault path
wardn --vault /path/to/vault.enc vault list

代理服务器```bash

wardn serve # HTTP proxy on 127.0.0.1:7777 wardn serve --host 0.0.0.0 --port 8080 # custom bind address wardn serve --config wardn.toml # load config with rate limits + ACLs wardn serve --mcp --agent my-agent # proxy + MCP server (stdio)

root@kitploit:~
### Claude Code / Cursor 集成```bash
wardn setup claude-code                   # register wardn as MCP server in Claude Code
wardn setup cursor                        # register wardn as MCP server in Cursor

# Or manually:
claude mcp add --transport stdio --scope user wardn -- wardn serve --mcp --agent claude-code

What wardn setup does

  1. 提示输入你的保管库密码并验证其能否打开保管库
  2. 查找你系统上 wardn 二进制文件的路径
  3. 将 wardn 注册为 MCP 服务器:
    • Claude Code:在环境配置中使用 WARDN_PASSPHRASE 运行 claude mcp add
    • Cursor:将密码写入 ~/.cursor/mcp.json 的 env 中
  4. 下次启动时,IDE 将 wardn serve --mcp 作为子进程生成

验证是否生效

运行 setup 后,重新启动你的 IDE 并尝试以下提示:``` "List my wardn credentials" → Claude calls list_credentials, shows credential names (never values)

"Get me a reference to OPENAI_KEY" → Claude calls get_credential_ref, gets wdn_placeholder_... (not the real key)

"Check my rate limit for OPENAI_KEY" → Claude calls check_rate_limit, shows remaining quota

root@kitploit:~
#### 可用的 MCP 工具

| 工具 | 返回内容 | 安全性 |
|------|----------------|----------|
| `get_credential_ref` | 占位符令牌 (`wdn_placeholder_...`) | 绝不是真实值 |
| `list_credentials` | 凭据名称 + 元数据 | 根据代理的访问权限过滤 |
| `check_rate_limit` | 剩余配额、重试信息 | 只读 |

### 凭据迁移```bash
wardn migrate --dry-run                             # audit Claude Code dir for exposed keys
wardn migrate --source claude-code                  # scan + migrate to vault
wardn migrate --source open-claw                    # scan OpenClaw config
wardn migrate --source directory --path ./my-proj   # scan any directory

导入凭据```bash

Classic .env file (KEY=value, comments, optional export, quoted values

with backslash escapes honored)

wardn import dotenv ./.env

JSON or YAML file. Format inferred from extension; either a flat map

or a structured {credentials: [{name, value}, ...]} shape.

wardn import file ./creds.json wardn import file ./creds.yaml

1Password CLI — reuses your signed-in op session. Default name is

derived from the ref's last segment; override with --name.

wardn import one-password op://Personal/openai/api_key wardn import one-password op://Work/anthropic/token --name ANTHROPIC_KEY

stdin — read .env-format lines. Useful for piping.

echo 'OPENAI_KEY=sk-...' | wardn import stdin

root@kitploit:~
每个导入器在首次使用时都会提示输入密码库密码(或从 `WARDN_PASSPHRASE` / 操作系统钥匙串读取)。现有的值会被静默覆盖——导入器仅处理值,元数据(允许的代理 / 域名 / 速率限制 / 预算)保持不变。

### 自动化

在 CI/脚本中,设置 `WARDN_PASSPHRASE` 和 `WARDN_VALUE` 环境变量以跳过交互提示:```bash
WARDN_PASSPHRASE=my-pass wardn vault list
WARDN_PASSPHRASE=my-pass WARDN_VALUE=sk-proj-xxx wardn vault set OPENAI_KEY

库 API

添加到您的 Cargo.toml:```toml [dependencies] wardn = "0.4"

root@kitploit:~
### 保险库操作```rust
use wardn::{Vault, config::CredentialConfig};

// Create an encrypted vault
let vault = Vault::create("vault.enc", "my-passphrase")?;

// Store a credential
vault.set_with_config("OPENAI_KEY", "sk-proj-real-key-123", &CredentialConfig {
    allowed_agents: vec!["researcher".into(), "writer".into()],
    allowed_domains: vec!["api.openai.com".into()],
    rate_limit: Some(RateLimitConfig { max_calls: 200, per: TimePeriod::Hour }),
})?;

// Agent gets a placeholder (not the real key)
let placeholder = vault.get_placeholder("OPENAI_KEY", "researcher")?;
// → "wdn_placeholder_a1b2c3d4e5f6g7h8"

// Rotate the real key — all placeholders keep working
vault.rotate("OPENAI_KEY", "sk-proj-new-key-456")?;

HTTP 代理```rust

use wardn::daemon::{Daemon, DaemonConfig};

let daemon = Daemon::new(vault, DaemonConfig::default()); daemon.serve_proxy().await?;

root@kitploit:~
### MCP Server```rust
use wardn::mcp::WardenMcpServer;

// Serve over stdio (for Claude Code, Cursor, etc.)
WardenMcpServer::serve_stdio(vault, rate_limiter, "agent-id".into()).await?;

MCP 工具暴露(只读,不返回任何凭据值):

工具描述
get_credential_ref获取凭据的占位令牌
list_credentials列出你有权访问的凭据
check_rate_limit检查剩余配额

安全特性

该工具防御的攻击

与其他工具的不同之处

关于 wardn 与其最直接同类工具(Infisical Agent Vault、1Password for Agents、LiteLLM 虚拟密钥)的深入比较,以及 wardn 的保证如何映射到 OWASP 的 Agentic Top 10 和 MCP 规范的安全指南,请参见 docs/comparison.md。

信任边界

Wardn 将信任集中在一个本地进程(代理)中,而不是分散到每个插件、工具和 LLM 上下文窗口。这是更小的攻击面,而非零攻击面:

  • 代理作为子进程在 IDE 或 Shell 中本地运行 —— 与内核相同的信任级别
  • 保险库在静态时加密,仅在内存中使用你的密码解密
  • 如果你的本地机器被完全攻破,wardn 也无能为力(任何工具都做不到)
  • 占位令牌是通往代理的 Bearer 令牌 —— 但它仅通过 localhost:7777 有效,不对真实 API 开放,且可以针对每个代理进行速率限制和吊销

审计日志

每次凭据访问都会记录一个唯一的请求 ID 以便追踪:``` INFO request_id=a1b2c3 agent=claude-code method=POST domain=api.openai.com path=/v1/chat/completions proxy request received INFO request_id=a1b2c3 agent=claude-code credential=OPENAI_KEY domain=api.openai.com credential injected INFO request_id=a1b2c3 agent=claude-code upstream_status=200 credentials_injected=1 credentials_stripped=0 proxy request completed

root@kitploit:~
设置 `RUST_LOG=wardn=info`(或 `debug`/`trace`)以控制日志详细程度。日志输出到 stderr,从不输出到 stdout。

## 配置```toml
[warden]
vault_path = "~/.vibeguard/vault.enc"

[warden.credentials.OPENAI_KEY]
rate_limit = { max_calls = 200, per = "hour" }
allowed_agents = ["researcher", "writer"]
allowed_domains = ["api.openai.com"]

[warden.credentials.ANTHROPIC_KEY]
rate_limit = { max_calls = 100, per = "hour" }
allowed_agents = ["researcher"]
allowed_domains = ["api.anthropic.com"]

项目结构```

wardn/ ├── src/ │ ├── main.rs # CLI entry point (clap + tokio) │ ├── cli/ │ │ ├── mod.rs # Clap argument definitions │ │ ├── vault_cmd.rs # Vault subcommand handlers │ │ ├── serve_cmd.rs # Serve subcommand handler │ │ ├── run_cmd.rs # wardn run — lazy-starts the daemon, wires │ │ │ # agent env vars, execs the child │ │ ├── setup_cmd.rs # Claude Code / Cursor MCP setup (+ shell alias) │ │ └── migrate_cmd.rs # Migrate subcommand handler │ ├── lib.rs # Public API, WardenError │ ├── config.rs # TOML configuration parsing, [upstreams] map │ ├── vault/ │ │ ├── mod.rs # Vault CRUD operations │ │ ├── encryption.rs # AES-256-GCM + Argon2id + zeroize types │ │ ├── storage.rs # On-disk format (WDNV), atomic writes │ │ ├── placeholder.rs # Token generation, per-agent isolation │ │ └── keyring_store.rs # OS keychain passphrase storage │ ├── proxy/ │ │ ├── mod.rs # HTTP proxy server (axum) │ │ ├── route.rs # Provider-prefix vs Host-header upstream routing │ │ ├── inject.rs # Credential injection into requests │ │ ├── strip.rs # Credential stripping (shared pair-building) │ │ ├── stream.rs # Streaming (SSE/chunked) credential stripper │ │ └── rate_limit.rs # Token bucket rate limiter │ ├── mcp/ │ │ ├── mod.rs # MCP server (rmcp, stdio transport) │ │ └── tools.rs # Tool parameter/response types │ ├── migrate/ │ │ ├── mod.rs # Migration orchestrator + risk scoring │ │ └── scanners/ │ │ └── credentials.rs # API key pattern scanner │ └── daemon/ │ └── mod.rs # Daemon (proxy + MCP in single process) └── tests/ ├── cli_tests.rs # CLI integration tests ├── vault_tests.rs # Vault integration tests ├── proxy_tests.rs # Proxy tests without a real upstream ├── proxy_e2e_tests.rs # Real upstream via wiremock (header/body/SSE) └── run_cmd_tests.rs # Real end-to-end wardn run

root@kitploit:~
## 开发```bash
# Integration tests use a fast (insecure) KDF so the suite runs in
# milliseconds instead of paying the real Argon2id cost per test —
# always pass this feature flag when running tests locally or in CI:
cargo test --features test-fast-kdf

cargo build
cargo clippy --all-targets --features test-fast-kdf

Vault 加密```mermaid

flowchart LR subgraph Input Pass["Passphrase"] Salt["Random Salt\n(16 bytes)"] Creds["Credentials\n(JSON)"] end

root@kitploit:~
subgraph KDF["Key Derivation"]
    Argon["Argon2id\nm=19456 t=2 p=1"]
end

subgraph Encrypt["Encryption"]
    AES["AES-256-GCM"]
    Nonce["Random Nonce\n(12 bytes)"]
end

subgraph Output["WDNV File"]
    direction TB
    Magic["WDNV (4B)"]
    Ver["Version (2B)"]
    SaltOut["Salt (16B)"]
    Payload["Nonce ‖ Ciphertext ‖ Tag"]
end

Pass --> Argon
Salt --> Argon
Argon -- "256-bit key" --> AES
Creds --> AES
Nonce --> AES
AES --> Payload

style Input fill:#1a1a2e,stroke:#e94560,color:#fff
style KDF fill:#16213e,stroke:#00d2ff,color:#fff
style Encrypt fill:#16213e,stroke:#00d2ff,color:#fff
style Output fill:#0f3460,stroke:#533483,color:#fff
root@kitploit:~
### 文件格式```
Bytes 0-3:   Magic "WDNV"
Bytes 4-5:   Version (u16 LE)
Bytes 6-21:  Argon2id salt (16 bytes)
Bytes 22+:   AES-256-GCM encrypted payload (nonce ‖ ciphertext ‖ tag)

VibeGuard 的一部分

Wardn 是 VibeGuard 的凭证隔离层——一个面向 AI 代理的安全守护进程。其他计划中的模块:

  • Sentinel — 提示注入防火墙
  • CloakPipe — PII 脱敏中间件
  • Watcher — 审计日志 + 仪表板

许可证

MIT

下载工具
特性保证
凭据不在代理内存中代理进程仅持有占位字符串
凭据不以明文形式存储在磁盘上使用 AES-256-GCM 加密保险库及 Argon2id KDF
凭据不出现在日志中所有日志输出中仅出现占位符
凭据不出现在 LLM 上下文中占位符注入到环境变量,真实密钥在网络层
成本暴露有边界每个代理每个凭据的令牌桶速率限制
凭据回显保护API 响应中的真实密钥在被代理接收前被剥离
内存安全SensitiveString/SensitiveBytes 在释放时归零
原子化持久性先写临时文件再重命名,防止保险库损坏
攻击方式wardn 如何阻止
.env 凭据窃取无 .env 文件。密钥仅存在于加密保险库
恶意技能读取 $OPENAI_KEY获取到 wdn_placeholder_... —— 无用的
窃密工具针对代理配置仅发现占位令牌
提示注入泄露密钥密钥从未出现在代理上下文窗口中
代理日志包含凭据日志仅包含占位字符串
代理完全被攻破攻击者获得的是无用的占位符
循环代理导致成本失控每个代理每个凭据的速率限制
工具功能wardn 的差异
密钥管理器(Vault、AWS SM、1Password)安全存储 + 检索代理在运行时仍然获得真实密钥。Wardn 确保代理从不接触它。
Varlock基于模式的 .env 验证 + 安全配置专注于配置管理和泄露扫描。Wardn 在运行时注入凭据 —— 密钥从不进入代理进程。
OpenRouterAPI 路由 + 密钥管理信任客户端持有 API 密钥。Wardn 不信任 —— 代理持有无用的占位符。
dotenv + .gitignore将密钥排除在 Git 之外密钥仍存在于内存、环境变量、日志中。Wardn 将它们从三者中全部移除。
服务网格(Istio、Linkerd)服务间认证解决基础设施层的 mTLS。Wardn 解决代理到 API 的认证,且代理本身不被信任。