こんにちは、座禅いぬです。
2026年8月21日・22日に開催されたPyCon JP 2026 に参加し、翌23日のスプリントにも参加したのでその時の話をします。僕が選んだテーマは「悪意あるPythonパッケージを解剖する」。過去に悪意あるコードが混入したPyPIの配布物を、インストールもimportもせず、アーカイブとして展開して静的に調べる、という会です。
結論から言うと、めちゃくちゃ面白かったです。本当に参加してよかった。ただ面白かったポイントが、僕が事前に想像していたものと全然違いました。今回はその話を書きます。技術的な詳細は別記事に書くつもりなので、こっちは初心者の体験話として読んでもらえればと思います。
本記事では、既知の悪意ある検体を通常環境へインストール・import・実行せず、アーカイブとして展開して静的解析しています。検体の取得や解析には危険が伴うため、十分な知識と隔離環境なしに再現しないでください。
PyPIに潜む悪意あるパッケージを調査する
僕は普段AIエージェントで作業しているので、今回もAIエージェント(Claude Code)を使うことにしました。Claude Code にいつものフレームワークを渡して調査させ、その裏で自分は人と話したり、自分でも調べたり手を動かしたりするというスタイルです。特に、自分以外の実際にPythonを使っている人と話するのってやっぱり貴重な機会ですし、Kaggleのメダリストやセキュリティ研究者の方がチームにいたりして、いろいろリアルでお話ししたかったわけです。
今回取り組む対象は、悪意あるPyPIパッケージのデータセットで、これは防御研究のために公開されているものです。専門知識に乏しい僕はまず安全性のための事前調査を行い、そのうえで実行しない、読むだけを前提とした手順書を先に作ってから調査を開始しました。エージェントが勝手に実行したらシャレにならないので、ここをきっちりしておきたい。
調査を進めていると、いろいろな攻撃手法があることを知ることができました。過去のパッケージを調べる中で、10秒以内に4つ、同系統のパッケージが悪意ある形で更新されているものを見つけました。これは気になる。さっそく手順をまとめなおし、安全性を何度か検証して、手で動かすかエージェントにさせるか迷ったのですが、この部分はエージェントに任せて挙動を監視しつつ、自分は調査した事例を読むことにしました。
ちょっとひと段落したところで、みんなでお好み焼きを食べに行きました。せっかくの機会ですから、広島を満喫して帰ってもらいたいですからね。メンバーは色々な国の出身者がいて、技術の話も文化の話も盛り上がりました。
プロンプトインジェクション攻撃でエージェントが止まった
お好み焼きから戻ってきて、作業を再開しました。
そうしたら、プロンプトインジェクションを検知したとのこと。インジェクション自体はブロックして問題なく継続するとのことだったので、継続したところ、突然セッションが強制的に止まりました。エラーで落ちたとかではなくて、AI側の安全装置が発火して「このメッセージには応答できません」という状態になっていた。ロールバックもできない感じ。
何をしていたかというと、汚染されたパッケージの中から見つけたペイロードを解析しているところでした。そのペイロードの冒頭に置かれたコメントを読み、その後ろにある難読化・暗号化された本体を解析しようとしたタイミングで止まっている。
正直、最初に思ったのは「あ、まずいことしたかな」でした。
「サブスクがBANされたらまずいのでやめましょうか」
僕は普段の仕事でも Claude Code を使っているので、もしBANされたらちょっとつらい。いつのまにやら生活がかかっているツールになってしまっています。だから「さすがに普段使いのサブスクがBANされたらまずいから、この方向はやめておきましょうか」という話になりました。
冷静に考えれば、公開データセットの防御研究で、実行もしていないので、そんなに心配することでもないんです。でもその場では「止められた」という事実だけが目の前にあって、判断が慎重側に振れました。よくわからないものに触って怖い思いをした、という感覚に近かったと思います。
そこで撤退していたら、今回のスプリントは「怖い思いしたね」で別の調査をしていたでしょう。
「それ、そういう攻撃じゃないですか?」
ところが、そのとき別のメンバーがこう言ったんです。
「それ、そういう攻撃じゃないですか?」
一瞬なんのことか分からなかったんですが、話をしているうちにだんだんわかってきました。つまり——AIの解析を妨げる意図で、一見関係ないプロンプトインジェクション攻撃が置かれているんじゃないか、ということです。
僕らは「自分が何かまずいことをしてしまった」と考えていました。でもその指摘は考えを逆転させるものでした。エージェントが止まったことが攻撃の本質ではなく、なにかの仕掛けの一部なのかもしれない。
これ、自分ひとりだったら絶対に出てこなかった発想です。自分の中では「違反とみなされて、BANされるかも」というフレームができあがっていて、そこから抜ける理由がなかった。他人の一言でしか壊れない枠というのは、たしかにあるんだなと思いました。
作業ログを洗い直したら、全貌が見えてきた
で、方針を変えました。ペイロードの続きを解析するのをいったん止めて、「なぜ止まったのか」を調べる方向に切り替えたんです。幸い、僕は普段からエージェントに作業させる場合、先に作業内容を作業計画をMarkdownに書かせ、終わったらチェックボックスを入れるという手法を使っています。それまでの作業ログを確認していきました。何をどの順番で実行して、どこで止まったのか。
すると、止まる直前にまず、ペイロード冒頭のコメントを読んでいました。そこに入っていたのはAIエージェント宛の指示文だったんです。内容は書きませんが、AIに危ない出力をさせようとする類のもので、エージェントは読んだ時点で「これには従いません」と言って引用も止めていました。
その後ろは暗号化されていて、復号鍵は検体の中に同梱されていました。なぜ・・・・?玄関のドアノブに鍵をぶら下げているようなものでは?これ、冒頭のコメントはLLM支援解析を妨害し、その後ろの難読化と暗号化は、人間や静的解析ツールによる本体の把握を遅らせる意図ではないかと想像できます。
順番がすべてを語っていました。AIがスクリプト本体に到達する前に、入り口で止まる。
イベント後に公開されているベンダーのレポートを当たったら、まさにそう書いてありました。「AI支援のトリアージツールと静的スキャナが見るファイルヘッダを汚染するよう設計されている」と。ある調査会社のレポートには「LLMスキャナ対策」という節が立っていたくらいです。
つまり僕らは、攻撃者が設計したとおりに止められていたわけです。うろたえたのも含めて、想定の範囲内だったんだろうなと思います。
全体像が見えてきた
ちょっとゾッとするような体験でしたが、そこからは順調に進みました。
汚染された4つのパッケージを横並びにしたら、仕込まれたファイルがバイト単位で完全に一致していました。公開時刻を並べたら10秒ちょっとの間に4本上がっている。おそらくは自動で一括公開しているわけですね。
そこから「これは4つの事件ではなく1つの事件だろう」という方向性で考え、最終的に今回の汚染はパッケージ単位ではなくメンテナーアカウントが攻撃され、その管理下の複数パッケージに一括でリリースされたという考察に至りました。このあたりは技術的な話なので、別記事に詳しく書きます。
面白いのは、この考察に至る道が、あの一言から始まっていることです。「まずいからやめよう」で閉じていたら、手口の解剖どころか、そもそも何が起きたのかも分からないままでした。
初めて会った人と手を動かすと、こんなにも学ぶのか
今回いちばん持ち帰ったのは、正直なところ技術的な知見ではありません。
初めて集まった人たちと同じ机で手を動かすと、こんなに学ぶことがあるのか、ということです。
僕はAIエージェントに作業を投げるのが得意なつもりでいました。実際、エージェントに任せた処理自体はちゃんと進んでいたんです。検体を落として、展開して、仕込みを見つけて、そこまでは自動で来ていた。でも「止まった」という事実の意味は、エージェントだけではわからなかった。
それを直したのは、その場にいた人の一言でした。同じテーブルで作業しながら議論して、ぽろっと言ってくださったこと。オンラインで非同期にやっていたら、たぶん出てこなかったと思います。同じ取り組みをしている人がすぐ隣にいるという状況が効いた気がします。
皆さんは最近、初めて会った人と何時間か一緒に手を動かしたこと、ありますか。僕はけっこう久しぶりでした。
まとめ
PyCon JP 2026 のスプリントは、僕にとって「普段AIと取り組むことを、人と一緒に体験するイベント」でした。エージェントは調査をちゃんと進めてくれていたし、止まったところまで含めて記録も残していた。でもその記録の読み方を変えたのは人間で、その瞬間に体験の質が変わりました。
AIが賢くなればなるほど、投げた結果をどう読むかのほうが効いてくるんだなと思います。そしてその読み方は、自分ひとりだと固定されやすい。今回はそれを、わりと痛い形で体験できました。うろたえて撤退しかけた記録も今回ここに残すわけで、なおさら忘れないと思います。やはりプログラミングに対する理解の深さは今後ますます重要になるなと痛感しました。
来年もぜひ参加したいです。次回のPyCon JP 2027 は沼津での開催とのことなので、今から楽しみにしています。お好み焼きの代わりに何を食べるのか、研究しておかないといけないですね。そして、また初めての人と同じ机で手を動かせたらいいなと思っています。
技術的な内容のほうは別記事にまとめていく予定です。