3

たまたま IBM アプリスキャンhttp://www-01.ibm.com/software/awdtools/appscan/を使用しました

私たちの Java コードベースに対して、約 3000 の重大度の高い脆弱性が返されました。

それらのほとんどはたまたまシステム情報リークであり、catch ブロックでスタック トレースを出力するときに発生していると考えられますが、発生しているファイル名と行番号のみを出力するため、コードをより適切にデバッグできます。

また、SQL インジェクション、入力検証などに関するものもあります。

しかし、私の質問はリソースの枯渇 (ファイル記述子、ディスク容量、ソケットなど) に関するもので、java.io.BufferedReader.readLine外部攻撃の可能性のある場所としてのすべてのインスタンスがリストされています。

       InputStream ins=conn.getInputStream();

      String inputLine;

      if (!preserveLinefeeds) {
         BufferedReader in = new BufferedReader(new InputStreamReader(ins));
         while ((inputLine = in.readLine()) != null)
            pr.readThreadResponse+=inputLine;
         in.close();
         ins.close();
      } 

conn は HttpURLConnection オブジェクトです。

これを防ぐためにコードにセーフガードを追加するにはどうすればよいですか?

4

2 に答える 2

7

AppScanがreadLineに関連するサービス拒否の脆弱性を示している場合、それはおそらくストリームを閉じられないことへの懸念によるものではなく(これは重要かもしれませんが)、readLineの無制限の性質によるものです。readLineは、改行またはCR-LFが読み取られるまで入力を読み取り続けるため、入力ソースが信頼されていない場合、予想されるCR-LFなしで大量のデータが供給され、メモリが枯渇する可能性があります。

これを解決するには、(アプリ外のメカニズムを介して)入力サイズが安全で合理的​​なものに制限されていることを確認するか(AppScan、Fortify、およびその他のツールは引き続きreadLineについて文句を言います)、さらに良いことに、バッファーに読み込まれる文字数の絶対最大値を設定する、制限付き読み取りルーチンを持つreadLines。

于 2012-11-16T05:41:22.437 に答える
2

ストリームを開くときはいつでも、終了時に finally ブロックがストリームを閉じることを確認してください。

コード内のストリームからの読み取り中に IOException がスローされた場合、ストリームは閉じられないため、警告

Java 7 では、try with resources コンストラクトを使用してこれを簡単に行うことができます。Java 6 以前では、多くのボイラープレートで複製する必要があります。

InputStream ins = null;
try {
  ins = conn.getInputStream();
  ...
} finally {
  IOUtils.closeQuietly(ins);
}

Apache Commons の IOUtils クラスを使用する

依存関係を追加したくない場合は、独自の closeQuietly を作成できます

于 2012-09-13T18:49:37.483 に答える