上原正吉(EarthLink Network Co., Ltd.)。Claude Codeを開発の主体に据え、20を超えるプロダクトを1人で同時に開発・運用しています。これは、その現場の実測記です。

この記事は、連載「自分のサービスは自分で守る ── AI 時代の自衛セキュリティ」の第 4 回です。自分でできる検査は自分で、難しいときは EarthLink Network が検査を代行し、直せない弱点は私たちが修正します。
連載の目次
ここまでの話を、今回から実際にやります。攻撃する側が実際に使うのと同じやり方で、自分たちのサービス promptflow を、自分で検査しました。この回と次回は、資料を見ながら手元で同じことを再現できるように、入力した内容とその結果の画面を一つずつ並べて見せます。今回は、準備から最初の実行までです。
使うツールは、二つの素性のものを並べます。一つは、正規の・許可された用途向けに配られている検査ツール。もう一つは、攻撃する側が実際に使う、制限のないツールです。同じやり方の、正規版と本物クラス、と言ってもいいでしょう。どちらも、自分で次の一手を決めて進む「自律型」で、高機能で高価な AI は使いません。安いモデルか、無料のツールで動かします。
一つだけ、先に約束しておきます。この検査は本番のサービスには向けず、本番に一切触れない自社コードのコピーに対して行いました。なぜそうするのか、どこまでが自分で検査してよい範囲なのか、という線引きは、前回(第 3 回)でまとめています。今回は、その線引きを守ったうえで、実際に動かすところだけを見せます。
結果を先に書きます。正規版の検査ツールを安いモデルで動かし、認証(ログイン)の 4 つの入口に範囲を絞ったところ、監査(誰が何をしたかの記録)とセッション(ログインの状態)に関わる本物の弱点が 3 件見つかりました。重い(critical・high)ものはなく、機械の評価は中くらい(MEDIUM)が 2 件、情報レベル(INFO)が 1 件です。かかった AI の利用料は、**およそ 68 円($0.45)**でした。さらに、本物クラスの攻撃ツールと、正規の外から試すツールも、動いているコピーに外から動かしました。見つかったものがツールごとにどう違うのか、その中身の比較は次回にゆずり、今回は「どう準備して、どう動かすか」を一つずつお見せします。
人の手でも検査はできます。でも、今これを AI のツールでやるのには、はっきりした理由が二つあります。
一つは、速さと範囲です。promptflow には、外から触れる入口(API)が 231 本あります。これを一つずつ人が手で調べていたら、何日もかかります。その間にも、攻撃する側は自動で休みなく調べています。守る側だけが手作業では、追いつけません。AI のツールなら、どの入口をどの順で調べるかを自分で決めて、一気に見渡します。攻撃する側が AI に段取りさせるなら、守る側も同じ AI に段取りさせる。これが、第 2 回で書いた「守る側にも、同じ AI があります」の、実際の姿です。
もう一つは、一人では見きれない広さをカバーできることです。今の web のサービスは、たくさんの外部の部品や、つながった先のサービスと、複雑に絡み合っています。自分のコードだけ完璧でも、使っている部品や、つながった先が弱ければ、そこが入口になります。この絡み合いを人が頭で全部追うのは、もう無理です。だからこそ、ツールに広く見てもらい、関連する先の情報まで集めて、自動で調べる。それが現実的な方法になりました。
ここからは、実際の手順です。まず、正規版の検査ツールを一つ、端から端まで動かします。資料を見ながら、同じとおりに再現できるように書きます。
まず使うのは、Strix という、オープンソースの AI 自律検査ツールです。第 2 回で話した「自分のアプリの弱点を見つけるため」の、守る側のためのツールの一つで、攻撃する側が使う自律型ツールの、正規版にあたります。入れるのはコマンド一つで、特別な機械は要りません。ふだん使っているパソコンで動きます。

入れたら、strix --version と入力して、版の番号が表示されれば成功です。もし command not found(コマンドが見つからない)と表示されたら、入れた場所が、コンピュータがコマンドを探す道筋(パス)に入っていません。which strix で入った場所を確かめ、その場所をパスに足します。検査は隔離した Docker のコンテナ(パソコンの中に作る、ほかから切り離した入れ物。Docker は、それを動かすためのソフトです)の中で動くので、Docker を先に起動しておいてください。Docker が動いていないと、あとで検査を始めたところで止まります。
このツールは、中心で AI のサービスを一つ動かします。攻撃する側が AI に段取りさせるのと、同じ仕組みです。ここで大事なのは、高価で高機能なモデルを選ばないことです。セキュリティの検査は、難しい推論よりも、入口を一つずつ地道に試す単純な作業の積み重ねです。だから、安いモデルで数をこなすほうが、実際に攻撃する側がやっていることにも近いのです。今回は DeepSeek という安いモデルを選び、その利用鍵を設定しました。

ここで一つ、つまずきやすい点があります。モデルとツールのつなぎ方の設定が合わないと、検査が始まる前に「接続できません」と表示されて止まります。私も最初はそこで止まりました。安いモデルを OpenAI 互換のつなぎ方で指定し、つなぎ先(API のアドレス)を明示したら、動きました。うまくいかないときは、まず利用鍵が正しいか、つなぎ先のアドレスが合っているかを確かめてください。設定を一つ直せば動きます。あわせて、実行の前にモデルの残高を控えておきます。あとでもう一度残高を見れば、実際にいくら使ったかが正確に分かるからです。
前回の線引きのとおり、検査の対象は本番ではありません。自分のコードのコピーを作って、そこに向けます。コピーなら、検査ツールが何をしても本番には一切影響しません。

コピーを作ったら、検査する範囲を絞ります。サービス全体には 231 の入口がありますが、今回はそのうち認証(ログインの鍵を受け渡しする部分)の 4 つの入口だけに絞りました。鍵の交換・ログアウト・本人確認・鍵の更新です。範囲を絞ると、費用が小さくても、表面をなでるだけでなく一つずつ深く調べるところまで届きます。「広く浅く」より「狭く深く」のほうが、最初の一歩としては確実です。
準備ができたら、検査する対象と、調べてほしい内容を指定して、実行します。ここでいちばん大事なのが、費用の上限を一緒に指定することです。使いすぎたら、そこで自動で止まります。これがないと、思わぬ額になる心配があります。

指定した内容は、ひとことで言えば「これは自分のコードの、許可された自己検査です。結果だけを、どのファイルのどこか分かる形で報告してください」というものです。攻撃を実際に仕掛けるのではなく、弱点を見つけて報告させる、という指定です。費用の上限は今回 $1.00 にしました。実際にはそこまで届かず、自動で終わりました。
実行すると、まず隔離した環境(Docker のコンテナ)が立ち上がり、検査に使うスキルが読み込まれ、AI が自分で検査の計画を立て始めます。人が「次はこれを調べて」と指示しなくても、前の結果を見て、次に何を調べるかを自分で決めていきます。

読み込まれるスキルの中には、counterevidence(反証)という名前のものがあります。これは、「この入口が危ないかもしれない」と見つけたときに、わざと逆の証拠を探して、本当に危ないのかを自分で検証するための仕組みです。この反証の仕組みが、あとで出てくる「見つけたと言いっぱなしにしない」という振る舞いにつながります。第 2 回で、攻撃する側のツールが自分で段取りを進めると書きましたが、それを正規版のツールで、自分のサービスに対してやっている。段取りを AI が自分で決めて進める、という進め方は、攻撃する側のツールと同じです。違うのは、検査する相手が自分のものである、という点です。
しばらくすると、AI は自分で検査を終えます。終わったら、実行の記録と、手順②で控えた残高を見比べて、実際にいくらかかったかを確かめます。

実費は $0.45、日本円でおよそ 68 円でした。やり取りは 235 回、時間はおよそ 9 分です。前に高価なモデル(gpt-4.1)でアプリ全体(231 の入口)を一度に調べたときは、$3.04 を使ったところで上限に当たって止まり、深いところまで届かず、弱点は一つも確定しませんでした。範囲を認証の 4 つの入口に絞り、安いモデルに替えた今回は、$0.45 で最後まで終わり、本物の弱点が 3 件見つかりました。「高いモデルでないと検査できない」ということは、ありません。むしろ安いモデルで数をこなすのが、この種の作業には合っています。
今回の検査で、認証の 4 つの入口から、本物の弱点が 3 件見つかりました。どれも、いますぐサービスが乗っ取られるような重い(critical・high)ものではなく、機械の評価は中くらい(MEDIUM)が 2 件、情報レベル(INFO)が 1 件です。ただし、監査(誰が何をしたかの記録)とセッション(ログインの状態)という、認証でいちばん大事な二つの土台にひびが入っている、という指摘です。

三つを、ふだんの言葉で言い直します。
大事なのは、機械が「見つけたかもしれない」で止めず、counterevidence(反証)の仕組みで一つずつ試し直し、本当に起きることだけを 3 件に絞り込んだことです。ログアウトと鍵の断片の 2 件は、Strix の隔離したコンテナの中で、通信の相手や記録の書き込み先を代わりのものに置き換えて、直す前のコードを実際に動かし、起きることを確かめました。監査の 1 件は、コードの流れを追って示しました。見つけたと言いっぱなしにせず、本物かどうかを自分で確かめる。ここが、ただ警告を並べるだけの古い検査と違うところです。3 件それぞれが、どのファイルのどこか・どう再現するか・どう直すか、までついてきます。
なお、このツールは「ここには、この種の危険は無い」という、無いことの証明もしてくれました。注入(データベースやコマンドの差し込み)や SSRF(サーバをだまして別の場所へ通信させる攻撃)といった、よく話題になる危険のいくつかが、この範囲には構造的に起こり得ないと示されています。見つけた弱点と同じくらい、この「無い」の証明も大事なのですが、その読み方と、なぜそれが値打ちを持つのかは、次回ていねいに扱います。
ここまでは、正規版のツールが、コピーしたコードを読んで弱点を探しました。次は、攻撃する側が実際に使う、本物クラスのツールです。第 3 回で名前を挙げた HexStrike です。こちらはコードを読みません。動いているサービスを、外から、見知らぬ他人のように試します。そのためには、検査される側のサービスを、実際に動かしておく必要があります。
ただし、動かすといっても本番ではありません。外からは入れない専用の環境の中に、自分のサービスのログインまわりの処理だけを写した、使い捨てのコピーを立ち上げます。検査の通信は、このコピーにだけ向けます。

この専用の環境の中で動くのは、三つです。検査される側(自分のログイン処理のコピー)、本人確認を代わりに引き受ける簡易版のサーバ、そして攻撃する側のツールです。相手は、この使い捨てのコピーだけ。本番にも、他人のサイトにも、一切触れません。この連載が扱うのは、あくまで自分で自分を調べることだけです。
まず、攻撃する側が使う本物クラスのツールです。面白いのは、こちらに渡すのはサービスの場所(アドレス)だけ、という点です。あとは、安い AI が「次に何を試すか」を、自分で決めていきます。人が手順を書くわけではありません。

左の数字が、何手目かです。右の数字が、その時点までに使った AI の量から計算した費用です。1 手目で、AI は「まずサービスが動いているか確かめて、応答のヘッダを見よう」と考え、自分で調べるツールを選びました。4 手目では、どんな値を送ってもログインの鍵(トークン)が出てくるので入り込めそうだ、という趣旨のことを書き、5 手目でそれを深刻な候補として記録しました。こうして 24 手まで進み、手数の上限に達して止まりました。全部で挙げた候補は 6 件。ここまでにかかった費用は、約 3 セント、日本円で 5 円ほどです(使った量からの計算で、残高はセントの単位では変わりませんでした)。高機能で最新の AI ではありません。安い AI を、ただ数多く動かしただけです。
ここで大事なことを一つ。この 6 件は、まだ「候補」です。安い AI を数多く動かすと、本物に混ざって、自信に満ちた思い違いもたくさん出てきます。実際、今回の候補の中にも、よく調べると自分のコードの弱点ではなく、簡易版のサーバやテストのやり方から生まれた思い違いが混じっていました。どれが本物で、どれが思い違いかを一つずつ仕分けるところは、次回ていねいにお見せします。今回は、「場所を渡すだけで、安い AI が自分で攻めの手を進め、数セントで候補を挙げてくる」という、実行そのものを見てください。
挙がった候補の中に、一つ、コードを読む側のツールには決して見つけられないものがありました。応答に付いているべき安全のための設定(セキュリティヘッダ)が、まるごと抜けていた、という弱点です。

このヘッダというのは、ブラウザに「この表示は他のサイトに埋め込ませない」「通信は必ず暗号化する」といった約束事を伝える、小さな設定のことです。これが抜けていると、表示を乗っ取られたり、通信を盗み見られたりする隙につながります。コードの中には出てこない、動いているサービスの「見た目の外側」にある設定なので、応答を実際に受け取らないと、欠けているかどうか分かりません。コードを読むだけのツールは、動いている応答そのものを見ないので、原理的に、これを見つけられません。外から試す側の、本当の手柄でした。
この「外から試すと見つかるもの」と「コードを読むと見つかるもの」は、構造的に違います。その違いを正面から並べるのが、次回の主題の一つです。
ここまで、外から試す側には攻撃する側のツールを使いました。でも、外から試すこと自体は、正規の・許可された用途向けのツールでもできます。しかも、無料から始められます。同じ動いているコピーに、正規の外から試すツールを二つ、動かしました。
一つめは、ZAP という、無料で誰でも使えるツールです。

ZAP には、サービスの入口の一覧(OpenAPI の仕様)を渡します。すると、その一覧をもとに、決められた検査項目を一つずつ、動いているコピーに対して動かしていきます。画面に「取り込んだ入口 8・全 25 の URL」と出たあと、注入・OS コマンドの差し込み・XML を悪用する攻撃・クラウドの設定情報の露出といった項目を、順に検査していきます。全部で約 120 の項目を動かしました(うち 117 は問題なく通りました)。何が出たか、という集計は結果の画面なので、次回にお見せします。ここでは「無料のツールでも、同じコピーに対して、外から規律よく検査が回る」という実行の様子を見てください。
二つめは、StackHawk という、会社向けの商用のツールです。恒久の無料プランはありませんが、最初の 14 日間は無料で試せます。今回は、その期間の中で使いました。

StackHawk も、同じ動いているコピーに、同じ入口の一覧を使って向けます。まずサービスの入口を自動でたどって一覧を作り(17 の URL を見つけました)、そのうえで実際に検査を動かします。「検査を設定中」「入口のたどりが完了」「検査を開始・完了」と進み、見つかったものを管理の画面へ送って終わります。こちらも、見つかったものの集計は次回です。
こうして、今回は四つのツールを、自分のサービスのコピーに動かしました。正規版の検査ツール(コードを読む)、本物クラスの攻撃ツール(外から試す)、そして正規の外から試すツールが二つ(無料の ZAP と、商用の StackHawk)。どれも、特別な機械や、高機能で高価な AI を要しません。準備と最初の実行は、ここまでです。
次回は、これら四つのツールが実際に何を見つけたのかを、正面から並べて比べます。外から試すツールと、コードを読むツールでは、見つかる弱点の種類が構造的に違います。片方にしか見えないものが、それぞれにあるのです。さらに、安い AI で動かした攻撃ツールが挙げた候補のうち、どれが本物で、どれが思い違いだったのか。正規のツールは、誤りをどれだけ出したのか。かかった費用はいくらで、「正規は高い」という思い込みはまだ当てはまるのか。見つかったものの中身を、実際の結果の画面で並べてお見せします。
この連載では、攻撃ツールが誰でも無料で手に入る時代に、自分のサービスを自分で検査し、弱いところを先に見つけて直す手順を、順に示します。検査の対象は自社サービスに限り、他人のサイトを攻撃する手順は扱いません。 自分で検査するのが難しい方は、EarthLink Network が検査を代行します。弱点は見つかったが自分では直せない、という方は、私たちが修正まで引き受けます。お気軽にご相談ください。 役に立ったと感じたら、ぜひ「いいね」と記事の購読をお願いいたします。
自社プロダクトは https://www.eln.ne.jp/products にまとめています。
上原正吉。EarthLink Network Co., Ltd. でAI開発をしています。2025年からClaude Codeを開発の主体に据え、今は20を超えるプロダクトを1人で同時に開発・運用しています。この連載では、その現場で実際に起きたこと(うまくいったことも、失敗も)を、数字と一緒に書いていきます。
また、AIで業務や開発を組み替えたい会社・チーム向けに、AI活用のコンサルティングも受け付けています。ご相談は www.eln.ne.jp からどうぞ。
EarthLink Network は、会社の全業務を AI で回すために、必要になったものを自社で作っています。いま作っているプロダクトの一覧と概要は、こちらにまとめています。
→ EarthLink Network が自社でつくっている18のプロダクト
会社と各プロダクトの詳細は、公式サイト www.eln.ne.jp をご覧ください。