JD.INF.ALLOC

無限ループ内での割り当て

JD.INF.ALLOC は、メモリの大きなセクションが無限ループ内で消費されるときに、使用可能なメモリの検証がない場合に発生します。

脆弱性とリスク

ソフトウェアはメモリ割り当てを適切に制御しません。攻撃者が制御されていないメモリ割り当てをトリガーできる場合、最終的には利用可能なリソースを使い果たす可能性があります、これはサービス拒否攻撃とも呼ばれます。サービス拒否攻撃は、アプリケーションとそのホストオペレーティングシステムの速度を低下させ、有効なユーザーがソフトウェアにアクセスするのを妨げ、周囲の環境に影響を与える可能性があります。

軽減と防止

利用可能なメモリチェックを行い、無限ループを使用しません。たとえば、Runtime.getRuntime().freeMemory() メソッドを使用して、使用可能な空きメモリを確認します。

脆弱コード例

コピー
   while(true)
   {
     byte[] b = new byte[NUMBER];
     list.add(b);
   }

上記の例では、無限の割り当てにより OutOfMemoryError 例外が発生する可能性があります。Klocwork は 3 行目で JD.INF.ALLOC の欠陥を報告します。これは、無限ループ内のメモリ割り当てが OutOfMemoryError を引き起こす可能性があることを示しています。

修正コード例

コピー
   while(true)
   {
     if (Runtime.getRuntime().freeMemory() > NUMBER) {
       byte[] b = new byte[NUMBER];
       list.add(b);
     }
   }

Runtime.getRuntime().freeMemory() メソッドを使用して使用可能な空きメモリのチェックを追加することで、問題が解決します。