Skip to main content

IntelliJ IDEAでコーディング中にJavaのセキュリティ問題を修正する方法

Blog Design IntelliJ IDEA

2021年4月8日

0 分で読めます

今や開発者の役割は、アプリケーションを作ることだけではありません。機能の開発に加えて、アプリケーションの保守性、拡張性、信頼性、そしてセキュリティにも注力する必要があります。セキュリティにどこから取り組めばよいのかわからない開発者は少なくありません。また、多くの企業では、チーム内にセキュリティの専門知識を備えるのではなく、専任のセキュリティチームに頼っています。

多くの開発者は、統合開発環境(IDE)を生活の一部のように使っています。優れたIDEはスイスアーミーナイフのように、ほとんどあらゆる作業に使える頼もしいツールです。アプリケーションの構築、実行、テスト、デバッグ、そしてセキュリティを確保するために必要なものがすべてそろったIDEは、多くの開発者にとって欠かせません。

昨年のSnyk Java Ecosystem reportによると、IntelliJ IDEAはJavaセキュリティの分野で最も人気があり、広く使われているIDEです。Snykは最近、新しいIntelliJ IDE脆弱性スキャナープラグインをリリースしました。この新しいプラグインを使って、セキュリティとセキュアな開発をこのIDEに取り入れる方法を見ていきましょう。

その前に、この記事で取り上げる内容を簡単にご紹介します。

Secure Coding with IntelliJ

コード例を見やすくするため、全画面表示にすることをおすすめします。

IntelliJ IDEA用Snyk Vulnerability Scanner

IntelliJ IDEA用のSnyk IDEプラグインは、すでにあったのでは?

はい、ありました。ただし、以前のプラグインはSnyk Open Sourceのスキャンに特化し、オープンソースの依存関係に含まれる脆弱性の発見と修正を支援するものでした。一方、新しいプラグインには新たにリリースされたSnyk Codeの機能も統合されており、開発者をさまざまな面から支援します。

Snyk IDEプラグインをインストールする

プラグインはIntelliJ IDEAマーケットプレイスからインストールするのがおすすめです。IntelliJ IDEA内のプラグインマーケットプレイスで「snyk」と検索すれば、すぐに見つかります。

Snyk Vulnerability Scannerの検索結果と[インストール]ボタンが表示されたIntelliJ IDEAプラグインマーケットプレイス

プラグインをインストールしてIDEを再起動したら、プラグインの認証が必要です。プラグインを使うには、少なくとも無料のSnykアカウントが必要です。すでにSnykアカウントをお持ちの場合は、サインインするだけで使えます。Snykを初めて利用する方は、初期設定の案内に沿って無料アカウントの登録を進めてください。

IntelliJ IDEAへのSnyk Codeの統合

前述のとおり、IntelliJ IDEA用Snykプラグインの以前のバージョンでは、Snyk Open Sourceの機能のみを利用できました。オープンソースの依存関係に含まれるセキュリティ脆弱性をプロジェクト内でスキャンできます。新しいプラグインでは、既存のSnyk Open Sourceスキャンに加えて、Snyk Codeの機能も利用できます。Snyk Codeは、あなたやチームが作成したコードを静的解析し、脆弱性につながる可能性のあるコード構造を検出するセキュリティ製品です。つまり、1つのプラグインでアプリケーション全体を保護できます。実際に試してみましょう。

IntelliJでセキュリティ脆弱性を修正する

アプリケーションをスキャンすると、画面にいくつかのセクションが表示されます。最初のセクションは、おなじみのSnyk Open Sourceスキャンです。直接依存または間接依存として、既知の脆弱性を含むライブラリがあることを示しています。脆弱性のあるライブラリの1つが、バージョン1.24のsnakeyamlです。このバージョンにはサービス拒否攻撃を受ける脆弱性があります。この攻撃の仕組みと防止方法については、ブログ記事Javaでsnakeyamlを使う際のYAMLパース脆弱性を防ぐで解説しています。

解決方法はとても簡単です。バージョン1.26以降にアップグレードすれば、脆弱性を修正できます。修正を含むバージョンが、必ずしも最新バージョンとは限らない点にご注意ください。脆弱性を含まない最も近いバージョンが提示されます。pomファイルのバージョンを更新してアプリケーションを再スキャンすると、脆弱性は検出されなくなりました。Snyk IntelliJ IDEプラグインが提示する、実行可能な脆弱性修正のアドバイスは、問題解決の優れた手がかりになります。

IntelliJ IDEAとSnykのパネルで、snakeYAMLのサービス拒否脆弱性とバージョン1.26での修正を強調表示。

コードのセキュリティ脆弱性をスキャンする

次のセクションには、Snykプラグインが検出したコードの脆弱性に関する情報が表示されます。Snyk Codeの機能は、特定のセキュリティ脆弱性につながる可能性のあるコードの問題を指摘します。

最初の問題は「パストラバーサル」です。IntelliJ IDEA用Snykプラグインは、問題のある箇所と現在のデータフローを示してくれます。現在のコードでは、実際のファイル名を確認せずにファイルをディスクに書き込んでいます。ファイル名に「../../../textfile.txt」のような文字列が含まれていると、ファイルは正しい場所に保存されません。このファイル名によって上位の階層に移動し、保存先フォルダの外に抜け出してしまいます。その結果、意図しない場所にファイルが保存されます。さらに重要なのは、プロセスの権限によっては、システム上の保存先フォルダ外にある既存のファイルを上書きできてしまうことです。

IntelliJのコードセキュリティパネルで、UploadController.javaの50行目にあるパストラバーサルの脆弱性が強調表示され、Files.writeまでのデータフローが示されています。

これを防ぐには、新しいファイルの正規パスが、以下のように意図した保存先のパスで始まるかどうかを確認します。

Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
String target = new File(UPLOADED_FOLDER).getCanonicalPath();
if (path.toFile().getCanonicalPath().startsWith(target)) {
   Files.write(path, bytes);
}

これでファイルが保存先フォルダの外に保存されなくなるため、パストラバーサルは発生しません。アプリケーションを再スキャンすると、Snyk Codeも問題が解決したと判定しました。

別の例を見てみましょう。コード検査の結果、MessageController.javaの33行目にSQLインジェクションの脆弱性があることがわかりました。データフローを確認すると、実際のSQLインジェクションはMessageRepo.javaにあります。Snyk Codeが複数ファイルを横断して解析し、このファイル間の問題を検出できるのは非常に役立ちます。この機能を備えたツールは多くありません。MessageControllerを通じてSQLインジェクションが外部から実行可能な状態になっているため、すぐに修正する必要があります。

Javaのコントローラーとリポジトリのコードを通る5段階のデータフローを示し、SQLインジェクションの脆弱性を強調表示したSnykのインターフェース。

問題がわかったので、MessageRepo.javaのコードを修正します。パラメーターをクエリ文字列に直接連結するのではなく、クエリパラメーターを使ったプリペアドステートメントを使用します。以下のようにプリペアドステートメントを実装し、アプリケーションを再スキャンすると、プラグインで脆弱性が報告されなくなります。

String query = "SELECT * FROM message WHERE text LIKE ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, text);
ResultSet result = statement.executeQuery();

SQLインジェクションの防止について詳しく知りたい方は、便利なSQLインジェクション防止チートシートもご覧ください。

コード品質

オープンソースの依存関係や独自のコードに含まれるセキュリティ脆弱性をスキャンするだけでなく、IntelliJ IDEA用Snykプラグインはコード品質の向上にも役立ちます。

以下の例では、Snykプラグインが特定の接続を閉じていないことを指摘しています。リソースリークにつながる可能性があるため、finallyブロックでリソースを閉じる必要があります。

Snyk IntelliJプラグインで、MessageRepo.javaの中程度の深刻度のコード品質問題を表示。データベースクエリやステートメントでcloseが呼び出されていない警告が含まれています。

今すぐIntelliJ IDEAにセキュリティを取り入れましょう

現在のIntelliJ IDEA用Snyk Vulnerability Scannerは、Java開発者に必要な機能を一通り備えたツールです。Snyk Open SourceスキャンとSnyk Codeスキャンを組み合わせることで、アプリケーションのセキュリティ上のミスを防ぐ強力なツールになります。コード品質に関する機能も、チームにとって優れた追加機能です。たとえば、コード品質のチェックを実行したくない場合は、プラグインを好みに合わせて設定できます。

それでも、私たちのようなJava開発者は、自分たちが作るアプリケーションに責任を持たなければなりません。その責任には、セキュリティ問題を防ぐことも含まれます。IntelliJ IDEA用Snykプラグインを使えば、お気に入りのIDEで快適にセキュリティ対策に取り組めます。ぜひ試してみませんか?

Capture the Flagを始めよう

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

続きを読む

blog feature snyk container custom base recommendations
Blog

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

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

blog feature ai violet
Blog

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

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

Blog

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

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