2024年初攻击事件处理方案
实施方案概述
本方案通过设定升级高度,确保在达到指定高度后自动执行force-deploy流程,并完成相关账户的拉黑及资产销毁操作。
详细执行步骤
1. 升级高度设定
将高度设定为当前网络高度加约5000个区块(假设区块出块时间为5000区块1小时,这里需要确认@Bob),并预留1-2小时的部署时间,根据实际出块时间进行调整。
2. 黑名单配置
在FrozenConfigStrategy::frozen_list_v1
中确认待拉黑地址列表 @Tim Yang。
3. 节点交易管控
配置AddressFilter::is_blacklisted
,以实现特定高度下自动解除交易限制。 @YSG
T1为强制升级的区块号,T2为解除交易限制的高度,T2必须大于T1,加上一个数值(为了缓冲和同步),但不超过某一范围,以便在后续可能的分叉中允许部分地址立即转账。
4. Force-Deploy执行
一旦达到指定高度,触发force-deploy流程,强制升级高度的计算如下
按照目前出块速度,已知平均5秒左右出一个块,每分钟出块为60/5=12,每小时出块为12*60=720,每日出块为 24*720=17280
按3月5日上线算,已知高度 22629195 的出块时间为2025年2月11日 12:00:02
从 2025年2月11日 12:00:02到2025年3月5日 12:00:00一共22天,高度差为17280 * 22=380,160
目标区块高度为 22629195+380,160=23,009,355
交易打开高度为ForceDeploy执行后1天时间,为23,009,355+17280=23,026,635
销毁高度为10天公示期,那么高度应该为23,009,355+(17280*10)=23,182,155
5. 升级函数执行
自动触发StdlibUpgradeScripts::upgrade_from_v11_to_v12
,执行拉黑操作。
异常处理机制
新增黑名单:通过基金会账户执行
FrozenConfigStrategy::add_account
。移除误加地址:执行
FrozenConfigStrategy::remove_account
。紧急情况:使用
FrozenConfigStrategy::set_global_frozen
锁定所有出块交易。
6. 信息公示
对拉黑地址进行为期10天的公示。
7. STC销毁流程
该逻辑为:任何人都可以在指定的区块高度之后调起销毁函数进行销毁。
销毁高度将配置在FrozenConfigStrategy模块中,参考以下代码,代码中提供了两个操作,一是会在调起升级函数的时候将销毁高度传入到BurnBlockNumber结构,另外一个是通过基金会账号调起update_burn_block_number来更新销毁高度。
module StarcoinFramework::FrozenConfigStrategy { struct BurnBlockNumber has key { block_number: u64, } ... // 初始函数,由升级触发函数调起 public fun initialize( framework_account: &signer, main_bnum: u64, barnard_bnum: u64, test_bnum: u64, other_bnum: u64 ) { ... } // 更新销毁高度 public entry fun update_burn_block_number(associal_account: signer, block_number: u64) acquires BurnBlockNumber { assert_association_root_address(&associal_account); let burn_block_number = borrow_global_mut<BurnBlockNumber>(Signer::address_of(&associal_account)); burn_block_number.block_number = block_number; } // 销毁黑名单中所有账户的余额 public entry fun do_burn_frozen() acquires BurnBlockNumber { ... } }
当到达指定的高度后,可通过调起 do_burn_frozen 来销毁黑名单中所有账户的余额,完成销毁
8. 结果公示
在社交媒体平台上公布销毁交易的Hash值。
9. 区块浏览器
在BARNARD演练中,回滚区块后需要重置浏览器索引程序的抓取高度,确保区块浏览器相关设置得到更新。barnard 回滚区块浏览器数据清理步骤
Barnard 网络执行演练
在进行主网升级之前,需要在 barnard 上进行演练。
首先,将基金会账户导入到本地账户列表:基金会账户导入链接
检查基金会账户的资源是否在强制升级后存在
0x1::Config::Config<0x1::FrozenConfig::FrozenConfig>
。starcoin% state list resource 0x0000000000000000000000000a550c18 ... "0x00000000000000000000000000000001::Config::Config<0x00000000000000000000000000000001::FrozenConfig::FrozenConfig>": { "json": { "payload": { "frozen_account_list": { "list": [ "0xd0c5a06ae6100ce115cad1600fe59e96", "0x1af80d10cb642adcd9f7fee1420104ec" ] }, "frozen_global_txn": false } }, "raw": "0x0002d0c5a06ae6100ce115cad1600fe59e961af80d10cb642adcd9f7fee1420104ec" }, ...
尝试在本地添加一个新账户,并按照以下流程测试该账户:
# 转入20个STC到黑名单账户0x5e7c9c96fe6fb1290aa6c9b14e3abb73 account transfer -s 0x0000000000000000000000000a550c18 -r 0x5e7c9c96fe6fb1290aa6c9b14e3abb73 -v 20000000000 -b # 0x5e7c9c96fe6fb1290aa6c9b14e3abb73 尝试转出1个STC到基金会账户,预期为成功 account transfer -s 0x5e7c9c96fe6fb1290aa6c9b14e3abb73 -r 0x0000000000000000000000000a550c18 -v 1000000000 -b # 将0x5e7c9c96fe6fb1290aa6c9b14e3abb73加入黑名单 account execute-function -s 0x0000000000000000000000000a550c18 --function 0x1::FrozenConfigStrategy::add_account --arg 0x5e7c9c96fe6fb1290aa6c9b14e3abb73 -b # 使用以下命令检查黑名单列表中是否有该账户 state list resource 0x0000000000000000000000000a550c18 # 0x5e7c9c96fe6fb1290aa6c9b14e3abb73 尝试转出1个STC到基金会账户,预期报错账户被冻结 account transfer -s 0x5e7c9c96fe6fb1290aa6c9b14e3abb73 -r 0x0000000000000000000000000a550c18 -v 100000000 -b txn dry run result: TransactionOutputView { status: Discard { status_code: StrView(18), status_code_name: "SENDING_ACCOUNT_FROZEN" }, gas_used: StrView(0), write_set: [], events: [], table_item_write_set: [] } # 尝试 burn 所有黑名单中的额度,预期为失败,因为未到指定高度 account execute-function -s 0x0000000000000000000000000a550c18 --function 0x1::FrozenConfigStrategy::do_burn_frozen -b { "ok": { "dry_run_output": { "events": [], "explained_status": { "MoveAbort": { "abort_code": 27137 ... } # 修改销毁高度 account execute-function -s 0x0000000000000000000000000a550c18 --function 0x1::FrozenConfigStrategy::update_burn_block_number --arg <height> -b # 尝试 burn 所有黑名单中的额度,预期为成功,到达了指定高度 account execute-function -s 0x0000000000000000000000000a550c18 --function 0x1::FrozenConfigStrategy::do_burn_frozen -b # 检查黑名单中的账户余额,预期为0
主网上线清单
确定上线时间点
大象矿池启动时间 @YSG
CoinEx 打款时间 @Tim Yang
准备基金会账户
检查基金会账户的签名和私钥
barnard 基金会账户需要通过两个账户来签名,需要在barnard来演练 @Bob
准备版本
基于1.0升级的代码检查,除漏洞修复外,确认是否还有其他改动starcoin 工程:https://github.com/starcoinorg/starcoin/compare/prepare_v1.13.9..barnard_rollback_3 @YSG
修改内容包括 node节点全局黑名单,direct save区块执行结果,force-deploy执行强制升级move 工程: https://github.com/starcoinorg/move/compare/127584f4cb1e2b4cd650f1e6c317250f5fccca49..7b6ac7bb04515ee4ced5b1c1cdafb6ea6cb4eadc @hui jiao
修改内容为校验script和script_functionstarcoin-framework 工程:https://github.com/starcoinorg/starcoin-framework/compare/a7eff4fa3e08cecfed09edf3dbf9d216832d7414..0732969c4f0992092fed0571c2af032e90efe2b6 @Bob
修改内容为 frozen_config确认安全漏洞是否已生效,确认使用新版本,旧代码是否还能调用,本地复现演示的会议录像:https://meeting.tencent.com/cw/2qWyOv4B6a (密码 FATP)@Bob确认执行代码强制升级高度(2025年3月5日 12:00:00):23,009,355确认主网打开交易的高度(强制升级1天后,2025年3月6日 12:00:00):23,026,635确认非法STC销毁高度:(2025年3月25日 12:00:00) : 23,182,155强升失败的应对方案:检查本地基金会账户是否存在FrozenConfig配置。如果该配置不存在,账户将继续处于冻结状态**(待讨论)**。
代币销毁
确定黑名单列表(参考Starcoin 主网升级与交易恢复公告 中的列表)
执行销毁操作
另外打款进来是否也能销毁
销毁后,发行总量是否能变化,这里需要确认不能变成负数;(已修改)
交易监控,大于一定数额的交易需要告警
参考信息
Starcoin Core 代码分支可以在以下链接找到:https://github.com/starcoinorg/starcoin/tree/master。
原始分支为 force_deploy,已于 04 月 17 日合并到 master,相关 PR 链接为:https://github.com/starcoinorg/starcoin/pull/4025。
Starcoin Framework 代码分支如下:https://github.com/starcoinorg/starcoin-framework/tree/v11_branch