Comment valider un objet avant de désérialisation

Dans mon code, j'appelle la méthode getObject() à partir d'un ObjectMessage objet reçu à partir d'une file d'attente JMS. Enrichir le rapport est de se plaindre à propos de cette méthode getObject() avec une erreur de nom comme ceci Dynamic Code Evaluation: Unsafe Deserialization.
Fondamentalement, il dit, je ne devrais pas désérialiser les données non fiables sans valider le contenu de l'objet de flux. Ci-dessous est le code.
Comment et quelles sont les méthodes que je devrais utiliser pour se débarrasser de cette Enrichir le rapport d'erreur s'il vous plaît.

if (message instanceof ObjectMessage) {
    ObjectMessage objMessage = (ObjectMessage) message;
    Object objReportMessage = objMessage.getObject();
....

Voici le Fortifier question avec des recommandations. Puis il points de cette erreur dans le code ci-dessus à la ligne objMessage.getObject();

De Code dynamique d'Évaluation: Dangereux Désérialisation (1 question)

Résumé
La désérialisation contrôlée par l'utilisateur de l'objet de flux lors de l'exécution peut permettre à des attaquants d'exécuter du code arbitraire sur le
serveur, l'abus de la logique de l'application ou de mener un déni de service.

Explication
La sérialisation Java tourne graphes d'objets dans le flux d'octets contenant les objets eux-mêmes et la
métadonnées nécessaires pour les reconstruire dans le flux d'octets. Les développeurs peuvent créer un code personnalisé à l'aide
dans le processus de la désérialisation d'objets Java, où ils peuvent même remplacer le désérialiser des objets avec
les différents objets, ou des mandataires. La mesure de la désérialisation processus se déroule durant les objets
la reconstruction avant que les objets sont renvoyés à l'application et jeté devrait types. Par le temps
les développeurs d'essayer d'appliquer un type attendu, le code peut-être déjà été exécuté.
La coutume de la désérialisation routines sont définies dans le serializable classes qui doivent être présents dans le
runtime classpath et ne peut pas être injecté par l'attaquant de sorte que l'exploitabilité de ces attaques dépend
les classes disponibles dans l'environnement de l'application. Malheureusement, commune de la troisième partie des classes ou même
Les classes du JDK peuvent être victimes de violence à l'échappement de la JVM des ressources, de déployer les fichiers malveillants ou d'exécuter du code arbitraire.
Certains protocoles d'utilisation de la sérialisation Java derrière les scènes dans la couche de transport. RMI et JMX sont
des exemples de ces protocoles.

Exemple 1: Voici un exemple d'un RMI de l'interface qui peut être exposée au public, contenant des méthodes avec
un ou plusieurs paramètres. Lors de l'appel de ces méthodes à distance, les arguments seront désérialisé sur le
serveur de permettre à des attaquants d'injecter de l'objet malveillant graphiques.

public interface MyService extends java.rmi.Remote {
public Object doSomething (Object arg0) throws RemoteException;
public Object doSomethingElse (Object arg0, Object arg1) throws
RemoteException;
...
}

Exemple 2: MBeans JMX également utiliser la sérialisation Java pour transmettre des arguments d'appel. Dans l'exemple ci-dessous, le
MyManagedBean les méthodes de la classe seront exposés à des clients.

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("com.example:type=MyManagedBean");
MyManagedBean mbean = new MyManagedBean();
mbs.registerMBean(mbean, name);

Recommandation
Si possible, ne pas désérialiser les données non fiables sans valider le contenu de l'objet de flux. Afin de
valider les classes désérialisé, le " look-ahead de la désérialisation modèle devrait être utilisé.
Le flux d'objet sera la première à contenir la description de la classe de métadonnées, puis le sérialisé octets de leur
membre de champs. Le processus de sérialisation Java qui permet aux développeurs de lire la description de la classe et de décider
si vous souhaitez procéder à la désérialisation de l'objet ou de l'abandonner. Pour ce faire, il est nécessaire de
sous-classe java.io.ObjectInputStream et de fournir une implémentation personnalisée de l'
resolveClass(ObjectStreamClass desc) méthode de la classe de validation et de vérification devrait
Sep 29, 2016, 5:09 PM
Le Droit D'Auteur 2015 Hewlett Packard
Le Développement de l'entreprise LP 13
prendre place.
Il y a des implémentations existantes de la look-ahead modèle qui peut être facilement utilisés, tels que l'Apache
Commons IO (org.apache.commons.io.la sérialisation.ValidatingObjectInputStream).
Utilisez toujours une stricte approche par liste blanche pour seulement désérialiser devrait types. Une liste noire approche n'est pas
recommandé puisque les attaquants peuvent utiliser de nombreux gadgets disponibles pour contourner la liste noire. Aussi, gardez à l'esprit
que bien que certains cours pour parvenir à l'exécution de code sont connues du public, il peut y en avoir d'autres qui sont
inconnu ou non, donc une liste blanche approche sera toujours préférable. Toute classe est autorisée dans la liste blanche
doivent être vérifiés pour s'assurer qu'il est sécuritaire pour désérialiser.
Pour éviter les attaques de déni de service, il vous est recommandé de remplacer le resolveObject(Objet
obj) méthode pour compter le nombre d'objets sont désérialisé l'abandon et la désérialisation lorsqu'
un seuil est dépassé.
Lors de la désérialisation prend place dans la bibliothèque, ou de cadre (par exemple, lors de l'utilisation de JMX, RMI, JMS, HTTP Invocateurs)
la recommandation ci-dessus n'est pas utile puisqu'il est au-delà du contrôle du développeur. Dans ces cas, vous pouvez
voulons faire en sorte que ces protocoles répondre aux exigences suivantes:
- Ne pas exposer publiquement.
- Utiliser l'authentification.
- Utiliser les contrôles d'intégrité.
- Utiliser le chiffrement.
En outre, HPE Sécurité Fortifier Runtime fournit des contrôles de sécurité pour être exécutée chaque fois que l'
l'application effectue une désérialisation d'un ObjectInputStream, protégeant à la fois le code de l'application, mais
également de la bibliothèque et du cadre code de ce type d'attaque.

Vous ne pouvez pas, et le message ne peut pas sérieusement dire que.
Ouais, je ne pouvais pas trouver quelque chose d'utile en ligne, peut-être que je comprends mal ou le Fortifier le rapport ne reconnaît pas le problème correctement. J'ai juste édité le post et attaché à la question de Fortifier rapport, pouvez-vous svp m'aider à prendre un coup d'oeil? Merci.

OriginalL'auteur Tech Noob | 2016-09-30