CVE-2026-67211 in OpenNLP
Tóm tắt
Bởi VulDB • 11/09/2026
Lỗi Từ chối Dịch vụ (DoS) do OOM thông qua việc đặt kích thước trước không giới hạn cho Map trong SymSpellModelSerializer của Apache OpenNLP
Các phiên bản bị ảnh hưởng:
- 3.0.0-M4 - 3.0.0-M5
(Phần mở rộng opennlp-spellcheck được đưa vào ở phiên bản 3.0.0-M4. Các bản phát hành 1.x và 2.x không chứa mã nguồn bị ảnh hưởng.)
Mô tả:
Phương thức `SymSpellModelSerializer.create()` đọc hai trường số nguyên có dấu 32-bit (unigramCount và bigramCount) từ luồng mô hình SymSpell nhị phân và chuyển trực tiếp từng giá trị này vào hàm `LinkedHashMap.newLinkedHashMap()` sau khi chỉ xác thực rằng chúng không âm. Không áp đặt giới hạn trên, do đó giá đếm hoàn toàn nằm trong sự kiểm soát của kẻ tấn công nếu tệp mô hình đến từ một nguồn không đáng tin cậy.
Một tệp mô hình `.bin` được tạo ra đặc biệt (crafted) với bất kỳ trường nào trong hai trường đếm được thiết lập thành `Integer.MAX_VALUE` (hoặc bất kỳ giá trị lớn đủ để làm cạn kiệt bộ nhớ heap hiện có) sẽ khiến map được đặt kích thước trước với dung lượng chứa 2^30 mục. Mảng hỗ trợ quá khổ này được phân bổ trên lần gọi `put()` đầu tiên vào map đó, yêu cầu từ 4–8 GB tùy thuộc vào việc compressed oops có đang hoạt động hay không, và thao tác tải sẽ thất bại với lỗi OutOfMemoryError (OOM). Vì các trường đếm nằm ngay sau một phần tiêu đề kích thước cố định (magic, phiên bản định dạng, ba chuỗi UTF, các trường cấu hình và mã nhận diện khoảng cách chỉnh sửa), kẻ tấn công phải trả chi phí kích thước không đáng kể để vũ trang hóa payload: một tệp có dung lượng dưới 100 byte cộng với một mục thực tế duy nhất là đủ để làm sập JVM khi nó được tải.
Bất kỳ đường dẫn mã nào giải serialize mô hình SymSpell đều bị ảnh hưởng, bao gồm `SymSpellModels.deserialize(InputStream)`, `SymSpellModels.fromBytes(byte[])`, việc tải mô hình qua classpath bằng `SymSpellModelResolver.resolveByLanguage(String)`, công cụ dòng lệnh CorrectTextTool và việc tải kho lưu trữ mô hình thông qua ArtifactSerializer đã đăng ký. Phần mở rộng opennlp-spellcheck được cung cấp trong bản phân phối nhị phân chính thức của OpenNLP.
Tác động thực tế là gây ra lỗi Từ chối Dịch vụ (DoS) đối với các tiến trình tải tệp mô hình SymSpell từ các nguồn không đáng tin cậy hoặc bán đáng tin cậy.
Biện pháp khắc phục:
- Người dùng phiên bản 3.x nên nâng cấp lên 3.0.0-M6.
Lưu ý: Bản sửa lỗi áp đặt giới hạn trên cho cả hai trường đếm, được kiểm tra trước khi map được đặt kích thước trước; các giá trị đếm âm hoặc vượt quá giới hạn này sẽ gây ra việc ném ngoại lệ IOException và làm thất bại thao tác đọc nhanh chóng mà không thực hiện phân bổ bộ nhớ lớn. Giới hạn này là `AbstractModelReader.MAX_ENTRIES` đã tồn tại, vốn được đưa vào từ trước, và thay đổi hiện tại nâng nó lên chế độ truy cập public để các serializer triển định dạng nhị phân của riêng chúng có thể chia sẻ giới hạn này. Giá trị mặc định là 10.000.000, cao hơn nhiều so với số lượng mục trong các từ điển SymSpell hợp lệ nhưng thấp hơn rất nhiều so với bất kỳ giá trị nào đe dọa làm cạn kiệt heap. Các triển khai thực tế cần tải các từ điển lớn hơn có thể tăng giới hạn này khi khởi động JVM bằng cách đặt thuộc tính hệ thống `OPENNLP_MAX_ENTRIES` thành số nguyên dương mong muốn (ví dụ: `-DOPENNLP_MAX_ENTRIES=50000000`); các giá trị không hợp lệ hoặc không dương sẽ quay về mặc định. Lưu ý rằng thuộc tính này được chia sẻ với giới hạn của model-reader và việc tăng nó sẽ nới lỏng cả hai.
Người dùng không thể nâng cấp ngay lập tức nên coi tất cả các tệp mô hình SymSpell `.bin` là đầu vào không đáng tin trừ khi nguồn gốc của chúng đã được xác minh, và tránh tải các mô hình do người dùng cuối cung cấp hoặc lấy từ kho lưu trữ bên thứ ba mà không có kiểm tra tính toàn vẹn.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.