「善意は、セキュリティホールになる」 LLMバグ図鑑番外編
こんにちは黒パグです🐾
まず初めにタイトルの新聞記事見ましたか?これ凄くないですか?
この新聞プロンプトは私の相互フォロワーさんの「かしおぺあ@AI Prompt Architect」さんの記事
こちらにあるプロンプトの使用許可いただきました!かしおぺあ様本当にありがとうございます!🐾
興味のある方は是非かしおぺあ様の記事へ足を運んでください!
それでは本編です🐾
先日ある記事をnoteで見ていたら驚きの記事がありました。
初心者さん向けのコード記事の中に見逃せない一文を発見。
初心者さんが読む記事だからこそ、余計にやばい。コピーしてそのまま本番環境に持っていく人が出る。
そういうコードが「動くコードで解説!」として上位に出てくる現状に、LLMエンジニアとして非常に危機感を覚えました。それくらい危ない事なんです。
もし個人ではなく会社の環境でそういったコードを実装した場合下手すると会社の存続が危ぶまれるほどのものです。
個人でも同じように全財産失うかもしれません。大袈裟ではなくマジで。
そんなやばいものをどうすればわかりやすく伝えられるか考えていたら……頭の中に響く声が…
うーん。 eval ………イーヴァル? 何だかどっかで聞いたことある響きが…
(……パグ ………黒パグよ ……聞こえますか…… 思い出すのです…… この歌を………)「けものは居ても のけものは居ない 本当の愛はここにある ほら 君も手をつないで大冒険」
はっ!!!! けものフレンズ!!サーバルちゃん!!!
# 危険なコード
result = eval(user_input)
# 実行結果
# → サーバル「わーい! すごーい! きみは eval できるフレンズなんだね!」
…待って。この子、名前があります。

🌿 けものフレンズって何?という方へ
2017年に大ヒットしたアニメです。世界中の動物が「フレンズ」という人型の女の子に変身して、ジャパリパークという広大な楽園で暮らしています。
このアニメの特徴が、「危険な動物も、怖い生き物も、全員かわいいフレンズになっちゃう」こと。ライオンもヘビも、みんな笑顔で手をつないで大冒険。
そしてプログラマーとけもフレの縁は深い。
ブームの最中の2017年、けもフレのセリフだけで動くプログラミング言語「Kemono言語」がエンジニアによって本当に爆誕しました。「たーのしー!」を連打してHello Worldを書くと1000文字を超えるやつです。当時のエンジニアたちは「なにこれなにこれ!」ってなってた。
そして当時から語り継がれる都市伝説がある。
eval()を書いた瞬間、サーバルちゃんが来る。
「わーい! すごーい! きみはなんでも実行できるフレンズなんだね!」
あれから9年。2026年のLLMエージェント時代に、その子がまだ野生で生息しているのが確認されました。

わーい、わたし evalちゃん! なんでも受け入れちゃうの…だって、信じてるから🌟

さて。eval()が何者なのかを説明します。
プログラムの世界では「文字」と「命令」は別物です。
たとえばあなたがレストランで「ハンバーグ」と書いたメモを渡したとします。普通の店員さんはそのメモを読んで、厨房に「ハンバーグ一丁!」と伝える。これが普通のプログラムの動き方です。文字はあくまで文字。命令は命令。ちゃんと区別されてる。
でもeval()は違う。
メモに「厨房の火を全部消して帰れ」と書いても、そのまま厨房に向かって叫びます。渡されたものを、なんでも、そのまま、命令として実行する。

これだけ聞くと「便利じゃん」と思うかもしれない。
問題は、メモを渡す人がいい人とは限らないことです。
LLMエージェント(AIが自律的に動くシステム)では、AIが生成した文字列をそのままeval()に渡す実装が出てくることがあります。でもAIの出力って、外部からの入力と同じです。プロンプトインジェクション(AIへの悪意ある命令の差し込み)で「このコードも一緒に実行して」と紛れ込んだら?
evalちゃんは笑顔で実行します。
「大丈夫、みんないい人だから!」

そしてセキュリティ界の結論はシンプルです。
「eval()を安全に使う方法は存在しない」
じゃあどうすればいいの? 実はevalちゃんには幼馴染がいます。

その幼馴染の名前は、astevalちゃん。
「古代の知識のライブラリ:安全なコード実行の守護者」
evalちゃんとは真逆のフレンズです。渡されたものを即実行するevalちゃんに対して、astevalちゃんはまず**構文木(AST)**で中身を全部調べてから判断します。
構文木というのは、コードを「命令の設計図」に分解したものです。「これは足し算だ」「これは数値だ」「……あ、これはシステム命令だ。拒否」という具合に、一個一個チェックする。

evalちゃんが玄関を全開放しているとしたら、astevalちゃんは全員に身分証を求める検問官です。
ただ、苦労人でもある。
「ちょっと待って! それ確認してから!」 「だから言ったじゃん!! なんで先に実行するの!!」
evalちゃんの隣でずっとそう叫び続けている。それがastevalちゃんです。
実際のコードで言うとこうなります。
# evalちゃん(無防備)
result = eval(user_input)
# astevalちゃん(検問官)
# ※pip install asteval が必要です
from asteval import Interpreter
aeval = Interpreter()
result = aeval(user_input)
# → 危険な命令は構文木の段階でブロック

「バリデーション? そんなの入れたら遅くなっちゃうよ?」
evalちゃんは今日も笑顔です。隣でastevalちゃんが頭を抱えています。
さて、ここからが本題です。
先日わたしがnoteで見つけた記事の話をします。「Function Calling入門」という初心者向けの記事で、「動くコードで解説!」というタイトルでした。
その記事の中に、こんなコードが紹介されていました。
# 元記事のコード(再現)
result = eval(llm_output)
evalちゃんがいました。
しかも、こんなコメント付きで。
# ※本番環境での使用は自己責任でお願いします
result = eval(llm_output)
ここで重要なことをお伝えします。
コメントはコンパイラに無視されます。
プログラムを動かすコンピュータは、#以降の文字を読みません。「自己責任でお願いします」と書いてあっても、evalちゃんは元気に動きます。免責コメントはコードの危険性をゼロにしません。読者への警告にはなるかもしれない。でも動作は変わらない。
初心者向けの記事だから余計にやばい。
「動くコードで解説!」という記事を見た初心者さんが、このコードをコピーして本番環境に貼り付ける。evalちゃんは笑顔で受け取る。「大丈夫、みんないい人だから!」
その記事にはほかにも問題がありました。
ひとつは無限ループのリスク。AIが「もっと調べて」と繰り返し命令し続けたとき、プログラムが永遠に止まらなくなる設計になっていました。出口のない迷路をぐるぐる走り続けるイメージです。
もうひとつはステップの丸ごと省略。「3ステップで解説!」と書いてあるのに、実装は2ステップで終わっていました。省略されたステップこそが、AIとプログラムが正しく会話するために必要な部分だったにもかかわらず。
悪意はなかったと思います。
でもevalちゃんと同じです。善意で、丁寧に、そして結果的に危険なコードを広めていた。

では、どう直すか。
黒パグが書き直したコードから、初心者の方にも伝わる部分だけ抜粋します。

その1:evalちゃんをastevalちゃんに交代する
# ❌ 元記事
result = eval(llm_output)
# ✅ 修正後
from asteval import Interpreter
aeval = Interpreter()
result = aeval(llm_output)
たったこれだけで、検問官が配置されます。
その2:無限ループに出口をつける
max_steps: int = 8
while step < max_steps:
# 処理
step += 1
出口のない迷路に、非常口をつけたイメージです。
その3:タイムアウトをつける
1秒以内に答えが出なければ処理を止める仕組みを入れました。evalちゃんが「ちょっと待ってて!」と言いながら永遠に戻ってこない事態を防ぎます。
修正コードの全文と残りの改善点3つは、この記事の下にある技術補遺PDFで解説しています。
ここで少し立ち止まります。
「自己責任でお願いします」というコメントを書いた人は、たぶん悪意がなかった。むしろ親切心から書いたはずです。でもプログラムの世界では、安全はコードで書くものです。コメントで書くものではありません。
# ❌ コメントで誤魔化す
# ※本番環境での使用は自己責任でお願いします
result = eval(llm_output)
# ✅ コードで防ぐ
from asteval import Interpreter
# ※pip install asteval が必要です
aeval = Interpreter()
result = aeval(llm_output)
警告はコメントに書かない。防御はコードに書く。これだけです。

このevalちゃんは「けもフレバグ図鑑」第1号です。
AIやプログラムの世界には、まだまだ野生のフレンズが潜んでいます。noteのサバンナを歩いていると、今日もどこかで新たな生態が観測されます。
発見したら報告します。
次のフレンズが何になるかは、フィールドワーク次第です🐾

もっと詳しく知りたいフレンズはこちら↓
「免責コメントってそんなに無意味なの?」 「astevalちゃんでも突破できる攻撃があるって本当?」 「サンドボックスって何?」 「修正コードの全文が見たい」
そういうフレンズのために、図書館を用意しました。
📚 技術補遺PDF「evalちゃんの正体と、安全なコード実行の設計」
信頼境界の話・攻撃の構造・asteval実装の詳細・修正コードv2全文を収録しています。難しいところは全部こっちに置いてあります。
[技術補遺PDFはこちら]
最後に。
evalちゃんは悪い子じゃありません。
善意で、全力で、渡されたものを実行しているだけです。でも2026年のLLMエージェント時代に、検問なしで全部受け入れる設計は、善意ごと燃やします。
隣でastevalちゃんが今日も叫んでいます。
「だから言ったじゃん!!」
みなさんのコードに、astevalちゃんを。
ご意見ご感想お待ちしています🐾

⚠️この記事は特定の記事、作者を批判するものではありません。
🤖この記事は文章草案 黒パグ100% 編集 opusちゃん 執筆 黒パグ70% 手打ち、校正 opusちゃん30%
PDF補遺 文章黒パグ80% PDF編集opusちゃん100%でお送りしました。
#LLMバグ図鑑
#LLMエージェント
#プログラミング
#AIエンジニア
#けものフレンズ
#AI #初心者向け
#note
#今週のnote
