AIが勝手にコードを書いてくれることは、企業では大きく推進しつつありますが、まだまだ個人での活用の方が頻繁といえます。とはいえ、いずれは企業でもどこでも、AI駆動開発は浸透していくでしょう。
そんな中、世間ではAIによる分析で、多くのセキュリティリスクが発見されています。そのため、継続的に開発を進めていく上で、それらのリスクを理解していく必要があるのです。
今回は、AI駆動開発によって起きる問題と何が不足するのかを考えていきましょう。
- AI駆動開発が見えなくするもの
- 認知反射テスト(CRT)
- 基本知識をあらためて押さえる
私たちがAIとうまく付き合っていく上で、必要なこと、不完全なAIと不完全な人間が、できるだけ完全なシステムを作っていく上で、必要なことを取り上げていきます。
コードを書かなくなるため、知らないことが増える
プログラミングの基本も知らない新人エンジニアに、SQLを書いてもらい、データをとってくる簡単な実装をさせてみましょう。Javaでの記述で、ユーザー名と合致するようなデータを取ってくるように、という指示だけ出してみます。
フレームワークなどで吸収されたり、基本的な実装の中に含まれていることかも知れませんが、この記事内では、それは横に置いておきましょう。
すると、下記のようなプログラムを書いてくることがあります。
String sql = "SELECT * FROM users WHERE name = '" + userName + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
当然、この書き方には問題があるため、下記のような記述をされると、容易に問題を起こすことができます。
' OR '1'='1
よく見るSQLインジェクションですね。いまの時代「こんなことはないよ」という人もいるかと思いますが、そんなことはありません。当然起こり得るリスクですし、今も一般的な攻撃です。
それを防ぐために、プレースホルダを利用して、信頼できる入力だけを受け付けるように記述します。
String sql = "SELECT * FROM users WHERE name = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, userName);
ResultSet rs = stmt.executeQuery();
これは経験で埋めることができますし、当然ベテランが新人のコードをレビューすることで見つけられます。そこでAI駆動開発における問題が露呈します。
- 新人は、この問題に気づかず、ソースコードの指摘ができない
差はあれど、多くのAI駆動開発では、この程度の内容はフォローできるでしょう。(のちの記事で検証)
問題は、抜けているときに人が気づけるか?です。そのために、テスト項目がありますが、それらもAI任せになるのですから、もしかすると抜けてしまうかも知れません。
私たちはこれらの「知らないこと」を、どう解決していくのかを、今後のために考えねばならないのです。
認知反射テストから、認識の齟齬を知る
認知反射テストというものをご存知でしょうか? 「知っているつもり」になっている状態を判断する、3つの質問がよく挙げられています。
5台の機械で5つの製品を作るのに5分かかります。
では、100台の機械で100個の製品を作るのに何分かかるでしょうか?
バットとボールは合わせて110円です。
バットはボールより100円高いです。では、ボールはいくらでしょう?
湖にスイレンの葉が浮かんでいます。葉の面積は毎日2倍になります。湖全体が葉で覆われるのに48日かかるとすると、湖の半分が覆われるのは何日目でしょうか?
正解については解いた後に調べてみてください。これは直感で答えを出すのか、しっかり内省して熟慮した上で答えを出すのかを調べる指標になります。
この問題では、直感的に納得できる答えに辿り着いた人は、フェイクニュースに騙されやすい、あるいは自分の知識と合っている、似通っているから正解である、という「確証バイアス」に陥りやすくなります。
AI駆動開発をしていると、動いたら「よし、問題ない」と考えるかも知れません。立ち止まって「ここは間違っているぞ?」となることが減るでしょう。それは知識やAIへの過信が起こり、内省力が落ちている証拠です。
5台の機械で5つの製品を作るのに5分かかります。
では、100台の機械で100個の製品を作るのに何分かかるでしょうか?
ところで、この問題を見直すと、さらに重要な気づきも得られます。それは条件を指定する、ということです。可能性を膨らませると、5台の機械が5つの製品を、一緒に作るのかも知れません。想像の通り、5台の機械が並んでおり、1つずつ製品を作るのかも知れません。
それらの条件を決定することは、今後の開発において、AIに正しい要求を送るための1つの指標となるでしょう。直感的だから間違っているというわけではなく、直感で出た違和感をそのままにしないことが大切なのです。
セキュリティの基本的知識を押さえるためには?
先ほどのSQLインジェクションの例を見ると、新人教育では、網羅的にOWASPのセキュリティの内容を覚えておけば問題ないじゃないか、となるかも知れません。ですが、ただ覚えることで解決できるのであれば、AIを活用すれば良いでしょう。
新人やこれからAI駆動開発を進める人であるならば、問題が起こり得る境界を知っておかねばなりません。下記のこれらの入力を常に懐疑的に見ることが必要です。
- 入力
- 権限
- データ
- 外部通信
もっとありますが、基本はこれらの「境界」を理解することで、個別の脆弱性が繋がって見えてきます。SQLインジェクションも本質的には、「外部入力を信用した」問題だからです。
もちろん、OWASP トップ10を覚えておくのは効果があります。なにも知らないのは、一切の疑問を持たないということです。それは最も危険な教育・理解であり、「直感」に頼った開発と言えるでしょう。
まず今後問題になる、セキュリティを強化しつつ、開発をするのであれば、OWASPを理解しながら、従来のコードをAIに評価させ、その修正に疑問を持つことでしょう。
これからのセキュリティ対策をAIと学ぶには
AIと共にセキュリティ対策を学ぶために、まずは下記の項目を理解していくことが良いでしょう。これらについて、どういった点を気をつければ良いかは、AIに説明をしてもらい、その知識を自分で補填することが重要です。
- 入力 :ユーザー入力
- 認証 :本人確認
- 認可 :権限制御
- データ :保存情報
- 通信 :API/ネットワーク
- secrets : APIキー等
- ログ :記録/監査
- エラー処理 : 失敗時
- 依存関係 :OSS/ライブラリ
- インフラ :サーバ/K8s
- CI/CD :デプロイ経路
- AI利用 :LLM/Agent
- 運用 :監視/インシデント
- 人 :教育/権限管理
これらを理解すれば網羅できる、ではなく、「常に懐疑的に見るべき項目である」ということです。これらはあくまで境界線であり、押さえておくべき大項目です。各個別の内容と結びつけることが、これまで多くのエンジニアが実践してきた多くの知識の集合へ繋がるでしょう。
今後の記事では、この内容を深堀りしつつ、コードで生成されたものを見比べていく、ということを行なっていきたいと考えています。
実装からレビューまで、ガバナンスを効かせるIBM Bob
セキュリティ対策も重要ですが、切り離せないのは、ガバナンスです。誰が許可を出すのか、実装時に足りない項目を見つけたらどうするのか? IBM Bobには承認によって、ガバナンスを担保します。
人間が判断する。最終的に許可をするのは誰なのかを明確にしています。
IBM Bobについては、下記リンクから参照してください。
参照:IBM Bob