我差30秒就在我的机器上运行了恶意软件。
攻击媒介?来自一家“合法”区块链公司的虚假编程面试。
以下是一个复杂的诈骗操作如何几乎骗到我,以及为什么每个开发人员都应该阅读这篇文章。
骗局的设置
上周,我收到了 Mykola Yanchii 的一条 LinkedIn 消息。他是 Symfa 的首席区块链官。真实的公司。真实的 LinkedIn 个人资料。1000 多个联系人。一切看起来都很完美。
消息写得很流畅、专业。“我们正在开发 BestCity,一个旨在改变房地产工作流程的平台。有兼职职位。灵活的结构。”
我做了 8 年的自由职业者。构建过 Web 应用程序,参与过各种项目,也做过代码审查。我通常对安全问题很偏执——或者说我自以为是。
这看起来很合法。所以我同意了通话。
诱饵
在我们见面之前,Mykola 给我发了一个“测试项目”——这是技术面试的标准做法。一个用于评估我技能的 React/Node 代码库。30 分钟的测试。很简单。
Bitbucket 仓库看起来很专业。干净的 README。合适的文档。甚至还有那张公司里常见的、一个女人拿着平板电脑站在房子前的照片。你懂的。
这就是我差点搞砸的地方:我开会要迟到了。只有大约 30 分钟的时间来审查代码。所以我做了懒惰的开发人员会做的事情——我开始在没有先运行代码的情况下到处翻看代码库。
通常,我会沙箱化所有东西。Docker 容器。隔离的环境。但我当时很匆忙。
我花了 30 分钟修复了明显的错误,添加了一个 docker-compose 文件,清理了代码。都是些标准操作。准备好运行它并展示我的工作。
然后我有了那种偏执的开发人员时刻。
幸免于难
在敲下 npm start 之前,我向我的 Cursor AI 代理提出了这个提示:
“在我运行这个应用程序之前,你能看看这个代码库中是否有任何可疑的代码吗?比如读取它不应该读取的文件,访问加密钱包等。”
然后,我惊呆了。
在 server/controllers/userController.js 的正中间,坐落着这个“杰作”:
1 | //Get Cookie |
混淆的。鬼鬼祟祟的。邪恶的。而且 100% 活跃——嵌入在合法的管理功能之间,一旦访问管理路由,就会以完整的服务器权限执行。
我解码了那个字节数组:https://api.npoint.io/2c458612399c3b2031fb9
当我第一次访问该 URL 时,它是活动的。我获取了有效载荷。纯粹的恶意软件。那种会窃取一切的东西——加密钱包、文件、密码,你的整个数字存在。
更绝的是:该 URL 在 24 小时后就失效了。这些家伙不是在开玩笑——他们已经设置了他们的基础设施来快速销毁证据。
我通过 VirusTotal 运行了有效载荷——自己看看行为分析。剧透警告:它很恶心。
骗局的操作
这不是一些业余的骗局。这是复杂的:
- LinkedIn 个人资料: Mykola Yanchii 看起来 100% 真实。首席区块链官。合适的工作经历。甚至还有那些关于“创新”和“区块链咨询”的令人尴尬的 LinkedIn 帖子。
- 公司: Symfa 有一个完整的 LinkedIn 公司页面。专业的品牌。多名员工。关于“用区块链改造房地产”的帖子。他们甚至还有附属页面和关注者网络。
- 方法: 最初的接触中没有危险信号。专业的语言。合理的项目范围。他们甚至使用 Calendly 进行日程安排。
- 有效载荷: 恶意代码被战略性地放置在服务器端控制器中,准备在访问管理功能时以完整的 Node.js 权限执行。
心理学
这就是为什么这如此危险:
- 紧迫性: “在会议前完成测试以节省时间。”
- 权威性: LinkedIn 验证的个人资料,真实的公司,专业的设置。
- 熟悉度: 标准的带回家的编程测试。每个开发人员都做过几十个这样的测试。
- 社会认同: 拥有真实员工和真实联系的真实公司页面。
我差点就上当了。而我对这些东西很偏执。
教训
一个简单的人工智能提示让我免于灾难。
不是花哨的安全工具。不是昂贵的杀毒软件。只是在执行未知代码之前,让我的编码助手查找可疑模式。
可怕的是什么?这种攻击媒介对开发人员来说是完美的。我们整天下载和运行代码。GitHub 仓库、npm 包、编程挑战。我们大多数人并不会对每件事都进行沙箱化。
这是服务器端恶意软件。完整的 Node.js 权限。可以访问环境变量、数据库连接、文件系统、加密钱包。一切。
规模
如果这种复杂的行动正在大规模地针对开发人员,那么已经有多少人受到了攻击?他们现在在多少个生产系统中?
- 完美的定位: 开发人员是理想的受害者。我们的机器包含了王国的钥匙:生产凭证、加密钱包、客户数据。
- 专业的伪装: LinkedIn 的合法性、真实的代码库、标准的面试流程。
- 技术复杂性: 多层混淆、远程有效载荷传递、死人开关、服务器端执行。
一次成功的感染可能会危及大公司的生产系统、价值数百万的加密货币持有量、成千上万用户的个人数据。
底线
如果你是一名正在获得 LinkedIn 工作机会的开发人员:
- 始终沙箱化未知代码。Docker 容器、虚拟机,随便什么。永远不要在你的主机器上运行它。
- 使用人工智能扫描可疑模式。只需要 30 秒。可以拯救你的整个数字生活。
- 验证一切。真实的 LinkedIn 个人资料并不意味着真实的人。真实的公司并不意味着真正的机会。
- 相信你的直觉。如果有人催促你执行代码,那就是一个危险信号。
这个骗局如此复杂,以至于它骗过了我最初的 BS 检测器。但一个偏执的时刻和一个简单的人工智能提示就揭露了整个事情。
下次有人给你发“编程挑战”时,请记住这个故事。
你的加密钱包会感谢你的。
如果你是一名运行过 LinkedIn 招聘人员发来的“编程挑战”的开发人员,你可能应该把这篇文章读两遍。
LinkedIn 个人资料
消息
bit bucket
https://bitbucket.org/0x3bestcity/test_version/src/main/ - 不确定这个链接会保留多久。