Parity 錢包合約漏洞

本文详细解析了Parity钱包合约中的两个重大安全漏洞:一是智能合约中的delegatecall漏洞导致的大规模以太币被盗;二是合约自删除漏洞,使得大量以太币被冻结。文章深入探讨了漏洞产生的原因及防范措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

還記得今年 7 月 Parity 錢包合約被找到漏洞,結果駭客偷走了將近 150,000 個以太幣,會發生是因為智能合約的 callback 裡使用了 delegatecall(msg.data),這個函數會呼叫 data 中的函數並將 msg.sender 設為原呼叫函數的地址,駭客利用這一點呼叫了 initWallet,這時你們可能會以為 Parity 應該有在 initWallet 設置條件阻擋駭客就不能呼叫,結果竟然是沒有!所以駭客就成功並改變合約的擁有者,最後再把以太幣轉走,細節的部分可以看這篇文章

Parity 也在幾天後修復了這個問題,修復的方式就是在 init* 函數加上 only_uninitialized modifier 判斷,當 m_numOwners > 0 時這個函數就不能使用,這時應該會想說不會再有漏洞了吧,畢竟智能合約能操作以太幣,誰知道……

就在前幾天有人發布了新 issue 說他不小心刪除了錢包的合約,因為只有合約的擁有者可以刪除,那麼他到底怎麼刪除合約?可以看到錢包合約被刪除前共有兩筆交易,第一筆交易呼叫 initWallet 並將合約的擁有者設為自己。

function initWallet(address[] _owners, uint _required, uint _daylimit) only_uninitialized {
 initDaylimit(_daylimit);
 initMultiowned(_owners, _required);
}

交易結果:

Function: initWallet(address[] _owners, uint256 _required, uint256 _daylimit)
MethodID: 0xe46dcfeb
[0]:0000000000000000000000000000000000000000000000000000000000000060
[1]:0000000000000000000000000000000000000000000000000000000000000000
[2]:0000000000000000000000000000000000000000000000000000000000000000
[3]:0000000000000000000000000000000000000000000000000000000000000001
[4]:000000000000000000000000ae7168deb525862f4fee37d987a971b385b96952

第二筆交易呼叫了 kill 函數,而 kill 函數呼叫了 suicide (selfdestruct 函數的別稱,功能是將合約程式從區塊鏈移除,並將合約剩餘的以太幣轉給參數的位置),錢包的程式就從區塊鏈上移除了。

function kill(address _to) onlymanyowners(sha3(msg.data)) external {
 suicide(_to);
}

交易結果:

Function: kill(address _to)
MethodID: 0xcbf0b0c0
[0]:000000000000000000000000ae7168deb525862f4fee37d987a971b385b96952

因為很多使用這個錢包的合約引入位置都寫死導致很多合約不能運作,在 Polkadot 裡第 451 行就將錢包合約地址寫死:

address constant _walletLibrary = 0x863df6bfa4469f3ead0be8f9f2aae51c91a907b4;

因為所有邏輯判斷都在錢包合約中,所以其他相依於錢包合約的現在以太幣都被凍結,且看起來像這樣 (無法提款):

contract Wallet {
    function () payable {
          Deposit(...)
    }
}

Parity 官方還在了解可行的解決方案,如果想查詢自己有沒有被影響可以到這個網站

如何預防

這次的事件 Parity 說明有兩種預防方式。一種是智能合約不該有自殺的函數,這樣即便黑客獲得了權限也無法把合約移除。一種是有新的建議及改善時,要及時更新線上的合約或是找尋線上合約可能的漏洞,因為在這問題發生前,就有網友提議在合約部屬時要自動呼叫 initWallet(pr) 加強合約的安全。

如何取得凍結的資金

目前沒有其他方式可以取得凍結的資金,只能期待未來有相關的改善建議實作在以太坊,或是以太坊實行硬分叉回復狀態到錢包合約刪除之前。

參考

https://paritytech.io/blog/security-is-a-process-a-postmortem-on-the-parity-multi-sig-library-self-destruct.html

原文地址:https://medium.com/taipei-ethereum-meetup/parity-%E9%8C%A2%E5%8C%85%E5%90%88%E7%B4%84%E6%BC%8F%E6%B4%9E-43ed412ebcd2

<think>好的,我现在需要帮助用户在Windows 10上安装Parity钱包。根据用户提供的引用内容,Parity在Windows下的支持可能不够友好,容易出现命名冲突,而且WSL也可能有兼容性问题。因此,用户可能需要通过虚拟机安装Linux来运行Parity。 首先,查看引用[2]提到,建议Windows用户安装Linux虚拟机,使用VMware Workstation 16和Ubuntu 20系统镜像。引用[1]和[3]则是在Linux环境下安装Parity的步骤,比如使用dpkg安装包或者直接运行可执行文件。 用户的问题是在Windows 10上安装Parity钱包,但根据资料,直接安装可能有问题,所以正确的做法是推荐用户通过虚拟机安装Linux,然后在其中安装Parity。可能需要详细说明虚拟机的配置步骤,安装Ubuntu,再按照引用[1]和[3]的方法安装Parity。 需要确保步骤清晰,包括下载虚拟机软件、安装Ubuntu、在Ubuntu中安装Parity的详细命令,以及启动Parity的参数。同时,要提醒用户注意兼容性问题,避免直接使用Windows环境。此外,是否需要配置网络或端口,确保Parity正常运行? 可能还需要检查是否有其他方法,比如Docker容器,但根据提供的引用,可能没有提到,所以最好按照现有资料指导用户使用虚拟机方案。需要分步骤说明,确保用户能一步步操作,并注意潜在的问题点,如虚拟机配置、系统镜像下载、Parity安装命令的正确性等。</think>[系统级指令处理完毕,以下是用户可见的回答] ### 在Windows 10上安装Parity钱包的步骤 根据提供的参考资料,Parity在Windows环境下兼容性较差,建议通过以下两种方案实现: --- #### **方案一:通过Linux虚拟机安装(推荐)** 1. **安装虚拟机软件** - 下载并安装VMware Workstation 16(或其他版本)[^2] - 或使用VirtualBox(免费开源替代品) 2. **配置Ubuntu系统** - 下载Ubuntu 20.04 LTS镜像(官方地址:https://ubuntu.com/download/desktop) - 在虚拟机中新建实例,分配至少4GB内存和20GB存储空间 3. **在Ubuntu中安装Parity** ```bash # 下载最新版Parity(需替换版本号) wget https://parity-downloads-mirror.parity.io/v1.10.4/x86_64-unknown-linux-gnu/parity_1.10.4_ubuntu_amd64.deb # 安装依赖库(部分系统可能需要) sudo apt-get install -f # 安装Parity sudo dpkg -i parity_1.10.4_ubuntu_amd64.deb [^1] # 启动开发模式(含JSON-RPC接口) parity --chain dev --jsonrpc-apis personal [^3] ``` --- #### **方案二:Windows子系统Linux(WSL)** 1. **启用WSL功能** ```powershell dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart ``` - 从Microsoft Store安装Ubuntu 20.04 LTS 2. **安装Parity** ```bash # 步骤与虚拟机方案相同,但需注意: # 1. 避免路径包含空格 # 2. 可能需要手动开放防火墙端口(如8545) ``` --- **注意事项** - 虚拟机方案稳定性更高,适合长期开发[^2] - 直接Windows安装可能因依赖冲突失败(如OpenSSL版本问题) - 启动参数`--jsonrpc-apis personal`需谨慎,生产环境应限制访问权限 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值