Skip to content

fix: 凭据密钥外置、构建下载校验与文件 key 隔离加固 - #3

Merged
xiaohai1314-sys merged 4 commits into
xiaohai1314-sys:mainfrom
xueyiwei868-ux:main
Nov 8, 2026
Merged

xiaohai1314-sys merged 4 commits into
xiaohai1314-sys:mainfrom
xueyiwei868-ux:main

Conversation

@xueyiwei868-ux

Copy link
Copy Markdown

来自 fork 的三部分加固,可直接合并或按块拆分。

1. 凭据加密与构建下载(55ff03d)

  • ENCRYPT_CREDENTIALS 扩展到 Linux/Docker:AES-256-GCM,密钥只接受进程环境变量 CREDENTIALS_KEY(hex/Base64,32 字节)或数据目录外的 CREDENTIALS_KEY_FILE(0600、普通文件、拒绝符号链接),二选一,缺失即拒绝启动,不自动生成、不回显、不写回 .env
  • 删除旧实现里在 runtime/ 自动生成密钥的逻辑(密钥和密文同目录,加密形同虚设)
  • NONSTREAM_KEEPALIVE 默认改 false:开启后 10 秒即提交 200,429 与认证失败会被盖掉
  • CI 与 Dockerfile 的全部构建下载(llvm-mingw、spidermonkey、libwebp、zig)改为经 build/fetch-verified.sh 对照 build/dependency-checksums.txt 校验 SHA256 后再解压

2. 文件 API 的 key 隔离(同上提交)

ListFiles / FileMetadata / AcquireFor 遵守 API_KEY_ACCOUNTS 绑定,跨 key 访问与不存在文件同样返回 404。

3. 安全审查修复(a02ba91)

对上述隔离的严格审查发现并修复四个问题:

  1. FileMetadata 侧信道:范围判断挪到刷新之前。原先先刷新再判范围,越权探测会触发属主账户刷新,且资源不存在时刷新错误按原样返回,错误类型可区分"存在但不归你"与"不存在";刷新后二次核对归属,堵住中途改绑竞态
  2. 属主泄漏:selectionIndicesLocked 在资源属主不在当前 key 范围时,先于"账户不匹配"错误返回 ErrResourceNotFound,原先该错误把属主账户 ID 带进响应
  3. 可用性:cwd 为文件系统根(systemd 默认 /)时跳过密钥文件的工作目录检查,否则所有绝对路径的 CREDENTIALS_KEY_FILE 被误拒
  4. 漏配提醒:API_KEY_ACCOUNTS 未覆盖全部已配置 key 时 slog 警告(不回显 key 内容),未列出的 key 可访问全部账户与文件

验证

  • go build / go vet / gofmt 全通过;本地以 SHA256 校验后的静态库运行 go test ./internal/aistudio/... ./internal/config/... ./internal/securefile/... 全绿
  • 回归测试以修复前代码反向验证失败:TestFileMetadataScopeSkipsRefresh(刷新错误泄漏)、TestSelectionResourceScopeHidesOwner(属主泄漏)

已知残留

AcquireFor 判范围前仍会刷新属主账户,存在时延侧信道;文件 ID 为高熵 Drive ID,枚举不可行,按最小改动原则未重构。

Created with Perplexity

cursoragent and others added 4 commits November 8, 2026 13:26
…oads

Keep non-streaming keepalive off unless it is explicitly enabled, so slow
429 and authentication failures still return their real status. Allow Linux
AES-GCM credential encryption only with an external key, scope file list and
metadata to the current API key, and verify published SHA256 values before
extracting build dependencies.

Co-authored-by: xueyiwei868-ux <xueyiwei868-ux@users.noreply.github.com>
…se-f57f

fix: preserve HTTP errors, externalize credential keys, and pin downloads
安全审查修复,四处改动:

1. FileMetadata 把受限 key 的范围判断挪到刷新之前。原先先刷新再判范围,
   越权探测会触发属主账户刷新,且资源不存在时刷新错误按原样返回,
   错误类型可以区分"存在但不归你"与"不存在"。现在越权与不存在的
   资源都在刷新之前返回 ErrResourceNotFound,刷新后再核对一次归属,
   资源中途改绑到范围外账户同样返回不存在。

2. selectionIndicesLocked 在资源属主不在当前 key 范围时,先于
   账户不匹配的错误返回 ErrResourceNotFound。原先 ResourceID 与
   AccountID 不匹配时错误消息带出属主账户 ID,绕过文件隔离的
   防枚举目标。

3. 凭据密钥文件的工作目录检查在 cwd 为文件系统根(systemd 默认 /)
   时跳过。原先任何绝对路径都被判定位于工作目录内,CREDENTIALS_KEY_FILE
   在裸机部署下全部被拒。

4. apiKeyAccounts 在 API_KEY_ACCOUNTS 未覆盖全部已配置 key 时打
   slog 警告。未列出的 key 不受账户范围约束,可访问全部账户与文件,
   漏配时提示操作员,不回显 key 内容。

已知残留:AcquireFor 在判范围前仍会刷新属主账户,存在时延侧信道;
文件 ID 为高熵 Drive ID,枚举不可行,按最小改动原则不再重构。

回归测试以修复前代码验证失败:TestFileMetadataScopeSkipsRefresh、
TestSelectionResourceScopeHidesOwner。
fix: 收紧文件 key 隔离的侧信道与属主泄漏
@xiaohai1314-sys
xiaohai1314-sys merged commit 96c1251 into xiaohai1314-sys:main Nov 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants