前些时候,与朋友一道简单地复盘了一下他钱包被盗的原因,这里分享一下过程和结果。
起因
某天,朋友在 Discord 上发来消息:
胡哥,我的钱包被盗了,幸好里面没有什么资产,我想搞清楚原理。
是这样,收到个招聘的邮件,约了面试,面试过程中让我运行MVP,链接钱包,我想连接一下问题也不大,不签名应该安全。
今天再看就发现被转账了。 连接上钱包后,Chrome崩溃了,重启还是崩溃,我当时就有点怀疑了。
https://bitbucket.org/oasis-crypto-games/socifi-mvp-v1/src/main/src/ 【免责声明:请谨慎对待,如果非要尝试的话,在隔离环境尝试!!! 本文作者不对此代码运行后果负责!!!】
这是代码,有兴趣的话可以找个沙盒机器测试一下
虽然当时已经过了晚上11点(SYD 时间),但我还是稍微花时间折腾了一下。
MM 安全报告
首先当然是解答朋友的疑问:为何没有签名,钱包还是被盗了?
在 LLM 时代,最省事的方式当然是直接把活派给 AI,否则我还得写一大堆文字。况且,在 deep research 的加持下,它写的报告肯定比我强多了!
于是乎打开 Gemini 选上 Deep Research,输入相关要求,并在它制定研究方案后进行了适当调整,便直接回车了。
在报告生成期间,接下来的当然不能空等,代码还是要稍微看看的。
初步代码分析
关注本号的朋友应该看到过我之前发的《代码解读》文章,同时我也在这篇文章里介绍过这类文章是如何写就的:
代码类文章生成 包括:代码快读和 review 等。
代码:https://github.com/DTeam-Top/tsw-cli/blob/main/agent/code.py
注:tutorial 尚不完善,且我也没有验证它生成的教程正确性如何,故慎用。
这里的主体思路跟上面一样,传入 prompt,得到期望的结果。
对于 prompt,其实没什么可说的,可直接在代码中看就好了。这里的关键是对于代码库的处理,即如何(尽可能)一次性的将整库传给 Gemini(这时候它的长上下文优势就凸显了)。
这里直接使用 repomix 即可,具体使用可参见其文档。它支持远超和本地 git 仓库。同时,注意配置好忽略哪些,避免传入不必要的内容,同时也是为了节省 token。
注意到没,我的 code 工具还有 review
模式,如今已经有了代码的 repo,直接用它来分析岂不是省事?因为在它的 prompt 中有这么两段:
...
## Security Vulnerabilities
### {file_name 1}
{Code 1}: {Explanation}
### {file_name 2}
{Code 2}: {Explanation}
## Potential Bugs
### {file_name 1}
{Code 1}: {Explanation}
### {file_name 2}
{Code 2}: {Explanation}
...
虽然简单,但起码可以快速地得出一些结论。运行之后,果不其然,在最终的报告中有这么一段描述:
...
## Security Vulnerabilities
// 恶意代码片段,略
The presence of large blocks of obfuscated code in `server/routes/api/auth.js` is a critical security issue. This code appears to be malicious (e.g., a backdoor, data exfiltration, crypto miner). It attempts to hide its purpose and origin. This code **must** be removed immediately, and the system should be audited for how this code was introduced and if any other parts of the system are compromised.
并且在结论部分,报告也提到:
...
The codebase exhibits significant security vulnerabilities, particularly the presence of obfuscated code and broken authentication logic. These issues are critical and require immediate attention.
...
光看代码面相,在一个 js
文件里掺合被混淆的代码,它一定有问题!此时已过 12 点,我把现状稍微收拾了一下便发给了朋友。
第二天的分析
既然已经找到被混淆的代码是最大的嫌疑,自然是将火力集中在它之上。于是乎,将代码下载,然后上传给 Gemini 大师,要求它分析一下。
总而言之,最大的安全隐患在于
server/routes/api/auth.js
中植入的可疑代码,其具备收集系统信息和外传数据的能力,极有可能用于盗取用户认证信息或其他敏感数据。其他文件中的一些小问题也可能降低应用的整体安全性。
在同一对话中,我还将朋友的过程简单描述了一下,让 Gemini 去分析。
您的以太坊钱包很可能是在连接了包含恶意代码的 MVP 后,由于客户端(浏览器或钱包扩展)的漏洞被利用,导致恶意代码在未经您显式签名的情况下,获得了转账权限并盗走了资金。Chrome 崩溃是一个强烈的迹象,表明当时您的浏览器环境正在遭受攻击或出现了异常。仅仅不进行签名并不足以完全抵御来自包含恶意代码的应用程序的攻击,尤其是在存在未知的漏洞的情况下。
同时,朋友自行分析了一下恶意脚本,发现其试图下载并执行一个远程脚本:
The malware attempts to download and execute additional payloads from a C2 server to maintain persistence.
并且在我同时在进行的逆向分析中,也表明:
脚本执行与下载后续载荷: 混淆脚本被执行。bp() 函数开始尝试连接远程服务器并下 载后续的恶意载荷或指令。这些载荷可能包含更高级的攻击模块。
至此,事情的全貌基本清晰了:运行 MVP 时,恶意脚本被执行,尝试下载并执行远程脚本,最终导致钱包被盗。
单从兴趣角度出发,这次分析基本上就到此为止了。毕竟,咱们在这方面只是业余选手。
启示
借助 LLM 的强大能力外加相应的行业知识,居然让我这样一个伪专家完成了看似不可能的逆向工程分析。而且,如果愿意花时间和精力,甚至可能可以得到更深入的分析。
在一边感叹 LLM 的强大之余,我也不禁盘算起来:我是不是可以基于 LLM 开始提供一些专业咨询服务了?😂😂😂
附件
访问原文可获得完整事件的全部报告:
- malicious-code-report-01.md
- malicious-code-report-02.md
- malicious-code-report-03.pdf
- MM-security-report.pdf
- socifi-mvp-v1-review-report.md
本文包含付费内容,需要会员权限才能查看完整内容。