界: API Abuse
API は、呼び出し元と呼び出し先の間のコントラクトです。最も一般的な API の不正使用の形態は、呼び出し元がこのコントラクトの終わりを守らないことによって発生します。たとえば、プログラムが chroot() を呼び出した後に chdir() を呼び出すのに失敗すると、アクティブなルート ディレクトリを安全に変更する方法を指定したコントラクトに違反することになります。ライブラリの悪用のもう 1 つの良い例は、呼び出し先が信頼できる DNS 情報を呼び出し元に返すことを期待することです。この場合、呼び出し元は、呼び出し先の API の動作 (戻り値が認証目的に使用できること) についてある種の仮定をすることで、呼び出し先の API を悪用します。また、相手側から、呼び出し元と呼び出し先のコントラクトを違反することもできます。例えば、コーダーが SecureRandom をサブクラス化し、ランダムではない値を返した場合、コントラクトに違反することになります。
Code Correctness: Incorrect Serializable Method Signature
Abstract
シリアライゼーションに誤ったメソッドの署名を使用すると、一度もコールされることがないという結果につながる可能性があります。
Explanation
シリアライズ可能なメソッドの署名が誤っているというコードの正確性に関する問題は、シリアライズ可能なクラスがシリアライズ関数またはデシリアライズ関数を作成するものの、正しい署名に従っていない場合に発生します。
シリアライゼーションが必要とするメソッドの署名からの逸脱は、メソッドがシリアライゼーション/デシリアライゼーションの間コールされることがなくなり、不完全なシリアライゼーション/デシリアライゼーションや、信頼できないコードがオブジェクトにアクセスすることになりかねません。
スローされない例外がある場合は、シリアライゼーション/デシリアライゼーションが失敗してアプリケーションがクラッシュするか、目に見えるエラーなく失敗してオブジェクトが部分的にだけ正しく構成され、デバッグがきわめて困難な欠陥につながる可能性があります。コール元は、クラッシュや部分的なオブジェクト構成などを発生させずに、これらの例外をキャッチしてシリアライゼーション/デシリアライゼーションの誤りを適切に処理する必要があります。
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
シリアライゼーションが必要とするメソッドの署名からの逸脱は、メソッドがシリアライゼーション/デシリアライゼーションの間コールされることがなくなり、不完全なシリアライゼーション/デシリアライゼーションや、信頼できないコードがオブジェクトにアクセスすることになりかねません。
スローされない例外がある場合は、シリアライゼーション/デシリアライゼーションが失敗してアプリケーションがクラッシュするか、目に見えるエラーなく失敗してオブジェクトが部分的にだけ正しく構成され、デバッグがきわめて困難な欠陥につながる可能性があります。コール元は、クラッシュや部分的なオブジェクト構成などを発生させずに、これらの例外をキャッチしてシリアライゼーション/デシリアライゼーションの誤りを適切に処理する必要があります。
References
[1] SER01-J. Do not deviate from the proper signatures of serialization methods CERT
desc.structural.java.code_correctness_incorrect_serializable_method_signature