CVE-2026-67211 in OpenNLP
要約
〜によって VulDB • 2026年09月11日
Apache OpenNLPのSymSpellModelSerializerにおける、無制限なMap事前サイズ指定によるOOM(Out-of-Memory)サービス妨害
影響を受けるバージョン:
- 3.0.0-M4 - 3.0.0-M5
(opennlp-spellcheck拡張機能は3.0.0-M4で導入されました。1.xおよび2.xのリリースには、この脆弱性のあるコードは含まれていません。)
説明:
SymSpellModelSerializer.create()メソッドは、バイナリSymSpellモデルストリームから2つの32ビット符号付き整数のカウントフィールド(unigramCountとbigramCount)を読み取り、それぞれが負でないことのみを検証した後に、その値をLinkedHashMap.newLinkedHashMap()に直接渡します。上限制限が適用されないため、モデルファイルの信頼できないソース由来の場合、カウントは攻撃者が完全に制御可能になります。
いずれかのカウントフィールドがInteger.MAX_VALUE(または利用可能なヒープ領域を使い尽くすのに十分な大きさの任意の値)に設定された不正な.binモデルファイルを作成すると、マップは2^30エントリという容量で事前サイズ指定されます。過大なバック配列は、そのマップへの最初のput()呼び出し時に割り当てられ(圧縮オブジェクト参照が有効かどうかによって4〜8GBを要求)、OutOfMemoryErrorにより読み込み処理に失敗します。カウントフィールドは固定サイズのヘッダー(マジックナンバー、フォーマットバージョン、3つのUTF文字列、設定フィールド、編集距離識別子)の直後に配置されているため、攻撃者はペイロードを武器化する際に実質的なサイズコストを支払う必要がありません:100バイト未満のファイルに実際のエントリが1つ含まれていれば、それを読み込むJVMはクラッシュします。
SymSpellモデルを逆シリアル化するすべてのコードパスに影響があります。これには、SymSpellModels.deserialize(InputStream)、SymSpellModels.fromBytes(byte[])、SymSpellModelResolver.resolveByLanguage(String)によるクラスパス上のモデル読み込み、CorrectTextToolコマンドラインツール、および登録されたArtifactSerializerを通じたモデルアーカイブの読み込みが含まれます。opennlp-spellcheck拡張機能は公式OpenNLPバイナリディストリビューションに同梱されています。
実質的な影響は、信頼できないまたは半信頼性のソースからSymSpellモデルファイルを読み込むプロセスに対するサービス妨害(Denial of Service)です。
緩和策:
- 3.xユーザーは3.0.0-M6へのアップグレードを行ってください。
注記:修正では、マップの事前サイズ指定の前に両方のカウントフィールドに上限制限が適用されます。負の数値またはこの上限を超える数値の場合、IOExceptionが発生し、大きな割り当てなしで読み込み処理は早期失敗します。この上限は以前導入されたAbstractModelReader.MAX_ENTRIES制限であり、今回の変更により公開可視性(public visibility)へと昇格させられ、独自のバイナリフォーマットを実装するシリアライザがこれを共有できるようにしています。デフォルトの上限値は10,000,000で、これは正当なSymSpell辞書のエントリ数をはるかに超えていますが、ヒープ領域を使い尽くす可能性のある値よりはるかに低い値です。 legitimatelyに大きな辞書を読み込む必要があるデプロイメントでは、OPENNLP_MAX_ENTRIESシステムプロパティを希望する正の整数(例:-DOPENNLP_MAX_ENTRIES=50000000)に設定することでJVM起動時に制限を引き上げることができます。無効または非正の数値はデフォルト値に戻ります。このプロパティはモデルリーダーの制限と共有されており、これを引き上げることは両方の制限を緩和することに注意してください。
すぐにアップグレードできないユーザーは、その出所が検証されていない限り、すべてのSymSpell .binモデルファイルを信頼できない入力として扱い、整合性チェックなしでエンドユーザーから提供されたモデルやサードパーティリポジトリから取得したモデルの読み込みを避けるべきです。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.