Closed
security: auth.json file permissions rely on umask, missing explicit Chmod #400
aflyingtoAdd on  Jun 29Closed at  Jul 7
aflyingtoCollaborators
Jun 29 Create

发现来源

安全审查 (Agent 2)

位置

pkg/config/auth_config.go:277

证据

return os.WriteFile(c.authStatePath(), data, 0o600)

os.WriteFile 受进程 umask 影响。若用户设置宽松 umask (如 000),token 文件可能以 0666 权限创建。对比同包 config.go:211 对 config 目录执行了显式 os.Chmod(c.configDir, 0o700)。

影响

在宽松 umask 环境下,用户的 GitCode 认证 token 可能被同主机其他用户读取。

建议

在 os.WriteFile 之后添加 os.Chmod(c.authStatePath(), 0o600) 调用(一行修复)。

likedislike
AaflyingtoCollaborators
Jun 29 Added label: risk/mediumscope/credential-storage, status/triage,type/security
AaflyingtoCollaborators
Jul 1 Associated milestone: M1: Security Hardening
aflyingtoCollaborators
Jul 2 Comments:

验证记录

  • 当前版本或分支: main (41315d8)
  • 复现命令: 代码审查 pkg/config/auth_config.go:277 和 pkg/config/config.go:268
  • 实际结果: 确认问题存在。writeAuthState 和 writeConfigState 都用 os.WriteFile(path, data, 0o600),存在两个安全问题:
    1. 若文件已存在且权限较松(如 0o644),os.WriteFile 只截断内容不会收紧权限(Unix 行为)
    2. 若路径是 symlink 指向攻击者可读位置,os.WriteFile 会跟随 symlink 写入
      对比 config.go:211 已对 config 目录做了显式 os.Chmod(c.configDir, 0o700),但文件级别缺少同样处理。
  • 结论: 继续修复。在写入后显式 os.Chmod(path, 0o600) 收紧权限,并在写入前用 os.Lstat 检查 symlink。
likedislike
AaflyingtoCollaborators
Jul 2 Added label: status/verified
AaflyingtoCollaborators
Jul 2 Added label: status/in-progress
AaflyingtoCollaborators
Jul 6 Removed label: status/triage
AaflyingtoCollaborators
Jul 7 Added label: status/ready-for-review
AaflyingtoCollaborators
Jul 7 Removed label: status/in-progress
AaflyingtoCollaborators
Jul 7 Removed label: status/verified
AaflyingtoCollaborators
Jul 7 Close issue
AaflyingtoCollaborators
Jul 7 Added label: status/merged
AaflyingtoCollaborators
Jul 7 Removed label: status/ready-for-review
AaflyingtoCollaborators
Jul 7 Associated pull request
AaflyingtoCollaborators
Jul 7 Associated pull request