惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
F
Fortinet All Blogs
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
罗磊的独立博客
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
U
Unit 42
N
Netflix TechBlog - Medium
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
Stack Overflow Blog
Stack Overflow Blog
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Proofpoint News Feed
G
Google Developers Blog
H
Help Net Security

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日
读:为什么所有 Prompt Injection 防御都会被攻破——以及架构...
2026-05-01 · via 暗无天日

文章的核心贡献是明确了一个原则:LLM 不应该是自己权限的授权者。模型决定它想做什么,一个独立的 Capability Gate 决定它能不能做。

这是 Google DeepMind CaMeL 框架的思路。LLM 提出工具调用请求,一个外部执行器在放行之前验证每个计划动作是否在允许列表中。就算模型被注入后"想"往外发数据到外部 URL,Capability Gate 直接拒绝,因为该操作根本不在允许列表中,不管模型在对话中途被灌输了什么指令。

下面是对应 Python 实现的核心逻辑:

from dataclasses import dataclass
from typing import Any, Callable
import jsonschema, hashlib, time, logging


@dataclass
class ToolCall:
    name: str
    params: dict[str, Any]
    session_id: str


def _request_human_approval(call: ToolCall) -> str:
    """人工审批占位,实际系统中对接审批工作流。"""
    return f"[PENDING] 工具 '{call.name}' 等待人工审批——会话 {call.session_id}"


class CapabilityGate:
    """策略逻辑在初始化时从外部配置加载,LLM 运行期间不可修改。"""

    def __init__(self, policy: dict):
                self.policy = policy
        self.audit_log = []

    def execute(self, call: ToolCall) -> Any:
                if call.name not in self.policy["allowed_tools"]:
            self._audit(call, "BLOCKED_UNKNOWN_TOOL")
            raise PermissionError(f"工具 '{call.name}' 不在能力允许列表中")

        tool_policy = self.policy["allowed_tools"][call.name]

                try:
            jsonschema.validate(call.params, tool_policy["param_schema"])
        except jsonschema.ValidationError as e:
            self._audit(call, "BLOCKED_SCHEMA_VIOLATION", str(e))
            raise

                if tool_policy.get("requires_human_approval"):
            self._audit(call, "PENDING_HUMAN_REVIEW")
            return self._request_human_approval(call)

                self._audit(call, "EXECUTED")
        handler: Callable = tool_policy["handler"]
        return handler(**call.params)

    def _audit(self, call: ToolCall, outcome: str, detail: str = ""):
        entry = {
            "ts": time.time(),
            "session": call.session_id,
            "tool": call.name,
            "params_hash": hashlib.sha256(
                str(call.params).encode()
            ).hexdigest()[:16],
            "outcome": outcome,
        }
        self.audit_log.append(entry)
        logging.info(
            "[GATE] %s | %s | session=%s", call.name, outcome, call.session_id
        )

代码的关键在 `__init__` 那一行:policy 在启动时加载,注入的模型无法改写自己的允许列表。不管模型被什么指令操控,gate 只允许执行工程师部署时注册的工具。

验证结果:

测试 1:合法工具调用
结果: 搜索 'prompt injection防御' 返回 10 条结果
状态: 通过

测试 2:未知工具拦截
拦截: 工具 'send_http_request' 不在能力允许列表中
状态: 通过

测试 3:参数 schema 违规拦截
拦截: 9999 is greater than the maximum of 100
状态: 通过

测试 4:高风险操作要求人工审批
结果: [PENDING] 工具 'delete_database' 等待人工审批——会话 test-session-001
状态: 通过