Skip to main content

V5.5.1 Deserialization Prevention

Requirement:#

Verify that serialized objects use integrity checks or are encrypted to prevent hostile object creation or data tampering. (C5)

Explanation:#

Сериализованные объекты — это структуры данных, которые преобразуются в поток байтов для хранения или передачи между системами. Однако без надлежащих мер безопасности эти объекты могут быть уязвимы для подделки данных или создания враждебных объектов.

Remediation:#

  • Если доступно, используйте функции подписи/запечатывания языка программирования, чтобы убедиться, что десериализованные данные не были испорчены. Например, код проверки подлинности сообщений на основе хэша (HMAC) может использоваться для обеспечения того, чтобы данные не были изменены.

  • При десериализации данных заполняйте новый объект, а не просто десериализуйте. В результате данные проходят безопасную проверку входных данных и что функции безопасны

  • Явно определите конечный объект object(), чтобы предотвратить десериализацию.

  • Сделайте поля переходными, чтобы защитить их от десериализации. Попытка сериализации, а затем десериализации класса, содержащего переходные поля, приведет к созданию NULL, где должны находиться переходные данные. Это отличный способ предотвратить неправильную перенос и использование переменных времени, окружающей среды или чувствительных переменных.

  • Избегайте наличия ненужных типов или гаджетов, которые могут быть использованы для вредоносных целей. Это ограничивает вероятность использования злоумышленником непреднамеренных или несанкционированных типов и гаджетов. Добавляйте в список разрешений только допустимые классы. Примечание: новые гаджеты постоянно обнаруживаются, поэтому это само по себе не является достаточным смягчением.

Пример кода C:

import java.io.*;
import java.security.*;
import javax.crypto.*;
public class SerializedObjectExample {
public static void main(String[] args) throws Exception {
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// Encrypt the object
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
SealedObject sealedObject = new SealedObject(new SerializedObject(), cipher);
// Write the encrypted object to a file
FileOutputStream fos = new FileOutputStream("serialized_object.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(sealedObject);
oos.close();
// Read the encrypted object from the file
FileInputStream fis = new FileInputStream("serialized_object.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
SealedObject encryptedObject = (SealedObject) ois.readObject();
ois.close();
// Decrypt the object
cipher.init(Cipher.DECRYPT_MODE, secretKey);
SerializedObject decryptedObject = (SerializedObject) encryptedObject.getObject(cipher);
// Use the decrypted object
System.out.println("Decrypted object: " + decryptedObject);
}
}
class SerializedObject implements Serializable {
private int value = 42;
public String toString() {
return "SerializedObject [value=" + value + "]";
}
}

В этом примере SerializedObject шифруется с использованием алгоритма AES и секретного ключа. Затем зашифрованный объект записывается в файл. Затем зашифрованный объект считывается из файла и расшифровывается с использованием того же секретного ключа. Это помогает обеспечить конфиденциальность и целостность данных.

Additional:#

CWE - CWE-502: Десериализация ненадежных данных (4.9) (mitre.org)