Java でのコマンド実行の脆弱性を防止する
Java アプリケーションを開発する場合、ファイルの圧縮、解凍、ファイルのコピーなどを実行するシステム コマンドの実行など、一部の操作を実行するためにシステム コマンドを呼び出す必要があることがよくあります。 。ただし、適切な予防措置を講じないと、これらのコマンド実行操作はコマンド実行の脆弱性のリスクにつながる可能性があります。この記事では、一般的なコマンド実行の脆弱性とその回避方法を紹介します。
1. コマンド実行の脆弱性のリスク
コマンド実行の脆弱性とは、入力されたユーザーデータがシステムコマンドの形式で実行され、悪意のある攻撃者がサーバー上で任意の操作を実行できることを意味します。この種の脆弱性は、ユーザーが入力したパラメータや URL などの制御可能なデータを入力することによって、実行可能なコマンドをアプリケーションに挿入することがよくあります。
たとえば、次のコードはコマンド実行の脆弱性の簡単な例を示しています:
import java.io.*; public class CommandExecutionVulnerabilityExample { public static void main(String[] args) { String userInput = args[0]; try { String command = "ls " + userInput; Process process = Runtime.getRuntime().exec(command); process.waitFor(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
上記の例では、ユーザーが入力したパラメータが実行用のコマンドに直接結合されます。フィルタリングや検証なしで。悪意のある攻撃者が特殊文字やコマンドを userInput
に挿入すると、予期しないシステム コマンドが実行される可能性があります。たとえば、攻撃者は userInput="; rm -rf /"
と入力してファイル システム全体を削除する可能性があります。
2. コマンド実行の脆弱性を防ぐ方法
コマンド実行の脆弱性を防ぐには、ユーザー入力データを使用してシステム コマンドを実行する前に、入力を厳密にフィルタリングして検証する必要があります。
まず、ユーザーが入力したデータの有効性を検証し、予期されるパラメータのタイプと形式のみを受け入れる必要があります。たとえば、ユーザーが数値の入力のみを期待されている場合、正規表現またはその他の方法を使用して、ユーザーが入力したパラメーターが数値の形式に準拠しているかどうかを検証できます。 userInput.matches("\d " )
。
2 番目に、特殊文字がコマンドの一部として実行されないように、ユーザーが入力したパラメータをエスケープする必要があります。 ProcessBuilder
を使用してシステム コマンドを実行し、ユーザーが入力したパラメーターをリスト形式で ProcessBuilder
に渡すことができます。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class CommandExecutionPreventionExample { public static void main(String[] args) throws IOException { String userInput = args[0]; try { List<String> command = new ArrayList<>(); command.add("ls"); command.add(userInput); ProcessBuilder processBuilder = new ProcessBuilder(command); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } process.waitFor(); reader.close(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
上の例では、ProcessBuilder
を使用してシステム コマンドを実行し、コマンドとパラメーターを個別に渡し、コマンド インジェクションのリスクを回避しました。同時に、ホワイトリストを使用して、実行できるコマンドとパラメータを制限できます。
3. 概要
Java アプリケーションを開発する場合、コマンド実行の脆弱性のリスクを防ぐために、ユーザーが入力したデータの正当性の検証とパラメーターのエスケープを常に実行する必要があります。同時に、ホワイトリスト メカニズムを使用して、実行可能なコマンドとパラメータを制限することもできます。これらの方法により、悪意のある攻撃者がコマンド実行の脆弱性を利用して悪意のある操作を実行することを防ぎ、アプリケーションのセキュリティを向上させることができます。
以上がJava でのコマンド実行の脆弱性の防止の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。