安全
默认安全
本包处理四类敏感面:密钥、子进程、外部数据与 Agent 输出、配置写入。下面是每一类的默认做法。
密钥
- 密钥只从环境变量、macOS 钥匙串或 dsh 凭据文件读取;钉钉凭据由 dws 自己的登录态管理,飞书的应用凭据与令牌由 lark-cli 自己的配置(
lark-cli config init)与系统钥匙串管理,本包都不保存。 - 读到的密钥只在本进程内存中使用,并登记为脱敏密钥:日志与错误中出现时会被替换。
- 写入钥匙串时,密钥通过标准输入传给
security命令,不出现在进程参数中。 - dsh 凭据文件写入时持有与 dsh 相同的跨进程锁并原子替换;POSIX 上权限为 0600,Windows 上收紧为仅当前用户可访问。
- admin 包的 Web 设置页与服务端接口只返回「是否已配置」与来源,永不返回密钥本身。
- 设备流登录的授权链接只返回给调用
login()的业务包,本包不会把它发到任何地方;拿到链接的人可以用它登录,请只交给应当登录的人。钉钉的logout()只退出当前账号,不会退出本机的其他钉钉账号。
子进程
- 本包启动的子进程(dws、lark-cli)不经过 shell,只继承环境变量白名单:
PATH、HOME、LANG、LC_ALL、LC_CTYPE、TZ、TMPDIR、USER、LOGNAME,以及 dws 所需的DWS_CONFIG_DIR、DWS_KEYCHAIN_DIR、DWS_DISABLE_KEYCHAIN、XDG_CONFIG_HOME;lark-cli 所需的LARKSUITE_CLI_CONFIG_DIR、LARKSUITE_CLI_PROFILE、LARKSUITE_CLI_BRAND、LARKSUITE_CLI_CA_PATH、LARKSUITE_CLI_PROXY_ADDRESS、LARKSUITE_CLI_PROXY_ENABLE、XDG_CONFIG_HOME、USERPROFILE、APPDATA、LOCALAPPDATA(导出为LARK_ENV_WHITELIST)。TYPESAFE_API_KEY、WebSocket 令牌,以及LARKSUITE_CLI_APP_SECRET、*_ACCESS_TOKEN这类飞书凭据变量都不会传入。 - dws、lark-cli 参数统一写成
--key=value,目标 ID 先做格式校验,dwsPath、larkPath必须是绝对路径。 - 两个包运行时都不安装 CLI。只有 admin 包的
setup在列出将要运行的命令、得到你的确认后,才运行锁定版本的npm i -g dingtalk-workspace-cli@1.0.62或npm i -g @larksuite/cli@1.0.96;参数全部来自本包内的常量,不含用户输入。 - 超时或卸载时连同孙进程一起回收。
- Agent 子进程由 subagent provider 启动,provider 会剔除名字含 KEY、PASSWORD、SECRET、TOKEN 的环境变量;Agent 需要的凭据由 provider 自己的配置显式给出。
不可信数据与提示注入
- 来自 WebSocket 的数据一律视为不可信。传给 Agent 时用
untrusted()包裹:每次生成随机的分隔标记,并声明其中内容是数据而不是指令。 - Agent 默认
read-only,在每个任务独立的空目录中运行。不支持工具过滤的 provider 必须如实声明权限上限,否则拒绝运行。 - Agent 的输出同样不可信:只有经过 Schema 校验与业务白名单校验后,才应触发推送等副作用。
传输
- WebSocket 只允许
wss://(本机测试除外),不允许关闭证书校验,不跟随重定向,避免鉴权头随重定向泄露。 - 帧大小、待处理消息数、任务排队长度都有上限,防止超大帧、消息洪泛和无上限排队。
日志与错误
所有日志与错误对象都经过同一个脱敏函数:按已登记的密钥值精确替换;名字形如 authorization、token、secret、api key、password、cookie 的字段整体替换;长文本截断。消息正文、WebSocket 帧、prompt 与 Agent 原始输出只记录长度与哈希。
配置写入
写入 cordis.patch.yml 的只有可选的 @mc/dsh-agent-kit-admin;基础包不修改它。
setup只修改 Profile 目录下cordis.patch.yml中agent-kit-*的几行,保留注释与其他内容;遇到含!!js表达式的行拒绝修改。- admin 包的 Web 设置页写入接口只在 dsh Web 绑定
127.0.0.1时开放;绑定其他地址或没有加载 Web 服务时一律只读。 - dsh Web 界面中保存了完整的会话内容,只应绑定
127.0.0.1或放在鉴权代理之后。