Open
[Security][P1] 云函数 execute=["any"] 无鉴权 + db-init 公开可调用,存在越权与滥用风险 #2
雅皮士Add on  9 days ago
雅皮士
雅皮士
9 days ago Create

问题描述

6 个 Appwrite 云函数均以 execute=["any"] 部署(见 harmony_cloud/deploy/deploy.py 第 158 行),意味着任何未认证的匿名调用方都可以直接调用函数执行端点:

POST http://{host}/v1/functions/{functionId}/executions
X-Appwrite-Project: {project_id}

其中 db-init 同样公开可调,任意人可触发建库/建集合/写种子数据。

影响与风险

函数 匿名可调用的后果
db-init 任意人可触发建库/写种子数据,造成脏数据或资源滥用
register 可被刷量批量注册
login 可被用于密码爆破(无失败次数限制/限流)
getProgress/getDailyWords/learnWord 只需传入他人 userId 即可读取/篡改其学习记录(越权)

此外,APPWRITE_HOST 若只开放 80 端口(HTTP),API Key、密码、用户数据均以明文传输,存在中间人窃取风险。

说明:本项目定位为教学演示,README「边界说明」也承认未做生产化改造。本 Issue 在于记录安全边界,并提供加固方向,供后续演进参考。

加固建议

  1. 除 db-init 外,函数改为 execute=["users"],端侧通过 Appwrite Session 认证后调用;
  2. db-init 增加管理级 Token 校验(环境变量 ADMIN_TOKEN),或改为仅管理 API 可调用;
  3. 服务层校验 userId 与当前认证用户一致,防止越权读写;
  4. 为 login 增加失败次数限制 / 指数退避限流;
  5. 服务器配置 HTTPS(Nginx/Caddy TLS 反代 443 → 80),避免明文传输。
likedislike
雅皮士雅皮士
9 days ago Associated pull request