Security: 登录限流 + SSRF 防护 + CORS 收紧 + 默认回环 + Docker 非 root(独立审计修复) - #134
Open
wangzunxiang wants to merge 3 commits into
Open
wangzunxiang wants to merge 3 commits into
wangzunxiang wants to merge 3 commits into
Conversation
- server/auth.go: /api/auth/login 与 /api/auth/init 增加按 IP 令牌桶限流 (burst 5,60s 补 1,超限 429 + Retry-After,bucket 30min 未活动回收), 缓解默认用户名 ARTEX + 无认证节流下的口令爆破面 - intercept/intercept.go: LLM 裁判不可用/超时/输出无法解析时的失败动作 由 allow 改为 deny(fail-closed),防止提示注入场景下拦截层整体失效 - cmd/artex/main.go: -addr 默认 0.0.0.0:8787 改为 127.0.0.1:8787, 宿主机部署不再默认对外暴露;需对外时显式 -addr :8787 - start.sh: 支持 ARTEX_ADDR / ARTEX_PROXY 环境变量覆盖(Docker 不受影响) - docker-compose.yml: 8787 端口默认仅绑宿主机回环(ARTEX_HOST_BIND 可覆盖) - db/db.go: CREATE DATABASE 前对库名做严格白名单校验(标识符白名单, 消除双引号逃逸可能)
- netguard(新包): 对用户可配的出站目标做解析后 IP 校验(含防 DNS 重绑定,DialContext 内先解析再校验全部 A/AAAA 记录)。默认拒绝 链路本地(含云元数据 169.254.169.254)/组播/未指定地址; ARTEX_SSRF_STRICT=1 加严到拒绝全部私网+环回;ARTEX_SSRF_ALLOW 可显式放行网段。兼容本地/内网 LLM 网关的默认用法 - 接入点: agent/provider.go(LLM base_url)、server/customtool.go (自定义 http 工具,直连与代理两条路径)、mcphttp/client.go (streamable HTTP + SSE 客户端) - server.go: setLLM/testLLM 保存前校验 base_url;server_mgmt.go pgSaveProfile 同样校验(含 MCP 行入库路径) - server.go CORS: 原实现无条件回显 Origin 且预检放行任意 Origin (等价于 Access-Control-Allow-Origin: *),与 ?token= 查询参数 通道叠加可被第三方页面跨域读取受保护数据。改为仅回显 ARTEX_CORS_ORIGINS 白名单中的 Origin,默认同源 - server.go: 新增 securityHeaders(X-Content-Type-Options: nosniff、 X-Frame-Options: DENY、Referrer-Policy: no-referrer、 Permissions-Policy 禁地理/麦克风/摄像头);CSP 因前端静态导出 内联脚本多暂不启用,留待内联脚本拆分后引入 - 新增单元测试: server/auth_sec_test.go(限流器、429 响应、clientIP、 CORS 白名单、安全头)、netguard/netguard_test.go(禁网段策略、 Dialer 替换、元数据地址拒连)
- Dockerfile: 新增 artex 系统用户(USER artex),容器内 Agent 本身 要执行 shell,root 运行会把代码执行/逃逸问题放大为宿主级风险; selfupdate 换装重写 /app 下二进制与脚本,故 /app 整体 chown artex 可写;Playwright 浏览器固定装到 /ms-playwright(构建期 root 的 ~/.cache 运行时不可见),ENV PLAYWRIGHT_BROWSERS_PATH 同用于运行 - release.yml: 全部 GitHub Actions 从 major tag(v4/v5/v6,可被移动) 钉到完整 commit SHA(均经 GitHub API 核实对应版本),降低供应链 投毒面
|
@wangzunxiang is attempting to deploy a commit to the Autumn's projects Team on Vercel. A member of the Team first needs to authorize it. |
Author
审计漏洞清单(白盒审计,v0.3.11 / commit 80a085d)本 PR 覆盖其中可安全加固的部分。完整 12 项清单如下(本仓库未开启 PVR,故在此列出; 严重(1)V-01 提示注入 → 无审批任意命令执行 → 数据外传(CVSS 9.1)
高危(4)
中危(7)
低危(6,摘要)CI Actions 未钉 SHA(本 PR 修复)、CSP 等安全头缺失(本 PR 部分修复)、 审计方法:白盒源码审计(Go ~8 万行 + Next.js 前端)+ gosec/semgrep 全量扫描人工复核
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
安全加固(基于 2026-09 代码安全审计)
独立安全审计发现的多项问题修复,全部为向后兼容的加固改动,
go build/go vet/gofmt/ 单元测试均通过。安全修复
/api/auth/login、/api/auth/init增加按 IP 令牌桶限流(burst 5,60s 补 1,超限 429 + Retry-After)。原实现无节流且默认用户名固定为 ARTEX。main.go -addr默认由:8787改为127.0.0.1:8787(宿主机部署不再默认对外暴露);docker-compose.yml的 8787 端口默认绑宿主机回环(ARTEX_HOST_BIND可覆盖);start.sh支持ARTEX_ADDR/ARTEX_PROXY覆盖。netguard):用户可配的所有出站目标(LLMbase_url、自定义 http 工具、MCP/SSE 端点)在 DialContext 内解析后校验全部 IP,防 DNS 重绑定。默认拒绝链路本地(含云元数据 169.254.169.254)/组播/未指定;ARTEX_SSRF_STRICT=1加严到拒绝全部私网;ARTEX_SSRF_ALLOW可显式放行。默认策略保持对本地/内网 LLM 网关的兼容。*)且预检放行任意 Origin,与?token=*** 查询参数认证通道叠加后可被第三方页面跨域读取受保护数据。改为仅回显ARTEX_CORS_ORIGINS` 白名单,默认同源。securityHeaders(nosniff / DENY / no-referrer / Permissions-Policy)。CSP 因静态导出前端内联脚本多暂不启用(注释已说明)。allow改为deny(fail-closed)。CREATE DATABASE库名严格白名单。artex用户运行(selfupdate 换装需要的 /app 写权限已保留;Playwright 浏览器固定装到 /ms-playwright)。测试
server/auth_sec_test.go、netguard/netguard_test.go(共 9 个用例,全部通过)go build ./...、go vet全通过;我改动的文件 gofmt 干净server包既有测试需要 Postgres DSN(环境依赖),与本次改动无关建议但未包含(需产品决策)
permission.Allowed()无条件放行 → 建议至少对非 system 工具走拦截层审计方:kylinor(独立代码审计,白盒 + 攻击链推演)