Skip to main content

AI を使用してコードの脆弱性を自動修正

2024年10月14日

0 分で読めます

Snyk の SecRel 顧客ワークショップのライブラリの中に、Breaking AI というワークショップがあります。このワークショップでは、copilotcodium などの生成 AI アシスタントが開発者がコードの作成をスピードアップするのにいかに役立つかについて説明します。ワークショップには大きなオチがあり、AI アシスタントはコーディングの学習を終えたばかりの新人開発者のようなものであり、やる気はあり、手伝ってくれますが、アシスタントのコードはじっくり確認する必要があります (新人開発者をけなしているわけではありません、必要な貴重な人材です)。ワークショップでは、AI アシスタントを Snyk と組み合わせることでコードを迅速かつ安全に記述する強力な力を手に入れる方法について示します。

有名なシェフの言葉を借りれば、Snyk はその Deep Code AI Fix 機能により、「レベルが 1 つ上がった」と言えるでしょう。Snyk Code はセキュリティ脆弱性が検出されると、常に適切な対策を提供します。さらには、同一の脆弱性があったその他のオープンソースプロジェクトの参照例を 3 件提示し、それらのプロジェクトで問題をどのように修正したかを示します。Snyk のセキュリティチームが慎重に作成したデータのおかげで、生成 AI とシンボリック AI の力を組み合わせたハイブリッド AI モデルと機械学習モデルにより、Snyk では使い慣れた IDE から直接多くの一般的なセキュリティの脆弱性を自動的に修正できるようになりました。

このブログでは、ワークショップで使用している Java のサンプルプロジェクトで Deep Code AI Fix (DCAIF) を最大限に活用する方法について紹介します。ソースコードはこちらから入手できます。注: このプロジェクトは意図的に複数の箇所に脆弱性があり、運用環境での使用には適していません。

スケジューリングアプリで遊ぶ

テクニカルカンファレンスに参加する、またはそこで登壇した経験があれば、最も難しいことの 1 つはスケジュールを作成して提示することであることはご存じだと思います。

リファレンスアプリはひどいものですが (私は良いフロントエンド開発者ではありません)、コードが技術的には動作しながらも、同時にセキュリティに問題があることを示すことができるようにしています。

これは Thymeleaf テンプレートエンジンを使用した Spring Boot アプリです。起動時に、一般的な faker ライブラリを使用して、ランダムに登壇者、トークタイトル、トークの説明のデータを生成します。トークのタイトルと説明はすべて、The Hitchhiker’s Guide to the Galaxy という本のテキストから取られています。注: タイトルと説明は仕事で使用するには安全でないものが含まれている可能性あります。念のためお知らせしておきます。

生成されたイベントの各登壇者には専用のページがあり、登壇者のカンファレンスでの講演リストを確認できます。アプリのこの部分に焦点を当てます。

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

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

注: これとまったく同じにはなりません。登壇者とそのトークはアプリを起動するたびにランダムに生成されるためです。

リンクのいずれかをクリックまたはコピー&ペーストすると、登壇者のページにトークのリストが表示されます。

実際にやってみましょう: 脆弱性を見つけてください

TalkController.java を見てください。ここで登壇者のページをレンダリングしています。脆弱性を見つけられますか?

目視だけでは大変ですね。開発者にはより迅速に安全なコードを記述してもらいたいと思っています。

私は IntelliJ Idea を使用して Java アプリケーションを作成します。さらに Snyk の IDE 拡張機能を使用します。嬉しいことに、一般的なすべての IDE に対して Snyk の IDE 拡張機能が提供されており、さまざまなプログラミング言語をサポートしています。

使ってみたいが、まだ Snyk アカウントをお持ちでない場合は、こちらから無料でアカウントを作成できます。

このアプリにはたくさんの脆弱性があると説明しました。ワークショップで使用するためにそうなっています。特に取り上げたいのが、TalkController.java に含まれる脆弱性です。

  1. クロスサイトスクリプティング (XSS) の脆弱性が見つかったことが示されます。

  2. 同じ脆弱性がある 3 つのオープンソースプロジェクトのうちの 1 つとの差異が示されます。ここに修正方法が示されています (緑の部分)。

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

これは問題を解決するために非常に有用な情報です。ただし、#1 の脆弱性の横の小さいな雷アイコン (⚡️) に注意してください。これは、この脆弱性が自動的に修正できることを示しています。

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

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

こちらが 42 行目について copilot に指示したプロンプトと、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 スキャンを実行すると、脆弱性がなくなったことが示されます。

グッドジョブですね。Snyk は脆弱性を自動的に修正しただけでなく、使用しているフレームワーク、この場合は Spring Boot に合った方法で修正しています。

DCAIF でスローダウンすることはありません

この投稿では、Snyk の Deep Code AI Fix が単なる修正アドバイス以上のものであること、またユーザーに代わって修正を実行してくれることを紹介しました。元のセキュリティ脆弱性が検出されなくなったことからも、修正のメリットを確認することができました。

Snyk では AI アシスタントを愛用していますが、AI アシスタントはセキュリティについてはまだ完璧とは言えまえん。Snyk の調査によれば、世の中に出回っている生成 AI が安全でないコードを生成する確率は、人間とほぼ同じ 40% 前後であることを示しています。これは、Copilot などの純粋な生成 AI ソリューションが主に既存のコードを使ってモデルをトレーニングしているため、納得がいきます。Snyk のハイブリッドアプローチには、シンボリック AI、生成 AI、機械学習、Snyk セキュリティチームが作成したトレーニングが含まれているため、セキュリティファーストのアプローチにより結果が生まれます。

AI によって自動で生成されたコードの保護を始める

無料の Snyk アカウントを作成して、今すぐ AI によって自動で生成されたコードの保護を始めましょう。また、専門家によるデモを予約して、Snyk が開発者セキュリティのユースケースにどのように適用されるのかをご覧ください。

SDLCにおけるAIのベストプラクティス

チートシートをダウンロードして、安全にSDLCでAIを活用するためのベストプラクティスを学びましょう。