メッセージソナー以下のコードのために、どのように「([Ljava / LANG /文字列)Vは、コマンドインジェクションの脆弱できるJava / LANG / ProcessBuilderをこの使用法」を回避するには?
更新しました
void assign(String path, File jarFile) {
File cert = new File(path, "Cert");
String password = "123";
File script = new File(path, "assign.bat");
String command = "\"" + script.getAbsolutePath() + "\" " + password
+ " \"" + cert.getAbsolutePath() + "\""
+ " \"" + jarFile.getAbsolutePath() + "\"";
Process proc = new ProcessBuilder(command).start();
}
それはあなたがここに乱用の可能性は実際には存在しないことを、現在のテストコードに推論できることかもしれないが、私は、これは「123」のハードコーディングされたパスワード所与の生産コードであることを疑います。このようなコードはモーフに傾向があり、そしてあなたは、注射の可能性を残している場合、あなたはすべてのパラメータは、注入を排除することができるようにどこから来ているについてはあまり知っている必要があります。あなたはそれを正しい方法を行う場合は、パラメータを持つように注意する必要がありません。
また、脆弱性スキャナは、このスマートにすることはできません。誰がソナーが探しているものを知っているが、それはProcessBuilderをのコンストラクタのこの特定の変異体について不平を言っています。多分それは、入力文字列にスペースを認識し、そこにパラメータがある知ることができます。知るか。かかわらず、コンストラクタのより堅牢なバージョンを使用しない理由は本当にありません。私はそうすることが、このメッセージを回避することを期待しています。
ただ、SQLと同じように、その答えは次のように、ProcessBuilderをする個々のパラメータを渡すことです:
void assign(String path, File jarFile) throws IOException {
File cert = new File(path, "Cert");
String password = "123";
File script = new File(path, "assign.bat");
String[] command = {
script.getAbsolutePath(),
password,
cert.getAbsolutePath(),
jarFile.getAbsolutePath()
};
Process proc = new ProcessBuilder(command).start();
}
コード自体の実行とパラメータとの間の差を知っており、従って実行缶はそう簡単に操作できないことを、これは保証します。また、これは、この特定のコードクリーナーと読みやすくなります。
この場合であっても、なるように注意してください、このコードが安全である、あなたは密接の行動知っている必要があります()File.getAbsolutePath及び/「パス」と「jarファイルは、」から来ているかを正確に。それはいる可能性がありますファイルは、から何か悪いを返すように操作することができるgetAbsolutePath。私はそれができるとは言わないよ、私はProcessBuilderをコンストラクタの多列バリアントを使用したいと思います正確な理由私はどちらかの方法を知らないという事実です。
UPDATE:だからソナーはまだこのフォーム文句を言っています。これは、コンストラクタが「1つ以上」の文字列を取ることができ、コンストラクタが可変引数であるため、この新しいバージョンはまだ、同じコンストラクタを使用していることが判明しました。私は提供元の溶液は、実際の注入の問題を解決しますが、ソナーは、我々はコマンド引数を分離してきたという事実を認識することはできないと思います。
代わりに、配列のリストを取りたProcessBuilderのコンストラクタがあります。私の例のこのバージョンでは、代わりにそのコンストラクタを使用しています。
void assign(String path, File jarFile) throws IOException {
File cert = new File(path, "Cert");
String password = "123";
File script = new File(path, "assign.bat");
String[] command = {
script.getAbsolutePath(),
password,
cert.getAbsolutePath(),
jarFile.getAbsolutePath()
};
List<String> commandList = Arrays.asList(command);
Process proc = new ProcessBuilder(commandList).start();
}
私は、これはソナーを喜ば願っています。私は、ProcessBuilderをを構築するこの方法は、それが探しているものであることを推測しています。