Skip to content
Heist/ feed
Back to feed
UnratedFix available

Resource budgets not enforced on the typed deserialization path

Type: advisorySources: OSV

`ParserConfig::max_events`, `max_nodes`, `max_total_scalar_bytes`, `max_merge_keys`, `alias_anchor_ratio` and the alias jump factor were enforced only by the two `Value` loaders. A typed target with a default-shaped configuration is served by the streaming deserializer, which never read those fields, so tightening any of them had no effect on `from_str::` for a struct target. The default document-length, depth and alias-count caps were enforced on every path, so no input was unbounded; the gap affects callers who tightened the other budgets for hostile input. Version 0.0.53 charges every budget on the streaming path as well and adds cross-path parity tests. Users who cannot upgrade can deserialize into `noyalib::Value` first and convert with `from_value`, or rely on `max_document_length` and `max_depth`, which were always applied on every path.

Products
noyalib
Affected versions
Not specified
Fixed versions
0.0.53
CVEs
Not specified
Confirmed fixed CVEs
Not specified
Updated in this feed
28 Oct 2026, 09:10 UTC · Revision 1

Source evidence

Resource budgets not enforced on the typed deserialization path

core-osv · Original source

Published 6 Oct 2026, 12:00 UTC

`ParserConfig::max_events`, `max_nodes`, `max_total_scalar_bytes`, `max_merge_keys`, `alias_anchor_ratio` and the alias jump factor were enforced only by the two `Value` loaders. A typed target with a default-shaped configuration is served by the streaming deserializer, which never read those fields, so tightening any of them had no effect on `from_str::` for a struct target. The default document-length, depth and alias-count caps were enforced on every path, so no input was unbounded; the gap affects callers who tightened the other budgets for hostile input. Version 0.0.53 charges every budget on the streaming path as well and adds cross-path parity tests. Users who cannot upgrade can deserialize into `noyalib::Value` first and convert with `from_value`, or rely on `max_document_length` and `max_depth`, which were always applied on every path.

osv:RUSTSEC-2026-0333

noyalib

Fixed versions: 0.0.53

Complete source record
{
  "id": "f16dc1c34a98c1f3afc2aa76d2b3bc99c2127d51ae2d186d2b7618ec894af424",
  "url": "https://osv.dev/vulnerability/RUSTSEC-2026-0333",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "Resource budgets not enforced on the typed deserialization path",
    "summary": "`ParserConfig::max_events`, `max_nodes`, `max_total_scalar_bytes`, `max_merge_keys`, `alias_anchor_ratio` and the alias jump factor were enforced only by the two `Value` loaders. A typed target with a default-shaped configuration is served by the streaming deserializer, which never read those fields, so tightening any of them had no effect on `from_str::` for a struct target. The default document-length, depth and alias-count caps were enforced on every path, so no input was unbounded; the gap affects callers who tightened the other budgets for hostile input. Version 0.0.53 charges every budget on the streaming path as well and adds cross-path parity tests. Users who cannot upgrade can deserialize into `noyalib::Value` first and convert with `from_value`, or rely on `max_document_length` and `max_depth`, which were always applied on every path.",
    "evidence": "osv:RUSTSEC-2026-0333",
    "products": [
      {
        "name": {
          "value": "noyalib",
          "evidence": "/affected/0/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "0.0.53",
            "evidence": "/affected/0/ranges"
          }
        ],
        "affected_versions": []
      }
    ],
    "severity": "unknown",
    "structured": {
      "id": "RUSTSEC-2026-0333",
      "aliases": [
        "GHSA-4xcc-23fx-w2wj",
        "RUSTSEC-2026-0333"
      ],
      "affected": [
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "0.0.0-0"
                },
                {
                  "fixed": "0.0.53"
                }
              ]
            }
          ],
          "package": {
            "name": "noyalib",
            "purl": "pkg:cargo/noyalib",
            "ecosystem": "crates.io"
          },
          "database_specific": {
            "cvss": null,
            "source": "https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0333.json",
            "categories": [
              "denial-of-service"
            ],
            "informational": null
          },
          "ecosystem_specific": {
            "affects": {
              "os": [],
              "arch": [],
              "functions": [
                "noyalib::from_reader",
                "noyalib::from_reader_with_config",
                "noyalib::from_slice",
                "noyalib::from_slice_with_config",
                "noyalib::from_str",
                "noyalib::from_str_with_config"
              ]
            },
            "affected_functions": null
          }
        }
      ],
      "modified": "2026-10-08T15:00:03.204356893Z",
      "provider": "osv",
      "references": [
        "https://crates.io/crates/noyalib",
        "https://rustsec.org/advisories/RUSTSEC-2026-0333.html",
        "https://github.com/sebastienrousseau/noyalib/pull/470"
      ],
      "provider_metadata": {
        "license": "CC-BY-4.0"
      }
    },
    "related_cves": [],
    "security_relevant": true,
    "severity_evidence": null
  },
  "source_id": "core-osv",
  "document_id": 99701,
  "published_at": "2026-10-06T12:00:00+00:00"
}