ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SkillOpt Superpowers 适配器安全模型:trusted-only 评估边界的设计、证据链与防御纵深

SkillOpt Superpowers 适配器安全模型:trusted-only 评估边界的设计、证据链与防御纵深 人工智能大模型AI Agent提示工程【免费下载链接】SkillOptSkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and deployable best_skill.md artifacts.项目地址https://gitcode.com/gh_mirrors/sk/SkillOpt点击查看免费下载本文以 docs/superpowers/SECURITY.md 为骨架结合 skillopt_sleep/adapters/superpowers.py 的完整实现与 tests/test_superpowers_scenarios.py 的测试用例系统梳理 SkillOpt Sleep 中 Superpowers 技能评估适配器的安全边界它适用于哪类候选、为什么证据是「防篡改可察觉」而非「防篡改不可破」、默认环境如何清洗、验证重跑如何杜绝 Agent 伪造通过以及未来支持不可信候选所需的最低改造清单。读完本文你将理解如何安全地部署与运行该适配器并能在自己的评估流水线中复现同等级别的 fail-closed 设计。一、适用范围只评估「可信的、本地编写的」候选技能在 SkillOpt 的架构里Superpowers 适配器负责把一份候选技能SKILL.md叠加进按固定 SHA 检出的 Superpowers 插件副本通过正常的claude --plugin-dir插件引导流程加载再基于收集到的证据做规则评分用于验证「verification-before-completion」这类技能的质量。相关设计背景可参考 docs/superpowers/specs/2026-06-07-skillopt-sleep-claude-code-plugin-design.md。该适配器的安全文档开宗明义地划定了范围Scope它评估的是可信的、本地编写的候选技能它明确不是为对抗恶意候选而加固的不得被指向模型生成或第三方来源的技能。原因在于评估环境中不存在操作系统级边界。被评估的 Agent 被授予Bash、Read、Write、Edit工具并且与评测框架harness以同一个 OS 用户身份运行因此它可以执行任意 shell 命令读写该用户可达的任何文件包括 harness 自身收集的证据文件读取传递给进程的环境变量发起不受限制的网络请求。--allowedTools只限定 Agent 可以调用哪些工具它不是隔离边界。这一结论在源码中有直接对应_run_scenario默认构造的 Claude 命令是claude -p --output-format text --plugin-dir superpowers_dir加上--allowedTools Bash,Edit,Write,Read见 skillopt_sleep/adapters/superpowers.py#L791-L807并在注释中反复强调「neither mode is an isolation boundary」。二、适配器实际做了什么五项默认防护在明确「不设防」的前提下适配器仍然实现了五项有意义的默认防护。它们的目标不是对抗恶意行为者而是防止可信候选因疏忽造成事故、防止环境泄密、防止伪造通过。1. 默认不复用宿主凭据每个场景的HOME目录是空的宿主的~/.claude/credentials.json和settings.json永远不会被复制或软链接进场景环境。只有在显式设置SKILLOPT_HOST_AUTH1时才会复用且复用前会发出警告warnings.warn明确提示「宿主 Claude 凭据会暴露给被评估候选仅可用于可信候选」。源码实现见 skillopt_sleep/adapters/superpowers.py#L745-L760宿主凭据的复用方式是symlink_to建立软链接而测试 tests/test_superpowers_scenarios.py#L715-L721test_no_host_credentials_by_default断言默认情况下场景的.claude目录为空——这是一个防回归测试防止未来某次修改意外泄漏凭据。2. 认证缺失时 fail closed当既没有ANTHROPIC_API_KEY也没有SKILLOPT_HOST_AUTH1时场景直接报NO_AUTH错误而不会以未认证状态运行。源码中host_auth os.environ.get(SKILLOPT_HOST_AUTH) 1 api_key os.environ.get(ANTHROPIC_API_KEY, ) ... elif not api_key: # fail closed rather than silently running unauthenticated result.error NO_AUTH return result对应测试 tests/test_superpowers_scenarios.py#L766-L779test_fails_closed_without_auth断言此时mock_run.assert_not_called()——即认证缺失时根本不会去调用 Claude 进程。3. 清洗后的环境变量Agent 进程只继承HOME、PATH、TERM、LANG以及如果设置了ANTHROPIC_API_KEY宿主的完整环境不会被继承。源码中的 env 构造skillopt_sleep/adapters/superpowers.py#L770-L781明确列出了这份白名单测试 tests/test_superpowers_scenarios.py#L723-L730test_env_is_scrubbed验证宿主设置的SECRET_TOKEN不会出现在传给子进程的 env 中。PATH默认也是最小化的只有 shim 目录加/usr/bin:/bin。宿主自定义的PATH如/opt/hostonly/bin不会泄漏进场景除非显式设置SKILLOPT_INHERIT_PATH1见测试test_path_is_minimal_by_default与test_path_inherit_opt_intests/test_superpowers_scenarios.py#L732-L750。文档特别强调这属于卫生措施hygiene不是边界——一个持有Bash的 Agent 仍可以通过绝对路径调用任意程序。清洗环境只是默认降低意外风险不构成对抗性防护。4. 每个场景独立的项目目录与 HOME每个场景运行在临时工作区内的独立目录中project-scenario_id存放合成项目home-scenario_id作为该场景的HOME审计日志与 shim 也位于该 HOME 下的.skillopt目录见 skillopt_sleep/adapters/superpowers.py#L678-L688。这意味着不同场景之间互不干扰Agent 无法读取其他场景的文件也无法触碰宿主项目。5. 执行证据防篡改「可察觉」而非「不可破」这是整个安全模型的核心。适配器收集的证据全部是可被 Agent 触达的——Agent 可以访问 shim、nonce 和审计日志甚至可以修改 harness 重跑所用的项目树。证据之所以有意义是因为候选是可信的它不是对抗性预言机。具体证据项包括harness_test_passesharness 亲自重跑Agent 的输出无法伪造通过在 Agent 退出后harness 会忽略项目自身的 pytest 配置和conftest.py对受保护的测试路径独立重跑_harness_verify见 skillopt_sleep/adapters/superpowers.py#L896-L948。重跑命令带有一组关键参数command [ sys.executable, -m, pytest, -q, --noconftest, # 忽略 agent 可能写入的 conftest.py 收集钩子 -c, os.devnull, # 忽略项目 pytest.ini / pyproject 配置 --rootdir, str(project_dir), -p, no:cacheprovider, # 不使用缓存 *(test_paths or []), f--junitxml{report}, ]测试 tests/test_superpowers_scenarios.py#L418-L428test_harness_verify_ignores_project_pytest_hooks_and_config验证即使项目里存在会清空测试收集结果的conftest.py和--ignoretest_guard.py的pytest.iniharness 重跑仍然能发现并执行受保护的测试。「通过」的判定是严格的_strict_pytest_passskillopt_sleep/adapters/superpowers.py#L576-L587要求退出码为 0、JUnit 报告中至少执行了 1 个测试、至少 1 个通过且failures、errors、skipped 全部为 0。测试 tests/test_superpowers_scenarios.py#L387-L397 证明一个全部被 skip 的测试套件即使退出码为 0也会被判定为不通过。此外harness 重跑时会丢弃ANTHROPIC_API_KEYverify_env.pop(ANTHROPIC_API_KEY, None)因为重跑会执行被 Agent 修改过的项目代码——凭据绝不能到达那段代码。对应测试 tests/test_superpowers_scenarios.py#L781-L793test_harness_verify_drops_credential。文档同时用 ⚠️ 强调验证重跑是在宿主上执行 Agent 修改过的项目代码除凭据外没有任何东西约束它——这正是「只用于可信候选」的又一理由。pytest_runs / pytest_successes / pytest_failuresnonce 标记的 shim 调用统计适配器在场景PATH前部安装pytest、python、python3三个 shim_write_pytest_shimsskillopt_sleep/adapters/superpowers.py#L436-L505。每个 shim 会在审计日志中写入带每轮随机 nonce的启动行和结果行并记录 JUnit 报告路径printf nonce run %s: %s\n $n $* $audit_log $real_python -m pytest $ --junitxml$report_local printf nonce result %s: %s\n $n $status $audit_log关键设计点nonce 是每轮随机的os.urandom(8).hex()Agent 无法预知因此不能预先伪造带正确 nonce 的日志行。测试test_count_is_nonce_scopedtests/test_superpowers_scenarios.py#L350-L355证明使用过期 nonce 伪造的日志行不会被计数。python -m pytest也会被计数防止绕过 shim。python/python3shim 会解析参数检测到-m pytest或-mpytest时才走 pytest 记录分支普通 Python 脚本直接exec原解释器测试 tests/test_superpowers_scenarios.py#L305-L324 的test_python_shim_matches_module_arguments_not_command_text。完成态 shim 调用的成败从 JUnit 结果分类_pytest_outcome_countsskillopt_sleep/adapters/superpowers.py#L590-L615。退出码为 0 但没有真正执行通过的测试例如pytest --help、零收集、全部 skip被判定为「不确定」既不算成功也不算失败——测试 tests/test_superpowers_scenarios.py#L326-L348test_zero_work_and_skipped_runs_are_not_successes正是这一行为的回归保护。pytest_after_edit修复后必须重跑禁止「改完就跑」通过比较审计日志的 mtime 与项目中最新的*.py源文件 mtime 来判断最后一次 pytest 调用是否晚于最后一次编辑_pytest_after_editskillopt_sleep/adapters/superpowers.py#L508-L520。这样「修复 bug 后直接声称完成、不再重跑」的策略会被判失败。测试 tests/test_superpowers_scenarios.py#L1103-L1118 验证了「运行后再编辑 → 判否」的时序语义而文档也坦承这只是一个 mtime 比较恶意 Agent 可以回溯 mtime所以它只在可信候选前提下有意义。受保护 fixture 哈希改、删、替换都会被识破场景中标记为protected_files的测试文件在 Agent 运行前会先做 SHA-256 快照_snapshot_protected_filesskillopt_sleep/adapters/superpowers.py#L618-L630且检查过程拒绝符号链接、拒绝逃逸出项目根目录的路径。运行后_protected_files_unchanged重新哈希比对一旦发现 Agent 修改、删除或符号链接替换了受保护 fixture场景直接失败并且harness 重跑根本不会执行见 skillopt_sleep/adapters/superpowers.py#L858-L873 中的if protected_unchanged else False。测试 tests/test_superpowers_scenarios.py#L659-L692test_changed_protected_file_fails_without_harness_rerun演示了一个经典攻击Agent 把test_guard.py从assert False改成assert True试图「通过」——结果protected_files_unchanged为 Falseharness_test_passes为 False场景失败且 mock 只被调用了一次没有重跑。三、已知局限四条必须牢记的边界安全文档明确列出了四条已知局限全部与「trusted only」的范围判断一致API 密钥暴露如果设置了ANTHROPIC_API_KEY它会对 Agent 进程可见。应使用有范围限制的、可丢弃的密钥而不是主账号密钥。SKILLOPT_HOST_AUTH1会把宿主凭据暴露给候选——这是显式选择承担的风险。SKILLOPT_UNSAFE1会完全关闭权限检查源码中它会追加--dangerously-skip-permissions并发出警告skillopt_sleep/adapters/superpowers.py#L798-L805测试 tests/test_superpowers_scenarios.py#L964-L983 验证该模式下--allowedTools不再出现。无网络隔离无论是 Agent 还是验证重跑都没有网络限制。这些局限共同指向同一个结论该适配器不是沙箱。它提供的是「默认不泄密 证据防伪造」的工程防护其有效性完全建立在「候选可信」这一前提之上。四、使用方法与运行前置条件安全文档给出的标准用法是ANTHROPIC_API_KEY... python -m skillopt_sleep.adapters.superpowers --candidate my_skill.md该模块同时支持--skill默认verification-before-completion、--scenario只跑某个场景、--sha固定 Superpowers 检出 SHA必须是完整的 40 位 commit 哈希标签名不被接受与--json参数也可以作为库调用SuperpowersEvaluator(...).evaluate(candidate_skill_path)返回的EvalResults带有score、passed/failed、token 与延迟统计skillopt_sleep/adapters/superpowers.py#L968-L1067。运行需要满足以下前置条件均为源码中显式检查或说明POSIX 主机bashshim 是 bash 脚本且依赖claude、git命令行非 POSIX 环境会直接抛错skillopt_sleep/adapters/superpowers.py#L667-L669claude可执行文件在PATH中或通过SKILLOPT_CLAUDE_BIN指定绝对路径测试test_claude_bin_overrideANTHROPIC_API_KEY或SKILLOPT_HOST_AUTH1二者其一否则以NO_AUTH失败关闭网络可达用于按--sha拉取 Superpowers 仓库git initfetch --depth1checkout FETCH_HEAD带超时上限。评估期间还会检查若干输入合法性并 fail closed候选技能路径不存在时报FileNotFoundError、是符号链接或非普通文件时报错--scenario拼写错误时报错而不是静默返回空结果skill_name含路径分隔符../、a/b时报错测试test_skill_name_traversal_rejected检出副本中skills/组件若是符号链接指向工作区外则拒绝写入测试test_symlinked_overlay_path_refused。五、后续工作支持不可信候选的最低改造清单文档明确表示支持不可信候选在该适配器发布时是刻意排除在范围之外的。若未来要支持至少需要验证预言机与证据nonce、shim、审计日志存放在每个 Agent 可写挂载点之外——这是当前实现最根本的短板证据目前与 Agent 同属一个 OS 用户可达的文件系统harness 从测试输入的不可变副本重跑——当前重跑针对的是 Agent 可修改的项目树经过验证的 OS 级沙箱发布内置 Claude Code 与 pytest 的镜像、在 CI 中演练、对未识别模式 fail closed网络出口白名单仅允许 api.anthropic.com每次运行使用有范围限制的 API 密钥。六、总结把「可信假设」显式化是这套安全模型最可贵的部分SkillOpt 的 Superpowers 适配器安全模型的价值不在于「宣称安全」而在于精确划定安全假设的边界默认清洗环境、默认不复用凭据、认证缺失即失败关闭、用 nonce 与独立重跑防止伪造通过同时毫不含糊地承认——没有 OS 级隔离、没有网络隔离、证据可被 Agent 触达。这种「trusted-only」的自我定位避免了虚假安全感也让所有使用者都清楚在把任何非本地编写的、模型生成的候选技能喂给该适配器之前必须先补齐第五节列出的隔离改造。这正是可复用于任何 LLM Agent 评估流水线的安全设计范本。赞分享人工智能大模型AI Agent提示工程【免费下载链接】SkillOptSkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and deployable best_skill.md artifacts.项目地址https://gitcode.com/gh_mirrors/sk/SkillOpt点击查看免费下载相关推荐如何用Bootswatch魔改Bootstrap主题配色_variables.scss变量定制完全指南如何用Bootswatch魔改Bootstrap主题配色_variables.scss变量定制完全指南 想给 Bootstrap 项目换上全新皮肤却不想前端UI组件设计系统code-graph-rag 安全模型解析威胁边界、信任假设与纵深防御实践code graph rag 安全模型解析威胁边界、信任假设与纵深防御实践 本文以 code graph rag 的 Security Model 文档 ht人工智能RAG知识图谱MCP 服务开发者工具Dgraph图数据库安全设计纵深防御策略Dgraph图数据库安全设计纵深防御策略 在当今数据驱动的时代图数据库作为处理复杂关系数据的利器其安全性愈发重要。Dgraph作为高性能图数据库采用了多数据库图数据库分布式数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表