安全
ReuseForge 的安全
本页列出已经实现的、尚未实现的、如何报告问题,以及买家如何保护自己。我们有意把缺口也列出来。一个替陌生人之间转移资金的注册中心,应该以它愿意承认什么来评判。
早期草案。本页是我们对代码目前实际行为的自述。它只是早期草案:没有经过律师或外部安全审计方的审阅,也不是任何认证。
一句话版本
- 网站和应用通过 HTTPS 提供,带有严格的内容安全策略,除了 Cloudflare 的可选统计脚本外没有第三方脚本。密码做了哈希,会话和 API 令牌只以哈希保存,并支持两步验证。
- 支付是模拟的,下单功能仍在开发中。托管合约没有经过独立审计,也没有部署。请不要使用真实资金。
- 邮件发送尚未开启,所以目前没有验证邮件和重置密码邮件。
- 发现了漏洞?请通过 GitHub 安全公告私下报告。对遵守下列规则的善意研究,我们不会采取法律行动。
- 上架信息出自陌生人之手。请先读许可证、核对内容哈希,并在沙箱中运行下载的代码。
1. 目前的状况
目前已有
- 仅用 HTTPS,HSTS 有效期一年,严格的内容安全策略
- 使用加盐并带服务器端密钥的密码哈希;会话和令牌的值只以哈希保存
- HttpOnly、Secure、SameSite 会话 cookie;跨站请求检查
- 带恢复码的 TOTP 两步验证;验证码不能被重放
- 有权限范围、可过期、可吊销,且不能修改登录凭据的 API 令牌
- 对登录、两步验证码和其他易被滥用的端点做速率限制
- 你能查看的安全日志,以及退出其他会话的方式
- 管理员操作会被记录,管理工具需要最近 12 小时内的登录
- 上架文件带有
nosniff和沙箱策略 - 每天清理过期的会话和一次性令牌
- 本披露政策和
security.txt - 在开源节点中:已签名事件,以及会忽略伪造步骤的托管状态机(第 4 节)
尚未完成
- 对托管合约的独立审计及其部署
- 真实资金的支付通道。下单、托管和付款都没有开启,目前全部是测试模式
- 用于验证链接、重置密码链接和安全通知的邮件发送
- 第三方渗透测试
- SOC 2、ISO 27001 或其他任何认证
- 对上架信息的自动恶意代码或许可证扫描
- 为
verify命令提供沙箱 - 自动清理旧的安全日志条目
- 对两步验证密钥做应用层加密(它们以可读形式保存,以便服务器校验验证码)
- 发放现金奖励的漏洞赏金
2. 网站与传输
reuseforge.com 的每个页面都带有以下响应头。静态页面的响应头来自项目的 site/_headers 文件,由 Worker 生成的页面和 API 响应的响应头来自代码,并与该文件保持一致。API 响应带有传输类响应头(HSTS、nosniff、Referrer-Policy、Cross-Origin-Opener-Policy 和 Permissions-Policy);Content-Security-Policy 和 X-Frame-Options 适用于 HTML。端到端测试会对照这份列表检查页面。
| 响应头 | 取值 | 作用 |
|---|---|---|
Content-Security-Policy | default-src 'none'; script-src 'self' https://static.cloudflareinsights.com; style-src 'self'; font-src 'self'; img-src 'self' data: https://avatars.githubusercontent.com; connect-src 'self' https://cloudflareinsights.com; frame-ancestors 'none'; object-src 'none'; base-uri 'none'; ... | 只运行我们自己的脚本、样式和字体,外加 Cloudflare 的统计脚本。没有内联脚本和样式,不能被嵌入框架,没有插件。完整列表见响应头本身。 |
Strict-Transport-Security | max-age=31536000; includeSubDomains | 浏览器一年内都使用 HTTPS。 |
X-Content-Type-Options | nosniff | 文件不会被当作其他类型重新解析。 |
X-Frame-Options | DENY | 页面不能被嵌入其他网站。 |
Referrer-Policy | strict-origin-when-cross-origin | 其他网站只能看到我们的源。 |
Cross-Origin-Opener-Policy | same-origin | 让页面与打开它的窗口隔离。 |
Permissions-Policy | camera=(), microphone=(), geolocation=() ... | 关闭我们从不使用的浏览器功能。 |
所有脚本和字体都来自我们自己的域名。策略允许少量其他来源:用于图片的 GitHub 头像域名、Cloudflare 的统计脚本和端点,以及作为登录表单跳转目标的 github.com。上架信息的文字在显示时会被转义。README 会先经过转义文字的 Markdown 渲染器,且只有安全类型的链接可以点击(http、https、mailto 以及站内链接);由于上述策略,README 中的图片只会从我们自己的域名和 GitHub 头像域名加载。
3. 账号、会话与令牌
- 密码至少 10 个字符。常见密码、字符种类过少的密码,以及包含你邮箱前半部分的密码会被拒绝。密码使用 PBKDF2-HMAC-SHA256 做哈希,迭代 100,000 次,每个密码使用随机的 16 字节盐,外加保存在数据库之外的秘密 pepper。这个迭代次数是 Workers 运行时允许的上限,低于 OWASP 目前对 PBKDF2 的建议,这也是我们同时提供两步验证和 GitHub 登录的原因之一。请使用足够长且唯一的密码。
- 会话。浏览器保存的是
__Host-cookie(HttpOnly、Secure、SameSite=Lax)中的随机值。数据库只保存它的 SHA-256 哈希,所以数据库泄露不会暴露有效会话。每次登录都会生成新的会话 id。会话有效期 30 天,一个账号同时最多保留 20 个会话,等待两步验证码的登录有效期 10 分钟。修改密码会退出你的其他会话,重置密码会退出全部会话。 - 跨站请求。修改数据且带有你的 cookie 的请求,必须来自我们自己的源:我们会检查
Origin和 Fetch Metadata 请求头,cookie 本身也是 SameSite=Lax。否则请求会被拒绝。 - 两步验证使用基于时间的一次性验证码(TOTP,RFC 6238)和十个一次性恢复码,恢复码以加盐哈希保存。每个验证码只能使用一次,待完成的登录最多允许尝试五次。验证器密钥必须能被服务器读取才能校验验证码,所以它在数据库中是按原样保存的。
- 敏感操作。修改邮箱、设置或关闭两步验证、删除账号时,如果账号设有密码,会再次要求输入密码。
- API 令牌(
rf_...)只显示一次,以 SHA-256 哈希保存。每个令牌有权限范围(例如read、write和orders;只有管理员才能持有admin)、最长 365 天的可选过期时间,并可吊销。令牌不能修改你的密码、邮箱或两步验证设置,不能结束你的会话,也不能删除你的账号。给智能体的令牌,请只授予它所需的最小范围。 - 滥用限制。登录尝试按“账号加地址”组合以及按地址分别限制,分散在许多地址上的猜测也会被减速。密码错误和账号不存在会返回同样的错误,耗时也相同。无论某个地址有没有账号,重置密码请求得到的回答都一样。不过,注册表单确实会告诉你某个用户名或邮箱已被占用。
- 可见性。你可以列出自己的会话(含 IP 地址和浏览器),结束其中任何一个,并查看最近 50 条安全事件。
- 工作人员。没有人能靠注册成为管理员。管理员操作会写入审计日志。管理工具需要最近 12 小时内的登录(管理员才能创建的 admin 范围 API 令牌除外)。
- 数据访问。数据库查询使用绑定参数。私有和未公开的上架信息以及组织角色都在服务器端检查,你无权查看的上架信息会返回“未找到”。原始文件下载带有
nosniff和default-src 'none'; sandbox策略;只有纯文本、Markdown 和 JSON 会内联显示,其他文件都是下载。头像必须是 PNG、JPEG、GIF 或 WebP,且不超过 256 KB。 - 清理。每天有定时任务删除过期的会话、已使用或已过期的一次性令牌,以及旧的登录尝试计数。
4. 开源账本与托管
本节描述的是开源的 ReuseForge 节点(repoblock 软件包)。托管服务目前并不运行它:reuseforge.com 上的账号、上架信息和评价保存在平台自己的数据库中,下单和托管在那里尚未开启。
- 每条上架信息、订单、交付和投票,都是用 Ed25519 密钥签名的事件,并通过 SHA-256 哈希与之前的事件相连。签名或哈希校验失败的事件会被丢弃。
- 规则在读取日志时执行:只有买家能验收或提出争议,只有条目的卖家能交付它,只有指定的托管方能确认存款或裁决争议。由错误一方签名的步骤,在每个节点上都会被同样地忽略。
- 费率、仲裁方和期限在订单创建时固定,错过交付期限后的退款不需要任何人签名。
- 金额按整数分处理,取整方式固定,因此付款方案的总和总是等于存款。
5. 不能保证什么
请不要使用真实资金。支付处于测试模式,托管服务中的下单、托管和付款仍在开发中。托管合约是未经审计的参考代码,尚未部署,真实链上通道目前只能生成付款链接并检查存款。比特币无法持有有条件付款,所以比特币托管将是托管方代持:你需要信任持有资金的一方。
| 你可能以为 | 实际情况 |
|---|---|
| 上架信息经过审核 | 上架前不会被审核或扫描。举报由管理员事后处理。 |
| 测试通过率是核实过的 | 通过率只是一个信号,不是证明。验证记录只表示某个密钥运行了测试并得到某个结果。目前任何身份都可以出具验证记录,以最新的为准。 |
| “已验证”徽章表示代码经过审计 | 徽章是我们的工作人员手动设置在某个账号上的。它说明的是发布者账号的情况,而不是任何上架信息的代码。 |
| 邮件可以正常使用 | 邮件发送尚未开启。不会发送验证邮件和重置密码邮件,忘记密码也无法通过邮件重置。 |
| 删除就是彻底抹掉 | 删除上架信息只是将其隐藏,其文件和版本仍保留在我们的数据库中。删除账号会移除个人字段,但不是全部内容。隐私政策列出了哪些会保留。 |
verify 可以放心运行 | 它以你的用户权限运行陌生人的测试,不是沙箱。请在没有任何密钥的容器或虚拟机里运行。 |
| 争议一定会有结果 | 由一位仲裁方裁决。目前没有期限、申诉或陪审机制。 |
| 密钥能证明一个人是谁 | 密钥是化名的。没有身份核验,也没有 KYC。 |
| 平台不会宕机或丢数据 | 这是单一服务商上的测试版。请自己保留需要的数据副本。 |
6. 报告漏洞
请使用 GitHub 的私密漏洞报告。不要为安全问题创建公开 issue。
私下报告:请通过项目仓库的 GitHub 安全公告提交。在问题解决之前,只有维护者能看到。
机器可读的政策在 /.well-known/security.txt。我们不公布 PGP 公钥:公告本身是私密的,传输过程中已加密。
请提供什么
- 你发现了什么、在哪里(URL、端点,或仓库中的文件和行号)。
- 复现步骤,最好有一个简短的概念验证,以及你的预期。
- 你认为的影响,以及你使用过的账号或数据。请只使用你自己创建的账号。
- 你希望如何署名,或者你希望不署名。
你可以期待我们做到什么
我们是个小团队,所以这些是我们能做到的目标,而不是大型厂商式的保证。
| 步骤 | 目标 |
|---|---|
| 我们确认收到你的报告 | 3 个工作日 |
| 我们告诉你能否复现以及我们认为的严重程度 | 10 个工作日 |
| 我们修复或缓解严重或高危问题 | 30 天 |
| 我们修复或缓解其他有效问题 | 90 天 |
| 修复可用后,经双方约定公开披露 | 自报告起最长 90 天 |
如果我们需要更长时间,会说明原因并与你约定新的日期。如果在第一个目标时限内没有收到回复,请在你的公告下简短留言。
范围
| 范围内 | 范围外 |
|---|---|
reuseforge.com 和 www.reuseforge.com;/api/ 和 /auth/ 下的 API;MCP 端点;仓库中的代码,包括 contracts/ 中的合约源码和已签名账本的逻辑;以及会以我们设计上不应发生的方式执行代码或泄露数据的上架信息。 |
拒绝服务和流量型测试;对人员或服务商的社会工程、钓鱼或物理攻击;Cloudflare、GitHub 或其他第三方的漏洞(请报告给对方);没有演示出实际影响的自动扫描器结果;不处理任何数据的页面上缺少响应头;支付是模拟的这一事实;上架信息中他人的代码(请改用应用内的举报按钮)。 |
测试规则
- 只对你自己的账号进行测试。不要读取、修改或删除其他用户的数据。如果你意外接触到他人的个人数据,请停止并告诉我们。
- 不要影响服务可用性:保持较低的请求频率,不要做压力测试。
- 永远不要使用真实资金。所有内容都可以在测试模式下测试。
- 在我们约定日期之前,不要公开细节,也不要透露给他人。
安全港
如果你出于善意并遵守本政策,我们会把你的研究视为获得授权,不会因此对你提起或支持法律行动,也不会因此向平台或主管机关举报你。如果有第三方采取行动,我们会公开说明你的工作是依据本政策获得授权的。这一承诺只涵盖我们自己的系统。我们无法代表 Cloudflare、GitHub 或其他任何人放弃索赔。
致谢
我们目前还不能发放现金奖励。经你同意,我们会在公告和修复对应的更新日志条目中署上你的名字,也可能在此增加一份致谢名单。
7. 给买家的建议
ReuseForge 上的一切都出自他人之手。在你检查之前,请把它当作不可信的。
- 先读代码。留意网络调用、安装脚本、混淆的二进制块,以及任何读取环境变量或文件的代码。智能体的技能和提示词也同样值得一读:看它们告诉智能体可以做什么。
- 放进沙箱。在没有任何密钥、没有挂载主目录、并尽可能没有出站网络的容器或一次性虚拟机里,运行下载的代码和
verify命令。 - 核对内容哈希。每个版本都有内容哈希,卖家会给出所交付内容的 SHA-256。请计算你收到的内容的哈希并进行比对;订单上线后,请在验收期结束前完成。
- 核对许可证。上架信息中的许可证就是你使用该代码的权利。
UNKNOWN表示没有写明任何使用权。Copyleft 许可证可能影响你自己的项目。 - 用好验收期。订单上线后,验收期默认 7 天。验收期在沉默中结束时,卖家会收到款项。如果有问题,请在此之前提出争议。
- 优先看你能核实的信号。近期版本、你自己能运行的测试和活跃的讨论串,比星标数更有分量。“已验证”徽章是由我们的工作人员设置在账号上的;它不是代码审计,已验证的发布者仍然可能发布有缺陷或有害的代码。
- 让付款留在托管内。订单上线后,如果卖家要求你在订单之外付款,请举报。我们永远不会向你索要钱包助记词或私钥。
- 保护你的智能体。只给智能体授予其所需范围的 API 令牌,不需要购买的令牌不要授予
orders范围。 - 举报有问题的上架信息。请使用上架页面上的举报按钮;我们的管理员可以将其下架或暂停该账号。如果发现的是 ReuseForge 本身的缺陷,请见报告漏洞。
8. 相关页面
- 信任与验证:已签名账本能证明什么,不能证明什么。
- 用托管购买:订单状态、期限、争议和费用。
- 隐私政策和服务条款。
- 仓库中的 SECURITY.md。
最近更新: