はじめに:何が起きたか
2026年10月19日、The Hacker Newsが、GitHub上の94リポジトリ(66オーナー)に情報を盗むプログラムが仕込まれていたと報じました。調査したのはOpenSourceMalwareです。
仕込まれていたのは次の2つです。
-
フォントに見せかけたファイル:
public/fonts/fa-solid-400.woff2。名前はアイコン用フォントでよく見るものですが、中身は実行できるプログラムです -
VS Codeでフォルダを開いたときに自動で動くタスク設定:
.vscode/tasks.json
盗まれる対象は、AWSなどクラウドの認証情報、GitHubやnpm・PyPIのトークン、SSH秘密鍵、Kubernetesの認証情報、そしてClaudeやGeminiといったAIツールの認証情報です。macOSやLinuxでは、さらに5分ごとに外部から命令を受け取る仕組み(cronジョブ)まで入れられます。
分析できた79件のうち65件は、1年以上更新がなかったリポジトリでした。怪しい見た目のリポジトリではなく、普通に見えるリポジトリが書き換えられていた点が厄介です。
AIでアプリを作っていて、.env にAPIキーを置いている人。チュートリアルで見つけたリポジトリをとりあえず clone して開く人。どちらにも関係がある話です。
開いただけで盗まれるの?
いいえ。OpenSourceMalwareの解説によると、自動で動くのは次の2つがそろったときだけです。
- そのフォルダ(ワークスペース)を信頼するを選んでいる
-
自動タスクを許可している(確認画面で「Allow」を押した、または設定
task.allowAutomaticTasksをonにしている)
task.allowAutomaticTasks の既定値は off です。つまり、確認画面を読まずに「信頼する」と「Allow」を押してしまうと危ない、というのが今回の要点です。
仕組みを無害なタスクで確かめる
どういう仕組みなのかを、echo するだけの無害なタスクで確かめられます。
mkdir -p trust-demo/.vscode
cd trust-demo
.vscode/tasks.json を次の内容で作ります。
{
"version": "2.0.0",
"tasks": [
{
"label": "auto-run-demo",
"type": "shell",
"command": "echo 'このタスクはフォルダを開いたときに実行されました'",
"runOptions": { "runOn": "folderOpen" }
}
]
}
"runOn": "folderOpen" が「フォルダを開いたときに実行する」という指定です。
このフォルダをVS Codeで開くと、選び方によって次のようになります(OpenSourceMalwareの解説と、VS Codeのワークスペース信頼の仕様による)。
| 信頼の選択 | 自動タスクの許可 | どうなるか |
|---|---|---|
| 信頼しない(制限モード) | ― | タスクは実行されない |
| 信頼する | 許可しない(既定の off) |
タスクは実行されない |
| 信頼する | 許可する(Allow) | ターミナルが開き、echo の文字が表示される |
3行目の echo の部分が、今回の攻撃では情報を盗むプログラムの実行に置き換わっていました。
開く前に確認する3つのこと
1. 自動タスクをオフのままにしておく
VS Codeの settings.json で、次のようになっているか確認します。書いていなければ既定値の off です。
{
"task.allowAutomaticTasks": "off"
}
途中で「Allow」を押したことがあると許可されている場合があります。心当たりがあれば、明示的に off を書いておくと安心です。
2. 知らないリポジトリは「信頼しない」で開く
開いたときに出る「このフォルダー内のファイルの作成者を信頼しますか?」で、信頼しない(制限モード)を選びます。制限モードではタスクが実行されません。中身を読んで問題がないと分かってから信頼すれば十分です。
3. 開く前にターミナルで中身を見る
clone したフォルダで、まず次の2つを確認します(macOS / Linux、WindowsならGit Bashなど)。
自動実行のタスクがあるか
grep -rn "folderOpen" .vscode/ 2>/dev/null || echo "folderOpen なし"
フォントのふりをした別のファイルがないか
拡張子ではなく、file コマンドで中身の種類を見ます。次の内容を check-fonts.sh などの名前で保存して、bash check-fonts.sh で実行します。
find . -type f \( -name "*.woff" -o -name "*.woff2" -o -name "*.ttf" -o -name "*.otf" \) -not -path "*/node_modules/*" | while read -r f; do
t=$(file -b "$f")
case "$t" in
*[Ff]ont*) ;;
*) echo "要確認: $f -> $t" ;;
esac
done
本物のフォントなら Web Open Font Format (Version 2) のように表示されて、何も出力されません。中身がプログラムだと、次のように表示されます。
要確認: ./public/fonts/fa-solid-400.woff2 -> JavaScript source, ASCII text
もし開いてしまっていたら
OpenSourceMalwareは次の対応を勧めています。
- 別のきれいな端末から、GitHubのセッション・トークン・OAuth認可・SSHキーを取り消し、パスワードを変える
- 端末を隔離したうえで、SSHキー、クラウドの認証情報、npm / PyPIのトークン、GitHubトークン、kubeconfig、AIツールのAPIキーを作り直す
- macOS / Linuxでは
crontab -lで見覚えのない行がないか確認する(記事では#ghc2で終わる行が挙げられています)。端末の再構築も検討する - 自分が書き込めるリポジトリに、不審なワークフロー、
.vscode/tasks.json、フォントファイルが追加されていないか確認する
あわせて、偽の「GitHubのセキュリティ通知」メールによるフィッシングも報告されています。メールのリンクからではなく、ブックマークなどからGitHubを開いて確認してください。
まとめ
- 今回の攻撃は「信頼する」と「Allow」を押したときに動く。確認画面は読んでから押す
- 知らないリポジトリは、まず制限モードで開くか、ターミナルで
.vscode/とフォントファイルを見る - APIキーを手元に置いているなら、狙われる側だと考えておく
所感
普段、プログラミングスクールで講師をしていて、受講生がGitHubのリポジトリを clone して VS Code で開く場面をよく見ます。「このフォルダー内のファイルの作成者を信頼しますか?」の画面は、深く考えずに「信頼する」を押されやすい画面だと思います。
今回の件で、あの確認画面が防御としてきちんと働いていることが分かりました。逆に言えば、読まずに押すと、その防御を自分で外すことになります。知らない人のリポジトリは、チュートリアルや課題のものでも、まず制限モードで開く。この習慣を自分でも続けつつ、受講生にも伝えていこうと思います。


