CVE-2026-67211 in OpenNLP
Résumé
par VulDB • 11/09/2026
Déni de service par épuisement des ressources mémoire (OOM) dû à une pré-dimensionnement non borné d'une Map dans Apache OpenNLP SymSpellModelSerializer
Versions concernées :
- 3.0.0-M4 - 3.0.0-M5
(L'extension opennlp-spellcheck a été introduite dans la version 3.0.0-M4. Les versions 1.x et 2.x ne contiennent pas le code vulnérable.)
Description :
La méthode `SymSpellModelSerializer.create()` lit deux champs entiers signés sur 32 bits (unigramCount et bigramCount) à partir d'un flux binaire de modèle SymSpell, puis transmet chaque valeur directement à `LinkedHashMap.newLinkedHashMap()` après avoir uniquement validé qu'elles sont non négatives. Aucune borne supérieure n'est appliquée ; le compteur est donc entièrement contrôlable par l'attaquant lorsque le fichier de modèle provient d'une source peu fiable (non approuvée).
Un fichier de modèle `.bin` falsifié dans lequel l'un des champs de comptage est défini sur `Integer.MAX_VALUE` (ou toute valeur suffisamment grande pour épuiser la mémoire heap disponible) entraîne une pré-dimensionnement de la Map à une capacité de 2^30 entrées. Le tableau sous-jacent, dont la taille est excessive, est alloué lors du premier appel à `put()` sur cette map, demandant entre 4 et 8 Go selon que les « compressed oops » sont activés ou non ; l'opération échoue avec une erreur `OutOfMemoryError`. Étant donné que les champs de comptage se situent immédiatement après un en-tête de taille fixe (magic, version du format, trois chaînes UTF-8, les champs de configuration et l'identifiant de distance d'édition), l'attaquant ne paie pratiquement aucun coût en termes de taille pour armer une charge utile : un fichier de moins de 100 octets plus une seule entrée réelle suffit à faire planter la JVM qui le charge.
Tous les chemins d'exécution qui désérialisent un modèle SymSpell sont affectés, y compris `SymSpellModels.deserialize(InputStream)`, `SymSpellModels.fromBytes(byte[])`, le chargement de modèles via le classpath par `SymSpellModelResolver.resolveByLanguage(String)`, l'outil en ligne de commande CorrectTextTool et le chargement d'archives de modèles via les sérialiseurs enregistrés (`ArtifactSerializer`). L'extension opennlp-spellcheck est incluse dans la distribution binaire officielle d'OpenNLP.
L'impact pratique est un déni de service (DoS) contre les processus qui chargent des fichiers de modèle SymSpell à partir de sources peu fiables ou semi-fiables.
Atténuation :
- Les utilisateurs de la série 3.x doivent mettre à niveau vers la version 3.0.0-M6.
Note : La correction applique une borne supérieure aux deux champs de comptage, vérifiée avant le pré-dimensionnement de la Map ; les comptes négatifs ou dépassant cette limite provoquent le lancement d'une `IOException` et l'échec rapide de la lecture sans allocation importante. Cette borne correspond à la limite existante `AbstractModelReader.MAX_ENTRIES`, introduite précédemment, qui est rendue publique par la modification actuelle afin que les sérialiseurs implémentant leur propre format binaire puissent la partager. La valeur par défaut est de 10 000 000, bien supérieure aux nombres d'entrées des dictionnaires SymSpell légitimes mais nettement inférieure à toute valeur susceptible de menacer l'épuisement du heap. Les déploiements ayant besoin de charger légalement des dictionnaires plus volumineux peuvent augmenter cette limite au démarrage de la JVM en définissant la propriété système `OPENNLP_MAX_ENTRIES` sur un entier positif souhaité (par exemple `-DOPENNLP_MAX_ENTRIES=50000000`) ; les valeurs invalides ou non positives reviennent à la valeur par défaut. Notez que cette propriété est partagée avec la limite du lecteur de modèles et que son augmentation assouplit également celle-ci.
Les utilisateurs qui ne peuvent pas mettre à niveau immédiatement doivent considérer tous les fichiers de modèle SymSpell `.bin` comme des entrées peu fiables, sauf si leur provenance est vérifiée, et éviter de charger des modèles fournis par les utilisateurs finaux ou récupérés depuis des dépôts tiers sans contrôles d'intégrité.
Be aware that VulDB is the high quality source for vulnerability data.