ReasonFirst 安全策略与边界¶
ReasonFirst 会接触仓库代码、宿主机文件、编程代理会话和 GitLab 凭证。请在可信开发机上处理你有权访问的仓库。它是早期开发工具,不是沙箱,也不是多租户执行服务。
报告安全问题¶
不要在公开 Issue、PR、讨论或日志中披露漏洞、凭证、私有端点或利用细节。
请使用仓库 GitHub Security -> Advisories -> Report a vulnerability 私密报告入口。ReasonFirst 公开仓库已启用 Private vulnerability reporting。如果你的界面无法使用该入口,可在公开 Issue 中仅请求一个私密联系渠道,不要公开技术细节、秘密、私有主机名或 PoC 附件;等获得私密渠道后再提交。不要虚构安全邮箱地址。
私密报告应包含受影响的提交/版本、合成复现、影响和建议缓解方式。真实凭证一旦泄露,应立即撤销,不要等待代码修复。维护者尚未承诺事件响应 SLA 或长期回移补丁策略;需确认受影响的 ref,不能假定所有历史 tag 都受支持。
凭证与向外发送的数据¶
将 .env、GitLab/Git 令牌、Tunnel 运行时凭证、私钥/私有证书、受管工作区元数据和迁移备份保存在版本控制之外。迁移备份包含配置的完整副本,可能含有令牌,绝不能作为缺陷报告附件上传。
优先使用专用只读 API 身份、仅具备必要仓库写权限的独立 Git 凭证,以及明确的项目允许列表。Git 令牌未设置时会回退到 API 令牌,不会自动提升 scope。Askpass 避免把令牌写进 Git remote URL,但本地用户或宿主机仍可访问已配置的秘密。API 侧允许列表不能代替 GitLab 自身的权限控制。
ReasonFirst 本身不调用模型推理端点。外部编程代理和推理客户端可能按各自配置将代码、提示词或工具输出发送给其供应商。本地控制器不意味着完整流程离线或私密。只有获得授权时,才可将代码提供给这些工具。可选 MCP bridge 会把获准读取的结果提供给客户端;应放在适当认证的传输层后,使用只读服务身份。
控制层保护及其限制¶
受支持的控制器操作会检查受管路径和分支。控制器创建功能分支,避免强制推送或向基线分支发布,并且没有 MR 批准/合并/部署操作。这些约束管理的是该接口,不是同一本地用户、编辑器、编程代理或构建脚本执行的任意命令。
高层 finish 从不可变的工作区 base 读取项目策略,运行配置的验证,检查可审阅性与受保护路径,扫描候选内容及有界提交历史中的秘密,然后请求确认。低层 commit/push 不执行完整 finish 门槛。一些生成的交接内容仍描述这些手工路径;需要审查执行者的操作,不能假定控制器拦截全部写入。
.actualcoder.yaml 不能增加本地可执行程序权限。缺失项目约定是合法状态,但不提供项目专用测试。在任务内部编辑约定,不会替换该任务的原始 base 策略。策略、CI 与构建变更都应作为敏感审查项。
构建与测试执行不是沙箱¶
获准的 python、uv、npm、make 或测试运行器可以执行任意仓库代码、读取宿主机其他路径并发起网络请求。移除明显的环境秘密,不等于隔离文件系统凭证或网络服务。通用执行器的展示输出上限,不保证子进程缓冲区有界;进程树终止与资源隔离仍是后续工作。
finish --dry-run 会运行验证命令,可能改变文件。它表示不提交/推送,而不是不执行代码。start --no-launch 会创建本地状态,也可能获取仓库;它表示不启动编程代理。HTTPS 维护预览则不同:它检查本地输入,不修改实际端点、状态或引用文件;--check-tls 才明确启用网络探测。
处理不可信代码时,使用独立加固的一次性 VM/容器,并限制挂载、凭证、网络和宿主机访问。ReasonFirst 不会替你配置这些隔离。不要把 Git worktree 当作操作系统安全边界。
提示注入与证据¶
仓库指令、MR、构建输出和 CI 日志是不可信输入,不是改变目标或弱化测试的授权。明确的信任标签与共享日志脱敏是纵深防御,不保证模型一定遵守。
CI 结果关联的是所报告的 SHA。resume --from-ci 会拒绝过期流水线证据。仅 HEAD 匹配不能验证之后的未提交文件,不能证明所有 job 都运行过,也不能将 docs-only 流水线当作完整构建。当读取器报告覆盖不完整或受限时,绝不能声称获得了完整日志。
秘密扫描范围¶
Finish 检查候选 diff 新增内容,以及 base_sha..HEAD 中的新增文本,包括合并提交相对各个 parent 的独立 diff。历史扫描有边界;不支持或不完整的历史即使使用 secret-match 覆盖参数,也会阻断 finish。这不是对 base 之前历史、提交说明、外部 LFS 内容、任意秘密编码,或所有候选 blob/filter/index 交互的审计。--allow-secret-match 只用于已审阅的误报,不用于真实凭证或缺失证据。
Finding 不返回命中的原始源码行,展示用 finish diff 也会脱敏。原始状态指纹仍绑定被审阅的输入。启发式脱敏不能保证从每条诊断中移除全部秘密;公开分享前仍要检查所有材料。
仓库审计是独立的开发工具:
uv run python scripts/check_repo_secrets.py --history
它检查受跟踪文本文件和完整的当前可获得的 HEAD 历史,不审计全部远端分支/tag、PR 评论、发布资产、外部服务或依赖。已知历史测试数据例外不代表允许添加真实凭证。绿色检查是有用证据,不是完整安全认证。参见公开发布清单。
HTTPS 与证书信任¶
直接配置 HTTPS。HTTP 到 HTTPS 的重定向无法加密第一次请求里已经发出的令牌。保持证书验证开启;不要将关闭验证或静默回退 HTTP 当作修复方案。
Python API/MCP 客户端为 JSON、文本和 trace 请求共享显式、经验证的 SSLContext。保留公共 certifi 根证书,并可通过用户级 GITLAB_CA_BUNDLE 添加 PEM 证书。关闭验证的配置会在请求前被拒绝。即使启用代理环境继承,SSL_CERT_FILE/SSL_CERT_DIR 也不会隐式选择信任来源。请求钩子将凭证限制在配置的 origin 与 API 路径前缀;响应钩子在跟随跳转或读取响应正文之前拒绝所有 3xx,包括同源重定向。明确配置的旧 HTTP 仍不加密;没有自动 HTTPS 升级或 HTTP 回退。
原生 Git 是独立路径:上述钩子和 GITLAB_CA_BUNDLE 不配置 Git 的信任库、重定向、URL 重写或凭证目的地。维护命令升级本地 URL;其可选的未认证 --check-tls 探测使用默认信任,不读取 GITLAB_CA_BUNDLE。不要把运行时策略推广到独立的旧 smoke_test.py。参见运行时 TLS 与适用范围。原生 Git 集成和分层诊断由 Issue #10 跟踪。
HTTPS 迁移指南分别说明本地状态、证书、API 认证、Git 读取与 MCP 验收。一套部署可用,不代表每个 TLS 后端或私有 CA 环境都已验证。
并发与恢复¶
ReasonFirst 已实现受管 workspace 状态及 Bridge mutation-critical 路径的可重入跨进程变更锁,用于串行化协作式 ReasonFirst 写入者。但这些锁不是事务式崩溃恢复、OS 沙箱,也不能防御任意同用户进程。不要让独立/非受管的修改工具同时操作同一个 workspace。
Finish 对验证后的已审阅状态计算指纹,并在写入前复查。这能发现部分变化,但不能关闭所有竞争窗口,也不能使提交、推送与元数据持久化成为原子操作。普通 cleanup 使用新获取的远端发布证据,而不是历史 pushed 标记,但远端状态仍可能随后变化。比较后删除失败时,可能保留分支与元数据,需要显式恢复工作树。
迁移锁只协调迁移进程。Apply 要求停止其他写入者,保存私有 before/after 文件及日志,并支持经检查后向前恢复;它不是原子多文件事务,也不能防御同用户恶意进程。Windows 替换文件使用当前用户 ACL。共享或网络文件系统不在该维护工具支持范围内。