Abordar las vulnerabilidades de la deserialización | Java
Una aplicación que acepta datos que no son de confianza y los deserializa es vulnerable a los ataques. Puede crear filtros para filtrar los flujos entrantes de objetos serializados antes de que se deserialicen.
Un objeto se serializa cuando su estado se convierte en un flujo de bytes. Ese flujo se puede enviar a un archivo, a una base de datos o a través de una red. Un objeto Java es serializable si su clase o cualquiera de sus superclases implementa la interfaz java.io.Serializable o la subinterfaz java.io.Externalizable. En el JDK, la serialización se utiliza en muchas áreas, incluida la invocación de método remoto (RMI), la RMI personalizada para protocolos de comunicación entre procesos (IPC) (como el invocador HTTP de Spring), las extensiones de administración de Java (JMX) y el servicio de mensajería de Java (JMS)).
Un objeto se deserializa cuando su forma serializada se convierte en una copia del objeto. Es importante garantizar la seguridad de esta conversión. La deserialización es la ejecución de código, porque el método readObject de la clase que se deserializa puede contener código personalizado. Las clases serializables, también conocidas como "clases de gadget", pueden realizar acciones reflexivas arbitrarias, como crear clases e invocar métodos en ellas. Si su aplicación deserializa estas clases, pueden provocar una denegación de servicio o la ejecución remota de código.
Cuando crea un filtro, puede especificar qué clases son aceptables para una aplicación y cuáles deben rechazarse. Puede controlar el tamaño y la complejidad del gráfico de objetos durante la deserialización para que el gráfico de objetos no supere los límites razonables. Los filtros se pueden configurar como propiedades o implementar mediante programación.
Además de crear filtros, puede realizar las siguientes acciones para ayudar a prevenir vulnerabilidades de deserialización:
- No deserialice datos que no sean de confianza.
- Utilice SSL para cifrar y autenticar las conexiones entre aplicaciones.
- Valide los valores de los campos antes de la asignación, incluida la comprobación de los invariantes de los objetos mediante el método readObject.
Nota: Se proporcionan filtros incorporados para RMI. Sin embargo, debe utilizar estos filtros integrados solo como puntos de partida. Configure listas negras y / o amplíe la lista blanca para agregar protección adicional para su aplicación que usa RMI.
Comentarios
Publicar un comentario