| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-10-22 | 3.2 kB | |
| v5.4.2 source code.tar.gz | 2026-10-22 | 1.0 MB | |
| v5.4.2 source code.zip | 2026-10-22 | 2.0 MB | |
| Totals: 3 Items | 3.0 MB | 0 | |
Security Fixes
- Importing an exchange file no longer deserializes arbitrary classes (CWE-502, GHSA-q86x-r2q3-vf4p)
NitriteJsonImporterBase64-decoded the keys, documents and index descriptors of an exchange JSON file and read them through a plainObjectInputStream. An attacker-supplied file could makeImporter.importFrom(...)run thereadObject()of anySerializablegadget class on the classpath. The filters added for GHSA-9297-g93h-86gg and GHSA-7w7v-2j76-mqwp covered only the MVStore adapter.- The importer, and the RocksDB adapter's index-key decoder (its last
ObjectInputStream), now read throughObjectUtils.createFilteredInputStream, which resolves only Nitrite's own, JDK andkotlin.collectionstypes. It checks classes inresolveClass, so it works on Android too. - Exchange files holding values of other
Serializableclasses now fail to import unless those classes are allowed with the newImportOptions.setAllowedClasses(...), e.g.setAllowedClasses("com.example.model.**"). - Reading a RocksDB file no longer instantiates arbitrary classes (CWE-502, GHSA-q86x-r2q3-vf4p)
KryoObjectFormatterran Kryo withsetRegistrationRequired(false), so a crafted database file could name any class on the classpath and Kryo would load it, instantiate it and set its fields, a known route to gadget chains.- Classes registered with
registerSerializer(...)are read as before. A class stored by name must now be a Nitrite, JDK orkotlin.collectionstype, or match the patterns given to the newKryoObjectFormatter(String allowedClasses), e.g.new KryoObjectFormatter("com.example.model.**"), passed toRocksDBModuleBuilder.objectFormatter(...). Anything else fails with aNitriteSecurityExceptionnaming the class, before the class is loaded. - The Kryo instance is no longer shared by every
KryoObjectFormatterin the JVM; serializers registered on one formatter no longer leak into others. The on-disk format is unchanged.
Issue Fixes
- Spatial indexes now work after reopening an MVStore file (#1334)
- H2 reads persisted R-tree keys back as its own
Spatialimplementation, so queries, updates and removals on a reopened spatial index failed with aClassCastExceptionfromDefaultSpatialtoMVSpatialKey. Cursors and bounds comparisons now accept anySpatial. The on-disk format and public method signatures are unchanged. - Thanks to @sfkamath for the report and the fix.
- Filters on nested fields now match documents built from plain maps (#1335)
Document.createDocument(Map)keeps nested objects as plainMaps (as deserialized JSON does), but embedded-field lookup only descended intoDocumentvalues. Soget("address.city")returnednullandwhere("address.city").eq(...)never matched. Lookup now descends into anyMapvalue.