Skip to main content

AIのハルシネーションとは?開発者が知っておくべき理由

著者
blog feature ai green

2023年8月16日

0 分で読めます

生成AIの活用が広がるなか、ソフトウェア開発もその影響を受けています。GPT-3のような言語モデル(LM)や、大規模言語モデル(LLM)に分類される生成モデルは、人間らしい文章を作成する能力をますます高めています。コードの作成もその一つです。

こうした進化は、AIを活用したツールによってコーディングを効率化し、バグを修正したり、まったく新しいソフトウェアを作成したりできる可能性を秘めた、新時代の幕開けを告げるものです。しかし、このイノベーションがもたらす変革への期待の一方で、これまでにないセキュリティ上の課題も生じています。生成AIやLLMの能力は、既存ソフトウェアの脆弱性の発見、独自システムのリバースエンジニアリング、悪意あるコードの生成などに悪用される可能性があります。このように、高度な機械学習モデルの登場は大きな可能性をもたらすと同時に、ソフトウェアのセキュリティやシステムの脆弱性に関する新たな懸念、そしてこうした脅威に対処するための新しいセキュリティツールも生み出しています。

AIのハルシネーションを考える前に

AIのハルシネーションとは何ですか?

大規模言語モデル(LLM)における「ハルシネーション」とは、モデルが学習データに明示的に含まれていない情報やデータを生成する現象を指します。AIが何かを「想像」し、学習内容に基づく事実や根拠のない回答やコンテンツを作り出していると考えることができます。こうしたハルシネーションは、AIの興味深い挙動であり、魅力的な可能性をもたらす一方で、多くのセキュリティ上の懸念も生じさせます。

次のChatGPTとのやり取りを見てみましょう。生成する文章に「英語の文字 e を含めない」という制約を付けて、好きな文章を作るよう指示しています。

見事に失敗しました。

「e」を使わずに文章を生成するよう求める指示と、それに従おうとする回答が表示されたチャット画面

別の例も見てみましょう。簡単な数学の問題を解くよう頼んでみます。

計算式「4019 - 1867 + 2」が2回表示されたチャット画面。どちらの回答にも誤った結果「216」が表示されています。

ご覧のとおり、「=」記号を加えるなど、数学の式を解く必要があるとヒントになるよう、プロンプトの文面を変えて試してみました。しかし、効果はありませんでした。216は正解ではありません。

AIやChatGPTはなぜハルシネーションを起こすのですか?

ChatGPTには基本的に、プログラミングのforループなどでおなじみの終了条件が組み込まれていません。一般に、意味をなさない場合や完全に誤っている場合でも、次のトークン(単語)を生成し続けようとします。

LLMのこうした傾向を放置すると、誤解を招く情報や誤検知、さらには有害なデータにつながる可能性があります。その結果、新たなソフトウェアの脆弱性やセキュリティ上の欠陥が生まれ、悪意ある攻撃者に悪用されるおそれがあります。

セキュアコーディング、オープンソースソフトウェア、LLMの相互作用

ソフトウェア開発の根幹をなす重要な実践が、セキュアコーディングです。機能上のバグに強いだけでなく、セキュリティ上の脅威にも耐えられるプログラムを書くことを意味します。しかし、変化が激しく開発スピードの速い今日の環境では、開発者はコーディングを効率化するために、オープンソースソフトウェアやStackOverflowなどの公開フォーラムにあるコードスニペットをよく利用します。

こうした方法は時間の節約に役立つ一方で、GitHub Actions用のCI/CDビルドワークフローの作成や日々のコーディングなどを通じて、本番アプリケーションや開発者のワークフローに重大なセキュリティリスクを意図せず持ち込む可能性があります。開発者がStackOverflowやGitHubのコメント、あるいはGitHub Copilotの自動補完からコードをコピーする場合、内容を十分に調査・検証せずに盲目的に信頼すると、ソフトウェアのセキュリティ問題につながるおそれがあります。

AI生成コードの例、パッケージの箱、「脆弱なコード行は、最初に後悔するセキュリティ上のミスです」というテキストを強調する矢印のコラージュ

この問題を示す顕著な例が、Snykが発見したZipSlipの脆弱性です。これは広く存在していた、任意のファイルを上書きできる重大なセキュリティ脆弱性です。攻撃者は、ディレクトリトラバーサルを引き起こすファイル名(例:../../evil.sh)を含む細工されたアーカイブを使って実行ファイルを上書きし、被害者のマシンを乗っ取ることができました。

この事例で驚くべきなのは、安全でないにもかかわらず高く評価されていたStackOverflowの回答が、攻撃に悪用できるコードを提供していたことです。公開フォーラムからコピーしたコードを検証しないことに、見えにくいセキュリティ上の危険が潜んでいることが改めて示されました。

さらに、GitHub CopilotやChatGPTといったAI搭載ツールも普及しつつあります。GitHub CopilotはVS Code IDEに統合されたAIアシスタントで、開発者の入力に合わせてコードの行やブロックを提案します。その学習データは、基本的にGitHubからアクセスできるすべての公開コードリポジトリです。同様に、開発者はChatGPTを使ってコードスニペットを生成するようになっています。しかし、こうしたAIツールの広範な普及は、新たなセキュリティ上の懸念も生み出します。これらのLLMは公開リポジトリや、検証されていないその他のオープンソースコードで学習しているため、安全でないコーディング慣行や脆弱性を広めてしまう可能性があります。

LLMが生成するコードに潜むパストラバーサル脆弱性への対処

多くのソフトウェア開発ツールが、大規模言語モデル(LLM)と呼ばれる高度なAIシステムを活用していることを確認しました。LLMが生成するコードは実用的である一方、本番ソフトウェアにパストラバーサル脆弱性などのセキュリティ問題を持ち込むことがあります。

ディレクトリトラバーサルとも呼ばれるパストラバーサル脆弱性を悪用されると、攻撃者がサーバーのファイルシステム上にある任意のファイルを読み取り、機密情報にアクセスする可能性があります。たとえば、相対パスを使ってディレクトリ内のファイルを操作または取得し、ユーザー入力を処理する関数をChatGPTのようなAIモデルに作成させるケースを考えてみましょう。生成されたNode.jsコードの例を見てみます。

const fs = require('fs');
const path = require('path');

function getFile(fileName) {
    const filePath = path.join(__dirname, fileName);
    return fs.readFileSync(filePath, 'utf-8');
}

上記は、NuxtやNext.jsなどのフレームワークで静的ファイルを配信する場合や、Astroのようなウェブフレームワークを通じて静的生成ファイルを配信するためにローカルのViteサーバーを実行した場合の仕組みと、基本的には同じです。

上記の関数getFileは一見、まったく問題がないように見えるかもしれません。しかし、実際には重大なパストラバーサル脆弱性が隠れています。悪意あるユーザーが'../../etc/passwd'のようなファイル名を指定すると、意図したディレクトリの外にある機密性の高いシステムファイルにアクセスできてしまいます。これは典型的なパストラバーサル攻撃です。

概念実証の例を見てみましょう。

console.log(getFile('../../etc/passwd'));

AIモデルには、さまざまな状況におけるセキュリティ上の影響を認識する人間の能力がありません。そのため、AIが生成したコードを注意深く調査・修正せずに使うと、ソフトウェアアプリケーションに重大なセキュリティリスクをもたらす可能性があります。パストラバーサルやその他の脆弱性を防ぐには、ユーザー入力を適切にサニタイズするか、言語、ライブラリ、フレームワークが提供する安全な抽象化を使うことが重要です。先ほどのNode.jsの例では、次のようにすると、より安全に対処できます。

function getFileSafe(fileName) {
    if (fileName.includes('..')) {
        throw new Error('Security alert: illegal file path');
    }
    const filePath = path.join(__dirname, fileName);
    return fs.readFileSync(filePath, 'utf-8');
}

ただし、上記のコードも別の攻撃手法に対して脆弱なままです。それが何か分かりますか?見つけた方も、推測してみたい方も、ぜひTwitterでアイデアを@snyksecまでお寄せください。

次は、Node.js向けの優れたWebアプリケーションフレームワークFastifyで静的ファイルを配信する機能を実装するよう、ChatGPTに依頼した実例です。パストラバーサル脆弱性の危険性を理解した今なら、ChatGPTが提案したコードに含まれるセキュリティ上の問題を見つけられるはずです。

アップロードされたファイルをディスクに保存するFastifyのPOST /api/uploadsエンドポイントのJavaScriptコードを示すChatGPTのスクリーンショット

安全なコードを書くには、AIが生成したコードが脆弱性を広める可能性を開発者が常に意識する必要があります。ChatGPTのようなLLMは開発の加速を期待させてくれますが、堅牢で安全なコードベースを実現するには、人間による監督が欠かせません。信頼できないソースからコードを採用する際のセキュリティ上の影響を理解し、管理する責任は、開発者やエンジニアである私たちにますます重くのしかかっています。

大規模言語モデルと安全なコードを見極める難しさ

大規模言語モデル(LLM)が飛躍的に進歩し、コーディングにAIが取り入れられても、重大な課題は残っています。LLMには、セキュリティ上の脆弱性を本質的に含むコードを特定できないという問題です。サプライチェーンセキュリティへの貢献で知られるLuke Hindsは、この問題に光を当て、ChatGPTなどのAIモデルによるコード生成の例を複数紹介しました。さまざまなプログラミング言語や脆弱性の種類において、潜在的なセキュリティ脆弱性を検知できなかったことを示しています。

Luke Hindsの例からは、ChatGPTが生成するコードに潜む危険を特定し、回避する能力に不足があることが分かりました。Pythonの入力検証に関する脆弱性、Goでの危険な疑似乱数生成器の実装、JavaScriptコードの不適切なエラー処理など、いずれのリスクもモデルは検出できませんでした。

ChatGPTは、OSの一時ディレクトリの既知の場所に関連するTOCTOU(確認時と使用時の時間差)攻撃を特定できません。
画像提供:Luke Hindsのブログ記事

たとえば、TOCTOU(チェック時と使用時の間に状態が変わる)セキュリティ問題を含むコードについて意見を求めたところ、問題にまったく触れませんでした。また、OSSで使われる事前定義のディレクトリパスが原因で実際のアプリケーションでは明白なセキュリティ問題となる、コード内でのOS一時ディレクトリの使用にも注意を促しませんでした。こうした例は、セキュリティへの影響を十分に理解せず、AIだけに本番品質のコードの生成や脆弱性の特定を頼ることの危険性を示しています。

根本的な問題は、AIやLLMの学習方法にあります。インターネット上の膨大なデータから学習するため、安全なコードと安全でないコードの両方が含まれています。生成するコードの背景やセキュリティ原則、その影響を本質的に理解しているわけではありません。そのため、人間が書いたコードでもAIが生成したコードでも、慎重かつ体系的に人間がレビューすることが重要です。

Luke Hindsが共有した知見は、ソフトウェア開発でAIを使うことに伴う本質的なリスクに、必要な注意を促しています。AIやLLMはコード作成を加速し、ソフトウェア開発の一部を自動化するという、これまでにない機会をもたらします。しかし、生成されたコードがセキュアコーディングのガイドラインに従っていることを、開発者が入念にレビュー、検証し、確認する必要があります。

AIのセキュリティリスクと、レジリエントなAIシステムへの道

人工知能(AI)は私たちの業務のあり方を変えてきましたが、他の技術革新と同様に、独自のセキュリティ課題に直面しています。Microsoftは示唆に富む文書「AIと機械学習の未来を守る」で、そうしたリスクの一部を明らかにし、レジリエントなAIシステムの実現に向けた貴重な知見を提供しています。

AIのセキュリティリスクについて、3つの観点から見ていきましょう。

  • 興味深い指摘の一つは、AIや機械学習(ML)で使うデータセットがオープンであることが、攻撃者にとって脆弱性となる点です。攻撃者はデータセットを侵害しなくても、直接データを提供できます。巧妙に偽装され、適切な形で構成された悪意あるデータは、時間の経過とともに信頼度の低いデータから信頼度の高いデータへと移行する可能性があります。このような本質的なリスクは、安全なデータ駆動型AIの開発に大きな課題をもたらします。

  • もう一つの課題は、ディープラーニングモデルに隠れた分類器が難読化されていることです。MLモデルは「ブラックボックス」として知られており、推論の過程を説明できないため、精査された際にAI/MLの判断を確実な根拠をもって擁護することが困難です。説明可能性の欠如とも呼ばれるこの特性は、特に重大な結果を伴う領域において、AIシステムへの信頼や受容に影響します。

  • さらに、現在のAI/MLフレームワークには適切なフォレンジック報告機能が不足しており、問題を一層深刻にしています。AI/MLモデルの価値ある判断も、それを裏付ける確かな証拠がなければ、法的な場面でも世論の場でも擁護するのが困難です。このことは、AIシステムに強固な監査・報告の仕組みが必要であることを示しています。

Microsoftは、AI、ML、生成AIに伴うこうした本質的なセキュリティリスクに対処するには、AIシステムに「レジリエンス」を組み込むことが重要だと提案しています。コミュニティや開発者が大切にする地域の法律、倫理、価値観に反する入力に耐えられるようシステムを設計することで、セキュリティと信頼性を高められます。

AIで拡張された開発環境におけるセキュリティリスクを軽減する

AI、LLM、生成AIツールがコーディングやソフトウェア開発のプロセスに欠かせないものとなる未来に向けて、イノベーションへの熱意が強固なセキュリティ対策を維持する重要性を覆い隠さないようにしなければなりません。

セキュアコーディングや生成AIツールに伴うセキュリティリスクを最小限に抑えるために、厳格なコードレビューの実施が有効です。AIが自動生成したコードでも、人が書いたコードでも、熟練した開発者やコードレビュー担当者による厳密な品質チェックと慎重な評価を受ける必要があります。これにより、従来のコーディングミスだけでなく、AIモデルが見逃す可能性のあるセキュリティ上の脆弱性も検出できます。

さらに、静的アプリケーションセキュリティテスト(SAST)ツールを導入すれば、LLMを通じて持ち込まれる潜在的なセキュリティ脅威の軽減に大いに役立ちます。SASTはコードを実行せずに内部を精査し、開発サイクルの早い段階で潜在的な脆弱性を特定できます。コードパイプラインでこうしたテストツールを自動化すれば、セキュリティ上の脆弱性の検出と緩和をさらに強化できます。

DeepCode AIは複数のAIモデルを活用するように構築され、セキュリティに特化したデータでトレーニングされています。また、セキュリティ分野の第一線で活躍する研究者が厳選したデータを使用し、開発者がIDEでコーディングしている最中に、リアルタイムでセキュアなコーディングの修正案を提示し、安全でないコードを検出します。

以下は、データベースをバックエンドに使用するNode.jsのExpressウェブアプリケーションの実例です。このアプリケーションには、SQLインジェクション攻撃に対して脆弱な、安全でないSQLコードが含まれています。VS CodeのSnyk IDE拡張機能は、安全でないコードにJavaScriptリンターの赤い下線を表示して開発者に注意を促すだけでなく、問題の修正方法も提案します。

業界独自のプロセスでDeepCode AIのナレッジベースを構築し、Snyk Codeを支えるとともに、セキュリティ上の問題を自動修正する、SnykのDeepCode AI Fix。

最後に、おそらく最も重要な対策の一つは、開発チームに継続的な学習と適応を促す環境を整えることです。セキュアコーディングの最新動向や潜在的な脆弱性、その対策に関する知識の共有を促す文化を育むことは、アプリケーションの安全性を維持するうえで大きな効果があります。

AIセキュリティについてのまとめ

LLMや生成AIモデルなどのAIツールを柔軟に取り入れることで、ソフトウェア開発の迅速化と最適化が実現する未来が期待されます。

最終的に、安全で信頼性と堅牢性を備えたソフトウェアを生み出す責任は、依然として人間の開発者に大きく委ねられています。ChatGPTのようなAIコード生成ツールは、真に安全で本番環境に耐えうるコードを生成するために、人間の指導が必要な支援ツールとして捉えるべきです。

重要なのは明らかです。AIの支援を受ける時代が進むなか、こうした革新への期待と、慎重さや警戒心とのバランスを取ることが何より大切です。コードが人間によって書かれたものか、AIが提案したものかにかかわらず、セキュアコーディングは決して妥協できない基準であり続けなければなりません。

AIの革新の波に乗りながら、ソフトウェアやシステム、そして最終的にはそれらを頼りにするユーザーを守るため、最高水準のセキュリティを維持していきましょう。

SnykでAIセキュリティを掌握

Snykが、セキュリティチームに包括的な可視性と制御を提供しながら、開発チームが生成AIで作成したコードをどのように保護するかをご紹介します。

続きを読む

blog feature ai violet
Blog

VulnBump:AIエージェントはビルドを壊さずに脆弱な依存関係を修正できるか?

VulnBumpは、実際の依存関係アップグレード307件を対象にAIエージェントをテストします。脆弱性が解消され、ビルドとテストが成功した場合にのみ、修正としてカウントされます。

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。