Skip to main content

AIでコードの脆弱性を自動修正

feature ai ide dark

2024年10月14日

0 分で読めます

SnykのSecRel顧客向けワークショップの中に、「Breaking AI」というワークショップがあります。copilotやcodiumのような生成AIアシスタントが、開発者のコーディングをどれだけ速くできるかを取り上げています。このワークショップの大きな結論は、AIアシスタントはコーディングブートキャンプを卒業したばかりのジュニア開発者のような存在だということです。意欲的で頼りになりますが、コードは必ず確認したいものです(ジュニア開発者をけなしているわけではありません。彼らは必要不可欠で、素晴らしい存在です!)。ワークショップでは、AIアシスタントとSnykを組み合わせれば、コードを迅速かつ安全に書けるという強みを得られることを紹介しています。

有名シェフの言葉を借りれば、SnykはDeep Code AI Fix機能で「さらに一段階上へ」と進化しました。Snyk Codeはこれまでも、セキュリティ脆弱性を検出すると適切な修正方法を提案してきました。同じ脆弱性を持つ他のオープンソースプロジェクトの参考例を3つ提示し、それらのプロジェクトでどのように修正したかを確認することもできました。今回、Snykのセキュリティリサーチチームが厳選したデータと、生成AIとシンボリックAIの力を組み合わせたハイブリッドAIモデル、さらに機械学習モデルを活用することで、お気に入りのIDE上で多くの一般的なセキュリティ脆弱性を自動修正できるようになりました。

この記事では、ワークショップで使用しているJavaのサンプルプロジェクトを使って、Deep Code AI Fix(DCAIF)を最大限に活用する方法をご紹介します。ソースコードはこちらにあります。注:このプロジェクトには意図的に複数の脆弱性が含まれており、本番環境での使用には適していません。

カンファレンスのスケジュール管理アプリを使ってみよう

技術カンファレンスに参加したり、登壇したりしたことがあれば、スケジュールの作成と発表が特に難しいことの一つだとご存じでしょう。

サンプルアプリはそのひどい例ですが(私はフロントエンド開発がまったく得意ではありません!)、コードが正しく動作しながら、同時にセキュリティ上の問題を抱えることもあると示すのに役立ちます。

これはSpring Bootアプリで、Thymeleafテンプレートエンジンを使用しています。起動時に、人気のfakerライブラリを使って、登壇者、講演タイトル、講演の説明をランダムに生成します。講演タイトルと説明にはすべて、『銀河ヒッチハイク・ガイド』の本文が使われています。注:タイトルや説明のすべてが職場で安心して読める内容とは限りません。ご注意ください!

イベントで生成された各登壇者には専用ページもあり、カンファレンスでの講演一覧を確認できます。今回はアプリのこの部分に注目します。

アプリをコンパイルして実行するには、次のコマンドを実行します。

mvn clean install
mvn spring-boot:run

アプリを実行すると、通常のSpring Bootのバナーやその他の出力に加えて、次のような表示が確認できます。

Access talks for heath.davis at: http://localhost:8081/talks?username=heath.davis
Access talks for russell.bernier at: http://localhost:8081/talks?username=russell.bernier
Access talks for kenyetta.jones at: http://localhost:8081/talks?username=kenyetta.jones
Access talks for howard.bailey at: http://localhost:8081/talks?username=howard.bailey
Access talks for buddy.jast at: http://localhost:8081/talks?username=buddy.jast
Access talks for jeanice.kertzmann at: http://localhost:8081/talks?username=jeanice.kertzmann
Access talks for deborah.hamill at: http://localhost:8081/talks?username=deborah.hamill
Access talks for horacio.renner at: http://localhost:8081/talks?username=horacio.renner
Access talks for winfred.schuster at: http://localhost:8081/talks?username=winfred.schuster
Access talks for tommie.hane at: http://localhost:8081/talks?username=tommie.hane
Access talks for micah at: http://localhost:8081/talks?username=micah

注:登壇者と講演はアプリの起動ごとにランダムに生成されるため、まったく同じ表示にはなりません。

リンクをクリックするか、コピーして貼り付けると、講演一覧が載った登壇者ページが表示されます。

講演者名、タイトル、説明、開始日時と終了日時が記載された、検索可能な講演一覧を表示するJavaカンファレンスのウェブページ。

やってみよう:脆弱性を見つける

TalkController.javaを見てください。登壇者のページはこのコードで表示されます。脆弱性を見つけられますか?

目視に頼らなくても済むようにしたいものです。開発者には、スピードを保ちながら安全なコードを書いてほしいのです。

Javaアプリケーションの開発にはIntelliJ Ideaを使っています。SnykのIDE拡張機能も利用しています。うれしいことに、幅広いプログラミング言語に対応した、主要なIDE向けのSnyk IDE拡張機能が用意されています。

一緒に試してみたいけれどSnykアカウントをお持ちでない方は、こちらから無料で作成できます。

このアプリに脆弱性がたくさん含まれているとお伝えしましたか?ワークショップで使っているためです。今回注目するのは、TalkController.javaにある脆弱性です。

TalkController.javaでハイライト表示されたクロスサイトスクリプティングの脆弱性と、Snykの検出結果およびHTMLエスケープによる修正の比較を示すIDE
  1. クロスサイトスクリプティング(XSS)の脆弱性が検出されたことを示しています

  2. 同じ脆弱性がある3つのオープンソースプロジェクトのうち、1つの差分を表示しています。緑色の部分が修正方法です。

  3. 赤い波線は、コード内の脆弱性の位置を示しています。

これらは問題の解決にとても役立つ情報です。ただし、#1の脆弱性の左側にある小さな稲妻アイコン(⚡️)に注目してください。この脆弱性を自動修正できることを示しています。

赤い波線にマウスカーソルを合わせると、この問題を修正するオプションが表示されます。

クロスサイトスクリプティングの脆弱性アラートと、サニタイズされていないHTTPパラメーター入力に対する修正案を表示するコードエディター。

Deep Code AI Fixの結果を見る前に、copilotがどのように対応するか見てみましょう。

42行目でcopilotに入力したプロンプトと、挿入されたコードはこちらです。

// guard against XSS
username = username.replaceAll("<", "&lt;").replaceAll(">", "&gt;");

この方法で単純な攻撃には対処できるかもしれませんが、あらゆる種類のXSS攻撃にも有効でしょうか?私には確信が持てません。実際、Snykのスキャンを再実行しても、XSSの脆弱性は残ったままでした。

では、Snykの修正を見てみましょう。

String usernameStr = "<h1>" + HtmlUtils.htmlEscape(username) + "'s talks<h1>";

これはいいですね。Spring Bootに組み込まれたライブラリ、HtmlUtilsを使った、慣用的で期待どおりのアプローチです。入力値のusernameが適切にサニタイズされると確信できます。Snykで再スキャンすると、脆弱性が解消されていることが確認できます。

クロスサイトスクリプティング(XSS)の問題を修正したユーザーを祝福するSnykの通知。評価用の「いいね」と「よくないね」の選択肢付き

まさに文句なしです!Snykの自動修正は脆弱性を解消しただけでなく、今回の場合はSpring Bootという、使用中のフレームワークに合った方法で修正しました。

DCAIFで開発のスピードを落とさない

この記事では、SnykのDeep Code AI Fixが修正方法を提案するだけでなく、代わりに実際の修正まで行えることをご紹介しました。修正後に元のセキュリティ脆弱性が解消されていることを確認すれば、その効果も確かめられます。

SnykはAIアシスタントを高く評価していますが、セキュリティの面ではあまり得意ではありません。私たちの調査によると、現在の生成AIは人間とほぼ同じ割合、約40%で安全でないコードを生成します。Copilotのような純粋な生成AIソリューションが、主に既存のコードを使ってモデルを学習させていることを考えれば、納得できます。シンボリックAI、生成AI、機械学習、そしてセキュリティチームが厳選した学習データを組み合わせたSnykのハイブリッドアプローチは、セキュリティを最優先する結果をもたらします。

AIが生成したコードのセキュリティ対策を始めましょう

無料のSnykアカウントを作成して、AIが生成したコードのセキュリティ対策を数分で始めましょう。または、専門家によるデモを予約して、Snykが開発者セキュリティのニーズにどう応えられるかをご確認ください。