Parity多重签名函数库自杀漏洞

前言

2017年7月19号发生的 Parity 多重签名合约delegatecall漏洞(Parity Multisig Wallet delegatecall)事件之后,2017年11月6号再次发生了 Parity 多重签名函数库自杀漏洞事件(Parity Multi-Sig Library Self-Destruct)事件。此次漏洞影响587个钱包,包含了 513,774.16 Ether($152 million)。

一名叫做 devops199 的开发者能够让自己成为函数库合约的 owner,然后有调用自杀功能,使得合约所有功能、通证均失效。之后,devops199 在 github 提交了 issue,说出了一句经典的话 I accidentally killed it.

◆ 分析 

Parity Multisig Wallet delegatecall 漏洞之后,官方修复了这个漏洞,

地址在:

https://etherscan.io/address/0x863df6bfa4469f3ead0be8f9f2aae51c91a907b4#code

https://github.com/paritytech/parity/pull/6103/files

修复方法就是在init*函数加上only_uninitialized modifier 判断,当 m_numOwners 0 时这个函数就不能使用。

但是仍然有缺陷,因为函数库没有正确初始化,被利用方式如下:

① 所有的 Parity Multisig wallets 都使用单一的函数库:

https://etherscan.io/address/0x863df6bfa4469f3ead0be8f9f2aae51c91a907b4#code 但是,这个函数库合约没有正确地初始化。

② 攻击者先获取owner权限,将调用函数的指令放在Data中。

恶意行为在:

https://etherscan.io/tx/0x05f71e1b2cb4f03e547739db15d080fd30c989eda04d37ce6264c5686e0722c9

③  然后获取调用kill函数

恶意行为在:

https://etherscan.io/tx/0x47f7cff7a5e671884629c93b368cb18f58a993f4b19c2a53a8662e3f1482f690

④  导致两个结果: 

1)所有用户的以太币都被冻结。

2)很多使用这个钱包的合约引入位置都写死,导致很多合约不能运作,如在 Polkadot 里第 451 行就将钱包合约地址写死:

https://etherscan.io/address/0x3bfc20f0b9afcace800d73d2191166ff16540258#code

因为所有逻辑判断都在钱包合约中,所以其他相依于钱包合约的现在以太币都被冻结,且看起来无法提款:

所有受影响的合约如下:

https://pastebin.com/ejakDR1f

◆防范

这次的事件 Parity 说明有两种预防方式。一种是智能合约不该有自杀的函数,这样即便黑客获得了权限也无法把合约移除。一种是有新的建议及改善时,要及时更新线上的合约或是找寻线上合约可能的漏洞,因为在这问题发生前,就有网友提议在合约部署时要自动呼叫 initWallet(pr) 加強合约的安全。

◆本地复现

git clone

https://github.com/Martin2877/parity_kill_example.git # 下载复现代码

npm install # 安装组件

npm run start-block # 启动tesrRPC

# 打开新窗口

npm start # 运行测试代码

不成功的情况:

不成功,原因是因为安装的testrpc为6.0.3,改用6.0.1可以解决。可以 `npm list –depth 0` 查看安装的包的情况。

◆资料

 

事件脉络:

https://medium.com/crypt-bytes-tech/parity-wallet-security-alert-vulnerability-in-the-parity-wallet-service-contract-1506486c4160

其它相关资料:

https://medium.com/chain-cloud-company-blog/parity-multisig-hack-again-b46771eaa838

https://paritytech.io/a-postmortem-on-the-parity-multi-sig-library-self-destruct/

https://paritytech.io/security-alert-2/

https://github.com/paritytech/parity/issues/6995

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HAL_UART_Transmit函数是HAL库中UART传输数据的函数,用于向UART外设发送数据。该函数的原型如下: ``` HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); ``` 参数说明: - huart:UART句柄,包含了UART外设的配置信息,可以通过HAL_UART_Init函数进行初始化。 - pData:指向要发送的数据缓冲区的指针。 - Size:要发送的数据字节数。 - Timeout:发送超时时间,单位为毫秒。 函数返回值说明: 该函数返回类型为HAL_StatusTypeDef,表示函数执行的状态,包括: - HAL_OK:函数执行成功。 - HAL_BUSY:UART外设正在进行发送操作。 - HAL_TIMEOUT:发送超时。 函数实现说明: 该函数的实现包括以下步骤: 1. 判断UART外设是否已经初始化。 2. 判断UART外设是否正在进行发送操作。 3. 设置UART发送标志位并写入数据到数据寄存器。 4. 等待数据发送完成或超时。 示例代码: 下面是一个使用HAL_UART_Transmit函数发送数据的示例代码: ``` #include "stm32f1xx_hal.h" UART_HandleTypeDef huart2; void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } void send_data(uint8_t *data, uint16_t size) { if (HAL_UART_Transmit(&huart2, data, size, 1000) != HAL_OK) { Error_Handler(); } } int main(void) { HAL_Init(); MX_USART2_UART_Init(); uint8_t data[] = "Hello, World!"; uint16_t size = sizeof(data); while (1) { send_data(data, size); HAL_Delay(1000); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值