本文详细回顾了Chia Asset Token (CAT)从CAT1到CAT2的升级过程,原因是CAT1标准中发现了一个安全漏洞(CATbleed),该漏洞允许未经授权的资产增发。文章详细记录了漏洞发现、问题解决、以及团队如何处理和修复漏洞的时间线,包括监控、修复、以及最终通过空投CAT2代币来替换CAT1代币的过程,并提供了常见问题解答。
我们对 Chia 区块链和社区安全承诺的一部分是围绕安全以及发现安全事件时获得的经验教训提供透明度。本着这种精神,我们发布了一个关于此主题的通用漏洞披露 (CVE) 和通用弱点枚举 (CWE)。有关更一般的概述,请参阅我们之前发布的博文,升级 CAT 标准。
2022 年 6 月 14 日上午 10:00: 作为对 CAT1 标准审计的一部分,Trail Of Bits 报告说 CAT1 标准中可能存在一类约束检查漏洞。
2022 年 6 月 14 日上午 10:30: Chia 团队的 Matt Hauff 审查了报告的问题。Matt 发现这可能是软件中的一个重大 bug;此时他内部升级了他的担忧。
2022 年 6 月 14 日下午 1:00: Richard Kiss 审查了 Trail of Bits 的报告,然后与 Matt 合作仔细检查了该问题。此时,Richard 和 Matt 意识到问题的全部范围,并且这可能是 CAT1 标准中的一个致命缺陷。
2022 年 6 月 14 日下午 1:30: 完整的问题发现和潜在风险已报告给 Chia 执行团队。
2022 年 6 月 16 日上午 8:45: 建立了链上监控工具,用于向后和向前扫描整个链。如果发现任何利用证据,监控器将发出警报。
2022 年 6 月 17 日下午 2:00: Chia 团队已经确定了他们的修补计划,以纠正 CAT1 的问题,并且用 CAT2 标准替换 CAT1 标准的计划已经到位。
2022 年 6 月 20 日上午 11:00: Chia 团队已完成修复 CAT1 中 bug 所需的软件更改,以及对新 CAT2 标准的全面内部审核,并最终确定了是否需要任何进一步的改进。决定这是一个完整的补丁。
2022 年 6 月 20 日下午 2:00: 最终决定修补主代码库中的 bug,以修补状态发布 NFT1 标准。
2022 年 6 月 29 日下午 3:02: NFT1 随 Chia 1.4.0 版本发布,其中包括修复 NFT1 标准漏洞的未记录修复。
2022 年 7 月 25 日上午 10:00: 向广大公众宣布 CAT1 标准的报废,此时未提供有关该漏洞的详细信息。
2022 年 7 月 26 日上午 9:08: 在区块高度 2,311,760。(通过这一点,CAT 漏洞警报为阴性。)Chia 团队开始取消未完成的 CAT1 报价的行动。Chia 团队开始使用该漏洞生成解决未完成报价所需的 CAT1 数量。
2022 年 7 月 26 日下午 12:15: Chia 1.5.0 版本发布,其中包含代码修复。在 Chia 执行一些 白帽 活动以取消和返回所有未完成的 CAT1 报价时,未提供有关此 bug 的任何背景信息。
2022 年 7 月 26 日下午 7:00: Chia 团队在 Chia 博客网站上发布了漏洞详细信息。
2022 年 7 月 26 日下午 9:00: 在解决了一些初始工具问题后,CAT1 报价失效已完成,并且用户资产安全地位于其原始钱包中。
2022 年 7 月 29 日凌晨 12:00: Mitre.org 发布了提交的 CAT1 CVE:https://nvd.nist.gov/vuln/detail/CVE-2022-36447
2022 年 8 月 1 日: 大部分 CAT2 重新铸造和空投已在整个生态系统中完成。
关键的 CAT1 漏洞是由 Chia 工程师发现的,此前 Trail of Bits 报告了可能存在的此类连接漏洞(作为他们对 CAT1 标准的总体审计的一部分)。报告的漏洞类别是在连接此类字符串时软件中经常出现的一类典型 bug。Chia Network 团队的 Matt Hauff 立即对该报告进行了调查。Matt 发现了这个 bug 的更大影响,并将报告升级给了 Richard Kiss。Richard 在调查后发现了更大的安全影响,并最终与 Matt 得出结论,认为这个 bug 对 CAT1 标准来说是致命的,因为它允许在不受原始 尾部 控制的情况下膨胀 CAT1 资产。一旦问题的全部影响得到解决,Chia 团队就开始制定计划来处理灾难响应和修补漏洞。
一旦确定了该 bug 的严重性,公司便迅速采取行动,在链上建立监控系统,以识别该 bug 是否曾在野外被使用过,并监控未来的使用情况。在 Chia 团队在 CAT1 报废后开始利用该漏洞来解决未完成的报价之前,此警报从未发现任何利用该漏洞的证据。
在报告发布后的 6 月 17 日,也就是 3 天后,我们找到了解决此漏洞带来的每个问题的工作解决方案。到 6 月 20 日,我们已准备好所有工程工作来快速修补该漏洞,如果上述警报在报废前返回阳性结果。
在监控和响应计划到位以及软件和运营计划准备就绪后,Chia Network 将我们的注意力转移到 NFT1 标准上,该标准将随 1.4.0 版本一起发布。经过一些内部辩论后,我们决定支持 NFT 标准的稳定性而不是绝对保密,并将对 CAT1 漏洞的修补程序纳入 NFT1 的发布中。
虽然这个决定存在很小的风险,但我们的监控和快速修补响应计划以及在没有所有必要情况下识别这个软件 bug 的难度降低了风险。 在对 1.5.0 版本进行了数周的密集内部测试(其中包括 CAT2 标准和其他一些修复)之后,CAT1 的最终计划开始实施。7 月 25 日太平洋时间上午 10 点,我们宣布了即将到来的 CAT1 标准报废,大约在 24 小时后。7 月 26 日大约上午 9 点,CAT1 标准在区块高度 2,311,760 处结束。这推动了退役计划的下一阶段进入行动。
大约一周来,Chia 工程师一直在收集 币,方法是接受当时有效的 CAT1 报价,以确保接受和取消所有未完成的 CAT1 报价所需的 碎片 已准备就绪。在报废时间,这些工程师开始在链上利用该漏洞来 铸造 接受所需的 CAT1 数量,然后将 xch 资金返还给受影响的用户。 重要的是要注意,xch 报价的接受和返回是在同一个区块中完成的,Chia Network 从未拥有任何用户的 xch,只是控制了接受报价并将报价 币 路由回同一用户的交易。
通过这种方式,我们避免了大规模欺诈,在这种欺诈中,恶意的第三方可能会采取相同的行动并保留受影响用户的 xch 币。我们认为这是必要的一步,即使有点极端。我们认为,拥有资金返还的用户生态系统将比一些因长期被遗忘的报价或类似问题而损失资金的生态系统更快乐。
随着这项工作的完成和本文档的发布,Chia Network 认为 CAT1 标准已正式关闭,并且所有现存的 CAT1 币 现在都毫无价值。建议所有用户停止涉及 CAT1 币 的交易。更方便的是,该漏洞允许 CAT1 币 的所有者 熔毁 它们,从而将构成每个 CAT1 的组成 mojojo 返回 给所有者。
CAT1 标准通过获取连接的父 币 ID、CAT1 币 拼图哈希 和 CAT1 币 数量的 SHA 256 哈希 来计算正在花费的 CAT1 币 的 币 ID,如本示例所示:
(stager
(list MOD_HASH (sha256 ONE MOD_HASH) TAIL_PROGRAM_HASH)
(a INNER_PUZZLE inner_puzzle_solution)
lineage_proof
(sha256tree1 INNER_PUZZLE)
;; 计算币 ID
(sha256 (f this_coin_info) (f (r this_coin_info)) (f (r (r this_coin_info))))
prev_coin_id ; ID
this_coin_info ; (parent_id puzzle_hash amount)
next_coin_proof ; (parent_id innerpuzhash amount)
prev_subtotal
extra_delta
)
但是,此方法仅确保连接的字节的完整集是正确的,而不确保构成组件是正确的。如果字节从 CAT1 币 拼图哈希 的末尾移动到数量的开头,则将计算相同的 SHA 256 哈希。这样就可以使用不正确的金额,从而创建更大的 币。为防止这种情况,必须检查 币 ID,以确保构成组件是正确的。
(defun calculate_coin_id (parent puzzlehash amount)
(if (all (size_b32 parent) (size_b32 puzzlehash) (> amount -1))
(sha256 parent puzzlehash amount)
(x)
)
)
(stager
(list MOD_HASH (sha256 ONE MOD_HASH) TAIL_PROGRAM_HASH)
(a INNER_PUZZLE inner_puzzle_solution)
lineage_proof
(sha256tree INNER_PUZZLE)
;; 安全地计算币 ID
(calculate_coin_id (f this_coin_info) (f (r this_coin_info)) (f (r (r this_coin_info))))
prev_coin_id ; ID
this_coin_info ; (parent_id puzzle_hash amount)
next_coin_proof ; (parent_id innerpuzhash amount)
prev_subtotal
extra_delta
)
CAT1 漏洞是可以从不安全的连接中产生的一类漏洞的一部分。连接通常与 哈希 结合使用,其中字节连接起来以形成一个 前像 并传递给 哈希 函数。为避免此类漏洞,必须在连接之前检查每个组件的正确性。calculate_coin_id function
中提供了一个示例,其中检查父 币 ID 和 拼图哈希 的正确大小(32 字节),并检查 金额 是否为非负数。
币 由 (parent_coin_id puzzle_hash amount)
形式的可变长度结构表示,其中前两个字段为 32 字节,最后一个字段为 clvm varint
类型。
varint 示例:
0 = ""(空字符串)
1 = 0x01
50 = 0x32
20000 = 0x4e20
65000 = 0x00fde8 因为 varint 支持负值,所以我们用 00 字节作为前缀,否则高位会设置为 1 的数字
CAT1 拼图 的解决方案采用三个值的三元组,用于包含 拼图 的 币。它添加了一个条件 (ASSERT_MY_ID v)
,其中 v 是使用这些值通过 (sha256 parent_coin_id puzzle_hash amount)
计算的 币 ID。它进一步使用 金额 值来确保 mojojo 不会被创建或烧毁(除非得到 尾部 的授权)。
问题是 sha256 在评估时连接传递的值,并且我们始终无法确保 parent_coin_id 或 puzzle_hash 如预期的那样是 32 字节(或者通过任何其他方式验证为正确)。这意味着 puzzle_hash 和 金额 之间的边界可以改变,从而改变 币 的感知 金额。
因此,将 puzzle_hash 的最后 1 或 2 个字节滑动到 金额 的新的第一个或两个字节,并且你刚刚创建了一个价值更高的 币(或者,如果第一个字节设置了高位,则为负 金额!)。
这也为我们提供了一种轻松 熔毁 CAT 币 的方法:将边界一直向右移动,因此 puzzle_hash 字段包含来自实际 puzzle_hash 字段和 金额 字段的所有字节,因此 金额 字段显示为空字符串,表示 0。
此漏洞的 CVE 发布在 MITRE CVE 网站上,可以在此处找到:CVE-2022-36447 安全性是我们工作的关键组成部分,我们通过定期委托对 Chia 代码进行外部审计来保持积极主动的方法。与 Trail of Bits 共同发现此漏洞是来自我们对 Chia 代码的第三次独立审计和对 CAT 代码的第二次审计,并且将在其调查结果中发布报告。
什么是 CAT?
CAT 是 Chia 资产 代币。CAT 是在 chia 区块链上发行的 同质化代币。CAT1 标准于 2022 年 1 月最终确定。该标准可以在 chialisp.com/docs/puzzles/cats/ 中找到。CAT 的一些示例包括 Stably USD (USDS)、Spacebucks (SBX) 和 Marmot (MRMT)。
为什么 Chia 资产 代币 会发生这种变化?
CAT 标准已根据外部安全审计发现的安全漏洞升级到 CAT2。这导致升级到最新的 Chia 钱包应用程序,以及需要 CAT1 代币 的所有原始发行人以 CAT2 标准重新发行其 代币 并终止对 CAT1 的支持的更新。Chia 正在与社区成员合作,以使此过程尽可能无缝。
此更改是否会影响 Chia Network 的安全性?
不会。Chia Network 技术或 Chia 区块链的安全性没有受到威胁。该更新修补了 CAT1 的漏洞。
CAT1 的报废何时发生?
CAT1 在区块高度 2,311,760 之后报废,大约在 UTC 时间 17:00 左右。这是拍摄快照的时间。
如何在快照时检查我的 CAT1 余额?
转到 cat1.chia.net 并提供你的 公钥 以查看在重新发行时将空投给你的 CAT 余额。
每个人都需要升级吗?
我们建议所有 CAT(包括 USDS)持有者尽快升级到 1.5。在报废区块 (2,311,760) 之后,1.4 及更早版本上可见的 CAT1 将不再受支持。如果你不拥有任何 CAT(例如,如果你是不将 XCH 兑换为 USDS 或任何其他 CAT 的 农场主),则无需升级。
我需要升级我的 收割机 吗?
此更新仅影响钱包软件,因此你无需更新你的 收割机。
我的 NFT 或 XCH 是否有风险?
不会。NFT 和 XCH 不受漏洞影响,因此它们不需要进行任何更改。
在过渡期间,我是否有可能会损失金钱或我的 余额 不正确?如果是这样,我该怎么办?
如果你的钱包中有任何 CAT,你将需要尽快升级到 1.5,并确保在达到报废区块高度 (2,311,760) 之后以及升级到 1.5 之前不要使用任何 CAT 进行交易。这将有助于确保你期望的 余额 是在重新发行 CAT 时将空投给你的 余额。该 CAT1 网站 准确地反映了你的钱包在报废公告发布时的 CAT1 余额。它不会动态更新,但我们预计重新发行过程大约需要一周才能完全完成,因此在完成该过程之前,你的钱包中的 CAT2 余额 可能与 CAT1 网站 余额 不同。
在公告和报废区块 高度 之间,作为用户我应该做什么?
建议你:
取消你钱包中链上的任何未完成的 CAT 报价
不要接受 1.4 或更低版本的钱包中的任何 CAT 报价
记下你当前的 CAT1 余额
在最新版本的 Chia 钱包应用程序 (1.5.0 或更高版本) 可用时升级到该应用程序。
如何确保我已经取消了所有未完成的报价?
最重要的是,你将需要确保没有未完成的报价将你的 XCH 交易给其他人的 CAT。除了取消你钱包中的报价外,你还可以将你的 XCH 总 余额 发送给自己。由于 chia 币集合 模型,这将确保所有 XCH 币 将不再可用,如果接受了 流氓 或被遗忘的报价。
我可能因交易而损失了金钱,我现在应该怎么办?
不幸的是,在报废区块 高度 之后发生的任何 CAT1 交易都将无法恢复。如需进一步确认,请联系我们的支持团队,以便他们可以帮助检查交易何时发生,并可以帮助确定是否损失了金钱。
我是否需要取消我的 XCH 换 NFT 报价?
不会。只有 CAT1 代币 会受到影响。NFT 没有进行任何更改。但是,如果你有未完成的 CAT 换 NFT 报价,则应取消该报价。
我如何相信我的所有货币都将得到适当转移?
你可以使用你的 公钥 通过我们的 网站 检查你在快照时的 CAT1 余额。
我们正在向社区开发人员提供工具和支持,以帮助确保他们能够及时重新发行新的 CAT。所有 CAT 重新发行商都将以相同的报废区块 高度 按 代币 余额 进行。
我的 CAT1 会发生什么?
你现有的 CAT1 代币 仍然存在于区块链上,但随着每个人都升级到 CAT2,它们将不再有用。你将根据你在区块 高度 2,311,760 时的 余额 空投 CAT2 以替换你的 CAT1。升级到 1.5 后,你将不再看到原始 CAT 的任何 余额。
我需要多长时间才能将所有 代币 空投给我?
这将取决于原始发行人何时根据新的 CAT2 标准重新发行其 代币。我们希望它在 CAT1 报废日期后不久。建议关注任何社交媒体或 CAT 代币 项目的 Discord,以便你可以第一时间听到何时可以期待空投。
如果在区块 高度 快照后我进行了 CAT1 代币 交易会发生什么?
你只会空投在拍摄快照时的 代币 余额。在快照后发生的任何交易都不会计入提供给你的空投中。
我如何相信我的所有货币都将得到适当转移?在过渡期间,我是否有可能会损失金钱或我的 余额 不正确?如果是这样,我该怎么办?
你的 CAT1 代币 不会被转移。相反,你将被授予一组相同(在价值上)的 CAT2 代币。区块链已经包含 CoinSet 中所有 币 的完整记录。我们开发了一个工具,该工具将使用区块链来计算 CAT1 代币 的完整快照。此快照将准确地反映 CAT1 报废区块时的状态。
但是,CAT1 发行人确实需要执行完整的 CAT2 代币 空投。如果空投未完成,甚至未开始,则你可能不会收到升级后的 CAT2 代币。在这种情况下,你应该要求发行人进行升级。
我是 CAT1 代币 的发行人。我该怎么办?
请按照本文档 进行操作,该文档将指导你完成将 代币 重新发行为 CAT2 的过程。
我已升级到 1.5,但尚未看到我的任何 代币。我做错了吗?
不,你没有做错任何事情。截至 1.5,Chia 钱包应用程序仅向你显示你的 XCH 和 CAT2 余额。由于并非所有 CAT 都会立即重新发行,因此你的 CAT2 何时显示在你的钱包中取决于原始发行人何时发行其更新的 CAT2。
我钱包中的空投 余额 与网站向我显示的 余额 不符,我该怎么办?
首先,请查阅 CAT1 余额 网站 以查看你的历史 CAT1 余额。我们预计完整的重新发行过程大约需要一周才能完成。
如果 1.5.0 钱包中的 CAT2 余额 与 CAT1 历史参考不符,请检查你的钱包派生索引位于哪个位置,并将其与派生索引进行比较。派生索引显示在 代币 屏幕上的 余额 中。
如果你的钱包中的派生索引小于网站上找到的最高派生索引,你将需要更新钱包中的派生索引。为此,请转到 设置 > 派生索引,然后输入你从 cat1.chia.net 网站获得的数字。
我已经尝试了所有建议,但重新发行商没有正确获取我的钱包 余额。我该怎么办?
如果在尝试了上述所有步骤,并且自宣布以来至少已经过去一周,而你的 CAT2 空投 余额 仍然不匹配,那么我们建议直接与相关 CAT1 代币 的重新发行商联系。
如何取消我未完成的交换 CAT 报价?
从 Chia 钱包用户界面:
转到左侧导航栏中的 报价 选项卡
找到你创建的所有状态为 等待接受 的 报价
单击 操作 下面的三个点
单击 取消报价
确保已选择 在区块链上取消 选项
输入 费用(可选,但建议)
单击 取消报价
从 Chia 钱包命令行:
升级到 1.5 后,我丢失了所有钱包交易历史记录。如何访问我以前的 CAT 或 XCH 交易历史记录?
升级到 1.5 后,将创建一个新的钱包数据库以保留钱包数据库的任何先前副本。你可以安装以前版本的 Chia 钱包应用程序,并且较旧的客户端将查找你以前的钱包数据库并显示在升级到 1.5 之前在该钱包中发生的 XCH、CAT 和 NFT 的交易历史记录
如何知道更新的 代币 何时已空投到我的钱包?
你应该关注你拥有的 代币 的项目,以便在他们开始运行空投时收到通知。你还可以监视你的 Chia 钱包应用程序,并在 管理 代币 列表 下面查看是否有新的 CAT2 已空投给你。
为什么我的钱包中的 余额 与网站上报告的 余额 不符?
从网站获取派生索引,并更新 Chia 钱包应用程序中的派生索引。这将确保网站上报告的 余额 与钱包中的 余额 匹配。
什么是 派生索引?
派生索引是一个数字值,用于根据最近的交易跟踪已使用了多少钱包地址。这有助于建立一个窗口,以扫描区块链上哪些钱包地址以查找特定钱包拥有的所有可能的 币。
为什么我在 1.5 钱包中看到多个具有相同值的 代币?
你可能已收到来自不同方的多个相同的空投。其中只有一个是真正的 CAT2 代币。要确定哪一个是真的,请单击 管理 代币 列表,然后单击 在 尾部 数据库中搜索。只有原始 CAT1 发行人才能在 尾部 数据库上注册其 CAT2 等效项,因此你应该将其用作命名 CAT2 代币 的事实来源。
如果我有任何问题,可以与谁联系?
Chia Network 支持团队可以通过官方的 Keybase 支持 渠道回答问题并在此过程中提供帮助。
如何找到要输入到网站中的 公钥?
从 Chia 钱包用户界面:
转到 选择密钥 屏幕,然后单击 查看私钥
从可用密钥列表中复制 公钥
从 Chia 钱包命令行:
运行 chia keys show
从可用密钥列表中复制 主公钥
我检查了网站 (cat1.chia.net),但没有看到我的钱包的任何 代币,但应该有。我能做什么?
确认你输入到网站的 公钥 正确并且具有 CAT1 代币 余额,并且是未加固的密钥
单击 搜索下一个 1000 以查看是否已更新你的 余额。
网站报告的 余额 与我期望的不符。我该怎么办?
该网站扫描前 1000 个钱包接收地址,如果该 余额 没有反映你期望的,那么你应该点击 搜索下一个 1000,以便该网站扫描并更新找到的 余额。我们希望大多数用户能够从首次搜索中获得正确的 余额,但有些用户可能需要扩大搜索范围。
我在网站上报告的 CH21 余额 不正确。我该怎么办?
CH21 代币 被发行给非观察者密钥,因此它们不会显示在网站上,除非它们在某个时候使用不强制执行非观察者密钥支持的钱包进行了转移。CAT 标准与对观察者密钥的支持同时发布,因此通常大多数 CAT 和钱包都将受到网站的支持。即使你的 CH21 代币 未显示在网站上,CAT2 版本仍将被空投到你的 1.5 钱包中。
我正在运行 1.5,当我查看报价时,我看到的是 XCH 而不是 CAT 代币。怎么回事?
你可能正在查看 CAT1 的报价,该报价将从 1.5 版开始成为无效报价。原因是钱包不再识别 CAT1 的 尾部 ID。
我正在开发 Chia 钱包。我需要对我的代码进行哪些更改?
CAT2 内部拼图 不强制执行预先添加的公告。如果你使用 0xca 预先添加 币 公告(这是 CAT1 的一项要求),则该公告将失败,并显示 ANNOUNCE_CONSUMED_FAILED。相反,不要使用任何东西预先添加内部拼图公告。
请注意,来自 CAT 层的公告仍然需要预先添加 0xcb。这在 CAT2 中没有改变。
- 原文链接: github.com/Chia-Network/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!