跳转到内容

敏感信息混淆

防止敏感值(API 密钥、令牌、密码)被发送到 LLM 提供商。启用后,敏感信息在离开进程前会被替换为确定性占位符,并在模型返回的工具调用参数中恢复。

默认启用。可通过 /settings 界面或直接在 config.yml 中切换:

secrets:
enabled: false
  1. 在会话启动时,敏感信息从两个来源收集:

    • 环境变量,匹配常见的敏感信息模式(*_KEY*_SECRET*_TOKEN*_PASSWORD 等),且值长度 >= 8 个字符
    • secrets.yml 文件(见下文)
  2. 发送到 LLM 的出站消息中,所有敏感值会被替换为占位符,如 <<$env:S0>><<$env:S1>> 等。

  3. 模型返回的工具调用参数会被深度遍历,占位符在执行前恢复为原始值。

两种模式控制每个敏感信息的处理方式:

模式行为可逆
obfuscate(默认)替换为索引占位符 <<$env:SN>>是(在工具参数中反混淆)
replace替换为确定性的等长字符串否(单向)

在 YAML 中定义自定义敏感信息条目。检查两个位置:

级别路径用途
全局~/.xcsh/agent/secrets.yml跨所有项目的敏感信息
项目<cwd>/.xcsh/secrets.yml项目特定的敏感信息

具有匹配 content 的项目条目会覆盖全局条目。

数组中每个条目包含以下字段:

字段类型必需描述
type"plain""regex"匹配策略
contentstring敏感值(plain 类型)或正则表达式模式(regex 类型)
mode"obfuscate""replace"默认:"obfuscate"
replacementstring自定义替换文本(仅 replace 模式)
flagsstring正则标志(仅 regex 类型)
# Obfuscate a specific API key (default mode)
- type: plain
content: sk-proj-abc123def456
# Replace a database password with a fixed string
- type: plain
content: hunter2
mode: replace
replacement: "********"
# Obfuscate any AWS-style key
- type: regex
content: "AKIA[0-9A-Z]{16}"
# Case-insensitive match with explicit flags
- type: regex
content: "api[_-]?key\\s*=\\s*\\w+"
flags: "i"
# Regex literal syntax (pattern and flags in one string)
- type: regex
content: "/bearer\\s+[a-zA-Z0-9._~+\\/=-]+/i"

正则表达式条目始终进行全局扫描(g 标志会自动强制添加)。支持正则字面量语法 /pattern/flags 作为分开使用 content + flags 字段的替代方式。模式中的转义斜杠(\\/)会被正确处理。

# One-way replace connection strings (not reversible)
- type: regex
content: "postgres://[^\\s]+"
mode: replace
replacement: "postgres://***"

环境变量始终最先被收集。文件定义的条目随后追加,因此文件条目可以覆盖不存在于环境变量中的敏感信息(配置文件、硬编码值等)。如果同一个值同时出现在两者中,文件条目的模式优先。

  • src/secrets/index.ts — 加载、合并、环境变量收集
  • src/secrets/obfuscator.tsSecretObfuscator 类、占位符生成、消息混淆
  • src/secrets/regex.ts — 正则字面量解析和编译
  • src/config/settings-schema.tssecrets.enabled 设置定义