本文へスキップ
記事

Upwork の偽案件 2 件と、感染した Mac 1 台:北朝鮮の Contagious Interview に遭った話

悪意ある npm パッケージが仕込まれたテストプロジェクトと、curl | bash でインストールさせる偽の会議アプリ。2 回とも何が起きたのか、Claude Code でどうマルウェアを見つけたのか、そしてその後につくったツールの話。

公開
読了時間
3 分
タグ
  • security
  • upwork
  • malware
  • macos
  • contagious-interview
目次
  1. 1 回目:2026 年 6 月
  2. 2 回目:2026 年 10 月
  3. 振り返って
  4. フォレンジック調査官としての Claude Code
  5. 失ったもの
  6. だからツールをつくった:Tsuba

要点: Contagious Interview は、北朝鮮のハッカーによる偽の採用を使った攻撃です。Upwork や LinkedIn などのプラットフォームでクライアントや採用担当者になりすまし、最終的に「テストプロジェクト」を実行させたり、「会議アプリ」をインストールさせたりします。見抜くためのルールは 1 つ:採用の過程で、見知らぬコードを自分のマシンで実行するよう求められたら、手を止めること。すでに実行してしまったなら、ネットワークを切り、見覚えのないバックグラウンドプロセスやフォルダを探し、パスワードを変更し、重要なサイトではログイン中のすべてのデバイスからサインアウトしてください。

1 回目:2026 年 6 月

ウクライナ人を名乗るクライアントが Upwork で連絡してきました。手伝ってほしいプロジェクトがあると言い、「Online_Store」という Node.js のテストプロジェクトを送ってきました。

悪意あるコードは、npm の依存パッケージの 1 つに隠されていました。どのパッケージだったか正確には覚えていませんが、Tailwind 関連のものだったと思います。プロジェクトを実行すると、マシンにこっそり ~/.node_modules フォルダが作られ、中には axios と socket.io-client が入っていて、データを外に送る仕組みになっていました。

気づいたときには、もう何日もバックグラウンドで動き続けていました。見つけられたのは運がよかっただけです。イギリスにいる同僚がまったく同じ目に遭っていて、その話を聞いて、自分もやられたかもしれないと気づいたのです。

2 回目:2026 年 10 月

今度の相手はリトアニア人を名乗り、Veyron Capital(veyron[.]capital)という投資会社の人間だと言いました。この会社は Upwork に Web3 の求人をまとめて出していました。

彼のほうから先にメッセージが来て、Upwork でビデオ通話を設定しました。カメラはずっとオフで、終始中国語で話していました。その後 Telegram で友だち追加するよう頼まれ、グループに入れられ、そこで Web3 のデモをつくってチームのミーティングで発表するよう言われました。

発表の段になると、同僚が出張中でいつもの会議ツールが使えないので、「Zeff」(zeff[.]app)という会議アプリに切り替える必要がある、と言われました。グループの別の人がインストールを「手伝って」くれて、選択肢を 2 つ出してきました。ターミナルで curl | bash コマンドを実行するか、DMG をダウンロードするか。

私はインストールしませんでした。一度痛い目を見ていたので、「会議のためにこの見知らぬコマンドをターミナルで実行して」と言われた瞬間、同じ手口だとわかりました。

振り返って

どちらも北朝鮮の「Contagious Interview」攻撃でした。偽の採用、偽の面接です。ごく普通の仕事に見えるもので信頼を築き、それから自分の手で彼らのコードを実行させるのです。

2 つの攻撃は同じ手順をたどりました:接触、信頼の構築、依頼、ペイロード。2 回目、私はペイロードの手前で止まりました。
2 つの攻撃は同じ手順をたどりました:接触、信頼の構築、依頼、ペイロード。2 回目、私はペイロードの手前で止まりました。

いちばん気になったのは、macOS 標準の XProtect も従来のアンチウイルスも、2 回とも何の反応もしなかったことです。

フォレンジック調査官としての Claude Code

1 回目の感染のあと、実際に問題を掘り出してくれたのは Claude Code でした。Fable 5(Max)を使い、必要な権限を与えて、調査官のようにディスク全体とバックグラウンドプロセスを調べさせました。マルウェアがまだ動いていることをすぐに突き止め、そのあと掃除の手順を一つずつ案内してくれました。

失ったもの

幸い、何もありませんでした。この種のマルウェアがいちばん狙うのは暗号資産のウォレットですが、そのマシンには入れていません。大事なアカウントはすべて二要素認証をオンにしていたので、パスワードを取られても誰もログインできませんでした。

ただ、注意が 1 つあります。このマルウェアは、ブラウザに保存されたログインセッション(Cookie)もたいてい盗みます。それがあれば、攻撃者は二要素認証を飛ばしてそのままアカウントに入れます。だから被害に遭ったら、パスワードを変えるだけでなく、重要なサイトではログイン中のすべてのデバイスからサインアウトしてください。

だからツールをつくった:Tsuba

2 回の遭遇を経て、どこに穴があるのかが見えました。こうした攻撃は毎回新しい包装でやってきて、node、curl、bash のようなごく普通のツールを使うので、従来のアンチウイルスには怪しむ理由がありません。

そこで、Tsuba(鍔、日本刀の鍔)という小さな macOS メニューバーアプリをつくりました。発想はシンプルです。見知らぬコードが初めて実行される前に、代わりにひと目確認する。そのコードが何をしようとしているのか、どこから来たのか、既知の攻撃に似ていないかを調べ、許可するか、警告するか、ブロックするかを決めます。

見知らぬコードは実行される前に Tsuba の 4 つのチェックを通り、許可・警告・ブロックが決まります。
見知らぬコードは実行される前に Tsuba の 4 つのチェックを通り、許可・警告・ブロックが決まります。

私の 2 つのケースに当てはめると、こうなります:

  • 1 回目のような偽の面接プロジェクト:npm install や npm start を実行する前に、依存パッケージが公開されている悪意あるパッケージのリストに載っていないかを確認し、プロジェクトのソースから隠しコード、ハードコードされたリモートアドレス、ウォレットやパスワードストアを読むコードを探します。それでも不安なら、サンドボックスでプロジェクトを試しに動かし、実際に何をするのかを観察できます。
  • 2 回目のような偽の会議アプリ:curl | bash を見つけると、リモートのスクリプトを実行せずにダウンロードし、何をするのかを確認します。ダウンロードした DMG も、署名、公証、入手元をチェックします。

Tsuba は無料でオープンソースです(GitHub、Apache 2.0)。Apple シリコンと Intel Mac 向けのダウンロードやその他の情報は Tsuba のページ にあります。Upwork などのプラットフォームで仕事を受けている人や、他人から送られたコードをよく実行する人は、ぜひ試してみてください。

フォローする

つくったもの、実験、学んだことを随時シェアしています。

新しい動画は YouTube に、短いメモは X に。ここの記事はすべて両方にリンクしています。

YouTube