メソッドは、処理の失敗や成功を通知したりローカルオブジェクトやフィールドを更新するために、値を返すことができる。メソッドの返り値が無視されたり、呼出し元が適切な処理を行わない場合には、セキュリティ上のリスクが生じる。よって、プログラムはメソッドの返り値を無視してはならない。
ゲッターメソッドがその動作に基づいて命名されている場合、プログラマは、返り値があることに気がつかないかもしれない。たとえば、ProcessBuilder.redirectErrorStream() メソッドの唯一の目的は、ProcessBuilder が標準エラーと標準出力のマージに成功したかどうかを返り値によって報告することである。標準エラーのリダイレクトを実際に行うメソッドは、オーバーロードされた引数1つの ProcessBuilder.redirectErrorStream(boolean) メソッドである。
違反コード (ファイル削除)
以下の違反コード例はファイルを削除しようとしているが、削除に成功したかどうかをチェックしていない。
public void deleteFile(){ File someFile = new File("someFileName.txt"); // someFile を使った処理 someFile.delete(); }
適合コード
以下の適合コードは、delete() メソッドが返す boolean 値をチェックし、エラーに対処している。
public void deleteFile(){ File someFile = new File("someFileName.txt"); // someFile を使った処理 if (!someFile.delete()) { // ファイル削除に失敗したときの処理 } }
違反コード (文字列の置換)
以下の違反コードは、String.replace() メソッドの返り値を無視しており、元の文字列の更新に失敗している。String オブジェクトは不変(immutable)であるため、String.replace() メソッドは String の状態を変更することができない。そのため、変更を加えた文字列を含む新しい String オブジェクトへの参照を返り値として返す。
public class Replace { public static void main(String[] args) { String original = "insecure"; original.replace('i', '9'); System.out.println(original); } }
不変オブジェクトのメソッドの返り値を適切に処理することは特に重要である。可変(mutable)オブジェクトのメソッドの多くはオブジェクトの内部状態を変更しつつ動作するが、不変オブジェクトのメソッドはオブジェクト(の内部状態)を変更できないので、多くの場合、元のオブジェクトをそのままにして、変更を加えたオブジェクトへの参照を新たに生成して返す。
適合コード
以下の適合コードでは String オブジェクト original を String.replace() メソッドの返り値を使って適切に更新している。
public class DoNotIgnore { public static void main(String[] args) { String original = "insecure"; original = original.replace( 'i', '9' ); System.out.println(original); } }
リスク評価
メソッドの返り値を無視するとプログラムの予期せぬ動作につながる可能性がある。
ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
EXP00-J | 中 | 中 | 中 | P8 | L2 |
自動検出
Coverity Prevent バージョン 5.0 CHECKED_RETURN チェッカーは、メソッドの返り値を使う前にそれがエラーかどうかをチェックしないコードを検出できる。
関連ガイドライン
CERT C Secure Coding Standard | EXP12-C. Do not ignore values returned by functions |
CERT C++ Secure Coding Standard | EXP12-CPP. Do not ignore values returned by functions or methods |
ISO/IEC TR 24772:2010 | "Passing Parameters and Return Values [CSJ]" |
MITRE CWE | CWE-252. Unchecked return value |
参考文献
[API 2006] | method delete() |
method replace() | |
[Green 2008] | "String.replace" |
[Pugh 2009] | misusing putIfAbsent |
翻訳元
これは以下のページを翻訳したものです。
EXP00-J. Do not ignore values returned by methods (revision 76)