生成AIに書かせたコードのセキュリティ対策:レビューをどう設計するか

株式会社ペンタコン研究所 PentaTrail開発チーム···7分で読める
目次

AIに書かせたコードの安全は、「気をつける」では守れません。

AIに任せるとコードは人間の数倍の速さで増え、増えれば穴も同じ速さで増えます。権限を閉じ忘れたり、秘密をコードに残したまま忘れたり、入力チェックが抜けたり。速さを取った以上、1人の目視ではもう追いつきません。

01 / 守りを「注意力」から「仕組み」へ移し、性質の違う網を 6 枚重ねた

壁を1枚だけ厚くするのではなく、効き方の違う網を何枚も重ねています。外から順に、それぞれ何をして何を防ぐのかがはっきり分かれた作りです。

多層防御の6つの層を外から内へ並べた図。境界、認証の委譲、データの境界、コード規約、CIの門番、二刀流の目の順に重なる

図1:外から内へ重ねた 6 つの層

深掘り:一枚に賭けない理由

完璧な防御はなく、どの層にもすり抜けるものが残ります。だからこそ一枚の壁に賭けず、層を重ねました。一つ抜けても、次で止めるためです。

02 / 境界:コードが 1 行動く前に落とす

いちばん外側はエッジで、アプリに届く前に Bot や不審な自動アクセスをふるい落とします。脆弱性を探して回る無差別スキャンは、こちらのコードが 1 行も動かないうちに大半が消えていきます。

境界で落とす仕組みの図。エッジで無差別スキャンや自動化された大量アクセスをアプリに届く前にふるい落とし、会員登録フォームではTurnstileがBotによる大量アカウント作成やフォームの自動濫用を裏で弾く

図2:アプリに届く前に落とす 2 つの網

深掘り:穴を塞ぐより前に、的を減らす

会員登録フォームには Turnstile を噛ませ、Bot による大量アカウント作成やフォームの自動濫用を裏で弾く形にしました。穴を塞ぐより前に、怪しいものはそもそも入れません。攻撃の的を減らすのが最初の仕事です。

03 / 認証は、自前で作らない

認証まわりはいちばん事故が起きやすい場所なので、中核を自分で実装せず委譲して、自前のコードを最小にしています。認証だけは、AI に一から書かせません。

認証を委譲している3つの内容の図。パスキーは公開鍵暗号で鍵がドメインに縛られフィッシングが構造的に効かない、Googleログインは本人確認を預けて向こう側の保護を借りる、セッションとトークンの検証も委譲して作り込む余地ごと無くす

図3:委譲することで、作り込む余地ごと無くす

深掘り:パスワードが無いと、何が起きなくなるか

パスキーは公開鍵暗号で鍵がドメインに縛られるので、偽サイトへ誘導されてもそこには鍵を渡せません。フィッシングが構造的に効かない仕組みです。そもそもパスワードが無いため、漏洩も使い回し被害も起きません。セッション固定やトークン偽造といった自前実装にありがちなミスも、実装しないぶん起こりません。

04 / データの境界:行ごとに持ち主を縛り、既定で開く権限は閉じる

認証を抜けられても、その先にデータの境界があります。API の一段上で権限チェックを書き忘れても、データベースの層でその行は持ち主にしか返りません。

データの境界を示す図。行レベルセキュリティが一行ごとに持ち主を縛ってテナント越境を防ぎ、強い権限で動く関数は既定で開く権限を明示的に閉じて探索パスを固定し、RLSごと迂回できる管理者権限のキーはフロントエンドに置かない

図4:守りをいちばん深いところに置く

深掘り:新しく作った関数は、初期状態で開いている

やっかいなのは初期状態です。新しく作った関数やテーブルは、データベースが権限をログイン済みユーザー全員へ勝手に配ってしまい、「ログインしていれば誰でも触れる」設定になりがちです。放っておくと、一般ユーザーが本来呼べないはずの強権限の関数を直接たたけてしまいます(権限昇格)。 そこで、既定で開く権限は明示的に閉じ、関数の探索パスを固定し(悪意あるスキーマを差し込んで強権限を乗っ取る攻撃を防ぐため)、最小権限を保ちます。テーブルを作るその瞬間に行レベルセキュリティを有効化する、とも規約で決めています。

顧客向けの口は、お客様が承認した外部ツールから MCP で繋ぐ形にしました。手元に置く資格情報が無いので、鍵の紛失や使い回しという事故がそもそも起こりません。承認はいつでも取り消せて、呼び出しにも上限をかけてあります。

05 / コードそのもの:書く前から安全側に倒す

後から直すのではなく、書く前に決めた規約を毎回 AI に読ませます。気づくのが早いほど、直すのは安く済むからです。

書く前に決めている4つの規約の図。入力はホワイトリストで検証し問い合わせはパラメータ化する、画面に出す値はエスケープする、秘密はコードに書かず鍵の保管庫に置く、ファイルのアップロードは拡張子と中身を二重に確かめる

図5:書く前から安全側へ倒しておく 4 つの規約

深掘り:それぞれ何を防いでいるか

ホワイトリストでの検証とパラメータ化は SQL インジェクションと不正な値の混入を、エスケープはクロスサイトスクリプティングを防ぎます。秘密を鍵の保管庫に置くのは、ソースが万一漏れても鍵までは漏れないようにするためです。アップロードの二重確認が止めるのは、偽装したファイルの混入です。コードを書いている最中にもセキュリティ点検が裏で走り、危ない書き方が入り込もうとした瞬間に止まります。

06 / CI が門番:機械の検査を束で通す

書いたものは必ず CI の門を通ります。人が「たぶん大丈夫」と思っても、機械が赤を出せばそこで止まる作りです。

CIで走る6つの検査の図。秘密情報スキャンは鍵やトークンの誤コミットを止め、権限ゲートは強権限の関数や匿名アクセスの穴を検査し、権限テストは塞いだ穴が再び開く退行を防ぎ、結合テストは認可ロジックの取り違えを防ぎ、型とビルドとlintは規約からの逸脱を止め、依存追加ゲートは供給網攻撃を防ぐ

図6:緑が揃うまでマージできない 6 つの検査

深掘り:見張っているのは、コードだけではない

情報セキュリティの管理体系そのものも CI に組み込んでいます。統制とその証跡を唯一の正として文書で持ち、統制と実装が離れていく「コンプライアンスのドリフト」を機械が見張って止めます。セキュリティの決まりごとを、棚に置く書類ではなく機械が見張る対象にしました。

07 / 最後に、系統の違う目と人を重ねる

権限の閉じ忘れのような穴は、同じ系統の AI どうしだと揃って見落とすことがあります。観点を分けた複数のレビューが全員すり抜けた欠陥を、別系統の AI が拾ったことがありました。

レビューの目を重ねる図。観点を分けた複数のレビューでも同じ系統なら揃って見落とすことがあり、そこへ系統の違うAIを足し、最後は人が確かめる

図7:同じ系統では揃う穴を、系統の差でずらす

深掘り:人手のレビュー中心の従来型と、何が違うのか

完璧な防御が無いのは、人手のレビューを中心に作られた従来のシステムでも同じです。違うのは、守りを人の注意力に置くか、仕組みに置くかです。人手中心のレビューはレビュアの集中力や経験に左右され、量が増えれば取りこぼします。ここまでの層は、疲れず、忘れず、PR のたびに同じ厳しさで回り続けます。

だから、AIで量産したシステムでも、この多層防御を通せば、人手のレビューを中心に作られた従来のシステムと、セキュリティの水準で遜色はありません。 機械の網は、人のように疲れも油断もしないぶん、むらなく守れます。量産の速さと守りの堅さは、両立できます。それが、この一年でたどり着いた手応えでした。

ここまでは自分たちのコードをどう守っているかの話でした。同じ見方を外へ向けて、攻撃者から自分の会社がどう見えているかを継続的に点検する仕組みが PentaTrail / CTEM です。

付録:層ごとの「何をして、何を防ぐか」

表1:6 つの層

層 何をするか 何を防ぐか
境界 エッジで Bot と不審な自動アクセスを落とす 無差別スキャン、自動化された大量アクセス
認証の委譲 中核を自前で実装せず、パスキーと外部ログインに預ける フィッシング、パスワード漏洩、セッション固定、トークン偽造
データの境界 行ごとに持ち主を縛り、既定で開く権限を閉じる テナント越境、権限昇格
コード規約 書く前に決めた規約を毎回読ませる インジェクション、XSS、秘密の混入、偽装ファイル
CI の門番 機械の検査を束で通し、緑が揃うまで止める 退行、認可の取り違え、供給網攻撃、鍵の誤コミット
二刀流の目 系統の違う AI を重ね、最後は人が確かめる 同系統では揃って見落とす欠陥

表2:CI で走る検査

検査 何を防ぐか
秘密情報スキャン 鍵やトークンの誤コミットによる侵入
権限ゲート 強権限の関数や匿名アクセスの穴がマージされること
権限テスト 一度塞いだ穴が、後の変更で再び開く退行
結合テスト 認証・権限を含む振る舞いの取り違え
型・ビルド・lint 規約からの逸脱
依存追加ゲート 公開直後の悪意ある版を自動更新で引き込む事故

表3:書く前に決めている規約

規約 何を防ぐか
入力はホワイトリストで検証し、問い合わせはパラメータ化する SQL インジェクション、不正な値の混入
画面に出す値はエスケープする クロスサイトスクリプティング
秘密はコードに書かず、鍵の保管庫に置く ソースが漏れたときに鍵まで漏れること
アップロードは拡張子と中身を二重に確かめる 偽装したファイルの混入

PentaTrail CTEM/ASMで攻撃面を可視化しませんか?

CTEMフレームワークに基づき、外部攻撃面の発見から脆弱性検証・対応推進までを一気通貫で実現します。

お申し込みはこちら

料金を見る/他サービスとの比較・選び方