界: API Abuse
API 就像是呼叫者與被呼叫者之間簽訂的規定。最常見的 API 濫用形式是由呼叫者這一當事方未能遵守此規定所造成的。例如,如果程式在呼叫 chroot() 後無法呼叫 chdir(),即違反規範如何以安全方式變更使用中根目錄的規定。程式庫濫用的另一個好例子是期待被呼叫者向呼叫者傳回值得信賴的 DNS 資訊。在這種情況下,呼叫者是透過對其行為做出某些假設 (傳回值可用於驗證目的) 來濫用被呼叫者 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