Skip to main content

ソフトウェア開発とサイバーセキュリティにAIを活用する方法

blog feature ai pink

2023年8月30日

0 分で読めます

テクノロジーが驚異的な速さで進化する様子を目の当たりにしてきました。そしてAIは、革新的な力であると同時に、魅力的な謎としても登場しました。ツールキットを広げたい経験豊富な開発者も、AIの世界をもっと理解したいセキュリティ愛好家も、この急速に変化する分野の謎を解き明かす旅は、刺激的であると同時に圧倒されることもあります。

このブログ記事は、AIという迷宮を進むための出発点となる道しるべです。開発者にもセキュリティに関心のある方にも、基本概念を理解するだけでなく、有意義な対話を促し、さらに深く探求する道筋を描くためのツールを提供します。まずは全体像から入り、注目すべきAIの領域を掘り下げ、用語を解説し、さらに調査する価値のあるテーマをご紹介します。

開発におけるAIのカテゴリー

多くの人とAIについて話す中で、AIの機能やテクノロジーを整理するには、次の3つのカテゴリーに分けるとわかりやすいことがわかりました。

  1. AI支援開発 - 生成AIを活用して、コードの作成、レビュー、ドキュメント化を支援する開発。

  2. AI支援アプリケーション - チャットボットなど、アプリケーションに追加されるAI機能。

  3. AI支援ツール - AIを組み込むことで、ツール自体とそのツールを利用するプロセスの効率を高めるもの。

この記事ではAI支援開発に焦点を当てます。他のカテゴリーについても今後の記事で取り上げるので、ぜひご期待ください。

知っておきたいその他の用語

さらにいくつかの用語を定義しておきましょう。

AIの基本概念

  • 人工知能(AI)- 機械によって人間の知能プロセスをシミュレーションする技術。経験から学び、新しい情報に適応し、通常は人間の知能を必要とするタスクを実行できます。

  • 自然言語処理(NLP)- コンピューターが人間の言語を理解、解釈、生成できるようにすることを目的とするAIの分野。

  • 機械学習(ML)- 明示的にプログラムされていなくても、データを学習することで特定のタスクの性能を向上させるAIの一分野。

  • ニューラルネットワーク - 人間の脳の構造や働きに着想を得た計算モデル。データ内のパターンや関係性を学習できます。

言語とテキストの理解:

  • LLM(大規模言語モデル)- 膨大なテキストデータで学習された人工ニューラルネットワークの一種。人間のような文章を生成し、ある程度言語を理解できます。

  • 生成事前学習済みトランスフォーマー(GPT)- 大量の言語データを使った学習に基づき、人間のような自然な文章を生成する高度なニューラルネットワークアーキテクチャ。

  • チャットボット - 自然言語処理を活用し、ユーザーとの会話を自動化するAI搭載ソフトウェア。テキストや音声の入力を理解して応答します。

AI支援開発

この記事では、AI支援開発を取り上げます。AIによってコードの作成やパッケージ化の生産性と効率がどのように高まるかを見ていきます。まずコードの作成から始め、続いてテスト、レビュー、ドキュメント化について説明します。

コードの作成

開発時にAIツールを使う方法として、最もわかりやすく、よく話題に上るのがコード提案です。たとえばChatGPTのように、具体的なリクエストに応じてコード例を提示するツールがあります。会話形式のテキストで、特定のタスクを実行するコードを依頼できます。たとえば、次のように入力します。

ZipFileを展開先ディレクトリに展開するJavaメソッドの依頼と、その導入的な回答が表示されたChatGPTの会話。

生成されたコードを見てみましょう。

public class ZipExtractor {

    public static void extract(ZipFile zip, String dest) throws I0Exception
        File dir = new File(dest);
        if (!dir.exists ()) {
            dir.mkdirs ();
        }

        Enumeration<? extends ZipEntry> entries = zip.entries();

        while (entries.hasMoreElements ()) {
            ZipEntry entry = entries. nextElement();
            File destFile = new File(dir, entry. getName());

            if (entry.isDirectory()) {
                destFile.mkdirs ();
            } else {
                destFile.getParentFile().mkdirs();

                try (InputStream in = zip.getInputStream (entry);
                    OutputStream out = new FileOutputStream(destFile)) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = in. read (buffer)) > 0) {
                        out. write (buffer, O, len);
                    }
                }
            }
        }
    }

GitHub Copilot、Amazon CodeWhisperer、Tabnineなどのツールも、同様の機能を利用中のIDE内で直接提供します。メソッドの定義やコードコメントなどを記述していると、IDEプラグインがコードを提案し、採用するかどうかを選べます。

先にお伝えしておくと、上で生成されたコードには、重大度が「Critical」の脆弱性が含まれています。そうです。LLMは脆弱性だらけのコミュニティコードから学習するため、提案されるコードにも脆弱性が含まれることがあります。生成したコードも自分で書いたコードも安全であることを確認するため、通常のツールを使ったテストを継続することが不可欠です。もう一度コードを見て、脆弱性を見つけられるか試してみてください。次のセクションコードのテストでは、脆弱性の詳細と修正方法を説明します。

ほかにも注目のツールとしてAI Queryがあります。自然言語の入力からSQLクエリを生成するAIツールです。セキュリティ上の理由からLLMとデータを切り離したい場合に特に便利です。生成されたクエリにリスクのある処理が含まれていないか、またエンドユーザーの権限で実行できる妥当なクエリかどうかを検証できます。

コードのテスト

脆弱性を見つけてここに来ましたか?それとも、答えを確認するために最初からここを読んでいますか?どちらにしても、少し絞り込んでみましょう :) この脆弱性はZip Slipの一例です。ディレクトリトラバーサルと任意ファイルの上書きを組み合わせたもので、任意のコード実行につながる可能性もあります。脆弱性の原因となるのは次の行です。

File destFile = new File(dir, entry.getName());

まず危険なアーカイブの内容を見てみましょう。これを見れば、上記のコードに脆弱性がある理由がわかるはずです。次のファイルをZIPアーカイブに追加することは、ZIPファイル形式の仕様上、完全に正当な操作です。

5 Fri Aug 18  11:04:29 BST 2023 good.sh 20 Fri Aug 18 11:04:42 BST 2023 ../../../../../../../../tmp/evil.sh

お気づきかもしれませんが、このZIP内のファイル名を保存先のディレクトリに連結すると、ファイルは保存先ではなくシステムの一時ディレクトリにコピーされる可能性があります。これは非常に危険な攻撃経路ですが、コード生成ツールが出力するコードにはよく見られます。

修正するには、連結後に正規化されたファイル名を取得し、それが次のように対象ディレクトリ内にあることを検証します。

File destFile = new File(dir, entry.getName());
    String canonicalDestinationFile =  destinationfile.getCanonicalPath();
    if (!canonicalDestinationFile.startsWith(canonicalDestinationDirPath + File.separator)) { 
        throw new  ArchiverException("Entry is outside of the target dir: " + e.getName()); 
   }

このファイルを、Snykをインストール済みのIntelliJブラウザーに取り込みます。Snykはソースコードをスキャンし、シンボリックAI機能を使ってアプリケーション内のデータフローとコードフローを理解します。以下のスクリーンショットのとおり、新しいコード内の問題(1)を検出し、問題の詳しい説明(2)と、先ほど紹介したものと同様の修正例(3)も提示しています。

IntelliJ IDEAにJavaコードと、重大度が中のパストラバーサル脆弱性を示すSnykの検出結果が表示されています。

Capture the Flagを始めよう

オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。

シンボリックAIについて触れましたが、これはSnykが使用するAIの種類の1つです。ほかにもさまざまな種類のAIがあり、目標に応じてそれぞれにメリットとデメリットがあります。詳しくは、さまざまなAIモデルの活用ガイドをご覧ください。ChatGPTによって広く知られるようになったAIには、次のものが使われています。

  • 機械学習AI - 明示的にプログラムされていなくても、特定のタスクにおける性能を学習によって向上させるAIのアプローチ。教師あり学習、教師なし学習、強化学習などのサブタイプがあります。

  • ニューラルネットワークAI - 機械学習の一分野。人間の脳に着想を得た人工ニューラルネットワークを使って、データ内のパターン、特徴、関係性を認識します。

  • シンボリックAI(記号推論)- 記号、ルール、論理を使って知識を表現し、タスクを実行するAIの一種。人間が読める表現や形式的な推論を用いることが多くあります。

  • 進化型AI(遺伝的アルゴリズム)- 自然選択のプロセスを模倣して問題の解決策を進化・最適化するAIのアプローチ。最適化や設計のタスクでよく使われます。

  • エキスパートシステムAI - 事実とルールをまとめた知識ベースを使い、特定分野における人間の専門知識を模倣して、判断や提案を行うAIの一種。

もう1つ注目したいツールがCodiumです。AIを活用してコードを分析し、その動作を説明したり、テスト計画を作成したりできます。テストを生成して、ユニットテストスイートにコピーして使うこともできます。

コードのレビュー

プルリクエストなど、すでに書かれたコードを確認するなら、What the Diffを試してみてください。Gitベースの便利なツールで、PRの変更内容を要約し、PRの概要文の作成を支援するほか、PR内のコードのリファクタリングにも役立ちます。

コードの作成、テスト、レビューと、さまざまな内容を取り上げてきました。さっそく始めてみませんか?

  1. コード変更による既存機能のデグレードや、セキュリティ上の問題の混入がないことを確認しましょう。上記のようなセキュリティ上の問題から、品質上の問題まで、さまざまなリスクがあります。

  2. レビューやSDLCの各段階で、これまでどおりツールを活用してください。生成AIはこうしたツールに取って代わるものではなく、むしろ一層活用する必要があります。同じ時間でより多くのコードや機能が開発、提供される可能性が高いためです。

  3. SDLCでAIを活用する際のベストプラクティスをまとめたチートシートをご覧ください。GitリポジトリのPR連携をはじめとするSnykのSDLC連携機能は、通常のワークフローでコードレビューを支援し、自社コードの脆弱性やサードパーティの脆弱性、脆弱なコンテナ、IaCのセキュリティ問題や設定ミスの混入を防ぎます。

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

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

カテゴリー: