npm / js-yaml / 5.5.0

js-yaml 5.5.0

Source
https://github.com/nodeca/js-yaml
Tag scanned
5.5.0
Compared with
5.4.3 (4 signals introduced since)
Files
120 scanned, 7 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 20 info
Scan time
6.4 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 9 of 9 warn and critical signals; 9 demoted to info.
Disclude version
4.1.0
Scanned (UTC)
2026-10-22 11:42

Signals

Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.

  1. info unicode-surrogate test/core/common/tagname.test.mjs:76:46 new in this release

    orphaned high surrogate \uD800 (no matching low surrogate) (token pass, confidence 0.65)

      it('does not throw on malformed encodings', () => {
        assert.doesNotThrow(() => tagNameShort('!\uD800'))
        assert.doesNotThrow(() => tagNameFull('!%FF'))
        assert.doesNotThrow(() => parseEvents('!%FF value'))
  2. info unicode-surrogate test/core/units/load-error.test.mjs:192:21 new in this release

    orphaned low surrogate \uDC00 (no preceding high surrogate) (token pass, confidence 0.65)

        assertMark('a: b\r\n  c\x01', 9, 1, 3)
        assertMark('a: x\udc00', 4, 0, 4)
        assertMark('a: \udc00', 3, 0, 3)
        assertMark('a: x\ud800', 4, 0, 4)
  3. info unicode-surrogate test/core/units/load-error.test.mjs:193:20 new in this release

    orphaned low surrogate \uDC00 (no preceding high surrogate) (token pass, confidence 0.65)

        assertMark('a: x\udc00', 4, 0, 4)
        assertMark('a: \udc00', 3, 0, 3)
        assertMark('a: x\ud800', 4, 0, 4)
      })
  4. info unicode-surrogate test/core/units/load-error.test.mjs:194:21 new in this release

    orphaned high surrogate \uD800 (no matching low surrogate) (token pass, confidence 0.65)

        assertMark('a: \udc00', 3, 0, 3)
        assertMark('a: x\ud800', 4, 0, 4)
      })
  5. info warn → info by review dynamic-import benchmark/benchmark.mjs:18:22

    dynamic `import(...)` with a non-literal specifier (ast pass, confidence 0.65)

      const filepath = new URL(`./implementations/${name}/index.mjs`, import.meta.url)
      const code = await import(filepath)
    
      IMPLS.push({ name, code })
    likely benign LLM, confidence 0.80 Benchmark loader dynamically imports local implementation modules by name.
    Reasoning

    Dynamic import with a template-built path is a benchmark harness loading its own bundled implementations by name; the path is local and not attacker-controlled in this context.

  6. line length 806 characters (raw pass, confidence 0.50)

    "\x28\x72\x5A\xD2\x26\x72\xCD\xBB\x3D\x9B\xB6\x88\x1F\x33\x25\x0C\x19\x7A\x87\xD7\x95\x2D\x22\xB3\x9A\x05\x9A\x26\x49\x37\x71\xF5\x5F\xF4\x80\x9E\xB8\xE9\x81\xDB\xC8\xBE\x87\x23\x22\x99\x82\x2A\xF3\x9A\xBE\x5E\x86\x5E\x63\x6A\xC0\x7E\xF4\xB6\xA3\x0F\xD2\xE3\xCD\x22\xB9\x51\xF7\x43\x3F\x9A\x79\xFD\x5A\x16\xC3\x52\xD9\x5
  7. info warn → info by review encoding-escape-soup benchmark/samples/scalar_double_quoted_binary_01.yaml:1:2

    201 consecutive `\xNN` escapes (entropy 6.9 bits/byte) (raw pass, confidence 0.80)

    "\x28\x72\x5A\xD2\x26\x72\xCD\xBB\x3D\x9B\xB6\x88\x1F\x33\x25\x0C\x19\x7A\x87\xD7\x95\x2D\x22\xB3\x9A\x05\x9A\x26\x49\x37\x71\xF5\x5F\xF4\x80\x9E\xB8\xE9\x81\xDB\xC8\xBE\x87\x23\x22\x99\x82\x2A\xF3\x9A\xBE\x5E\x86\x5E\x63\x6A\xC0\x7E\xF4\xB6\xA3\x0F\xD2\xE3\xCD\x22\xB9\x51\xF7\x43\x3F\x9A\x79\xFD\x5A\x16\xC3\x52\xD9\x5
    likely benign LLM, confidence 0.85 YAML parser test sample containing a long hex-escaped binary string.
    Reasoning

    This is a YAML test sample of a binary scalar written as hex escapes, which is expected for a YAML parser's binary tag test data, not an obfuscated payload.

  8. info warn → info by review long-line benchmark/samples/scalar_double_quoted_binary_02.yaml:1:1

    line length 12006 characters (raw pass, confidence 0.65)

    "\x0C\xB7\x50\x70\x7E\xF5\xAB\x7D\x68\xFE\xB7\x87\xC9\x5C\x7E\xD3\x99\xF1\xC6\xC3\x4D\x7D\x94\x55\x56\x1D\xA5\xA3\xA0\xC8\xF5\x62\x15\xD3\x3A\x65\x1A\x6C\x68\x1A\x0F\x20\x2D\x0A\xD0\x57\x74\x5B\x38\xD5\xE4\x4F\x9B\x39\x60\xC4\x4A\x80\x87\xB4\x11\x81\x33\xB5\xBA\x70\xFC\x79\x8A\x5D\xB4\x4C\xC0\xB4\xEA\x9B\x1B\xBD\x6A\x6
    likely benign LLM, confidence 0.85 Long YAML benchmark fixture line of binary-escaped data.
    Reasoning

    Long line of binary escape data in a YAML benchmark sample; the length is inherent to the test fixture's purpose.

  9. info warn → info by review encoding-escape-soup benchmark/samples/scalar_double_quoted_binary_02.yaml:1:2

    3001 consecutive `\xNN` escapes (entropy 7.9 bits/byte) (raw pass, confidence 0.80)

    "\x0C\xB7\x50\x70\x7E\xF5\xAB\x7D\x68\xFE\xB7\x87\xC9\x5C\x7E\xD3\x99\xF1\xC6\xC3\x4D\x7D\x94\x55\x56\x1D\xA5\xA3\xA0\xC8\xF5\x62\x15\xD3\x3A\x65\x1A\x6C\x68\x1A\x0F\x20\x2D\x0A\xD0\x57\x74\x5B\x38\xD5\xE4\x4F\x9B\x39\x60\xC4\x4A\x80\x87\xB4\x11\x81\x33\xB5\xBA\x70\xFC\x79\x8A\x5D\xB4\x4C\xC0\xB4\xEA\x9B\x1B\xBD\x6A\x6
    likely benign LLM, confidence 0.85 Benchmark fixture with a very long run of hex escapes representing binary data.
    Reasoning

    Same benchmark fixture; the escape run is the intended binary test payload for a YAML parser and is not executed or decoded into code.

  10. info warn → info by review long-line benchmark/samples/scalar_double_quoted_escaped_02.yaml:1:1

    line length 3443 characters (raw pass, confidence 0.65)

    "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nDonec a diam lectus. Sed sit amet ipsum mauris.\nMaecenas congue ligula ac quam viverra nec consectetur ante hendrerit.\tDonec et mollis dolor.\0Praesent et diam eget libero egestas mattis sit amet vitae augue.\NNam tincidunt congue enim, ut porta lorem lacinia
    likely benign LLM, confidence 0.85 YAML benchmark fixture with long lorem-ipsum escaped string.
    Reasoning

    Lorem ipsum text with standard escape sequences in a YAML test fixture; long line is just generated filler.

  11. info warn → info by review long-line benchmark/samples/scalar_double_quoted_simple_02.yaml:1:1

    line length 3352 characters (raw pass, confidence 0.65)

    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia cons
    likely benign LLM, confidence 0.90 YAML benchmark fixture with long plain lorem-ipsum string.
    Reasoning

    Plain lorem ipsum text in a single long YAML line; generated benchmark data with no obfuscation.

  12. info warn → info by review dynamic-execution src/tag/scalar/binary.ts:10:18

    `atob` decodes a base64 value at runtime — common step before dynamic fetch or eval (ast pass, confidence 0.75)

    
      const binary = atob(input)
      const result = new Uint8Array(binary.length)
      for (let index = 0; index < binary.length; index++) {
    likely benign LLM, confidence 0.80 YAML binary tag implementation decoding base64 with atob.
    Reasoning

    This is a YAML !!binary tag decoder using atob to convert base64 into bytes; decoding base64 to a Uint8Array is its legitimate function, not dynamic execution.

  13. info dynamic-execution src/tag/scalar/binary.ts:23:10

    `btoa` encodes a value as base64 at runtime — used in exfiltration patterns (ast pass, confidence 0.55)

      }
      return btoa(binary)
    }
  14. line length 593 characters (raw pass, confidence 0.50)

              <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.
  15. info dynamic-execution support/demo_template/index.mjs:17:10

    `btoa` encodes a value as base64 at runtime — used in exfiltration patterns (ast pass, confidence 0.55)

    function encodeBase64 (str) {
      return btoa(String.fromCharCode(...new TextEncoder().encode(str)))
    }
  16. info warn → info by review dynamic-execution support/demo_template/index.mjs:21:51

    `atob` decodes a base64 value at runtime — common step before dynamic fetch or eval (ast pass, confidence 0.75)

    function decodeBase64 (str) {
      return new TextDecoder().decode(Uint8Array.from(atob(str), (char) => {
        return char.charCodeAt(0)
      }))
    likely benign LLM, confidence 0.80 Demo helper that base64-decodes a string to UTF-8 text.
    Reasoning

    A small helper decoding base64 into a string via TextDecoder in a demo template; no eval or fetch of the decoded content is shown.

  17. info warn → info by review encoding-base64 test/core/tags/binary.test.mjs:16:2

    base64-like blob (62 bytes, compression ratio 1.18) (raw pass, confidence 0.60)

     +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\\
     AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="
    
    generic: !!binary |
    likely benign LLM, confidence 0.90 Base64 binary test fixture for the YAML !!binary tag.
    Reasoning

    Base64 blob in a YAML !!binary test, whose content decodes to a GIF-like test asset ('Made with GIMP'); expected test data rather than a hidden payload.

  18. U+FEFF ZERO WIDTH NO-BREAK SPACE (BOM) in source (in string/comment) (raw pass, confidence 0.45)

          // BOM sits in the printable range but is excluded, so it must be escaped.
          assert.strictEqual(dump('a⟨U+FEFF⟩b'), '"a\\uFEFFb"\n')
        })
  19. orphaned low surrogate \uDC00 (no preceding high surrogate) (token pass, confidence 0.65)

      it('forbid lone surrogates', () => {
        assert.throws(() => { load('\udc00\ud800') }, YAMLException)
      })
  20. orphaned high surrogate \uD800 (no matching low surrogate) (token pass, confidence 0.65)

      it('forbid lone surrogates', () => {
        assert.throws(() => { load('\udc00\ud800') }, YAMLException)
      })

Reproduce This Scan

Run disclude locally to verify. Add --format sarif for SARIF output. Add --llm (with an API key in the environment) to include the LLM review.

cargo install disclude --version 4.1.0
git clone https://github.com/nodeca/js-yaml js-yaml && cd js-yaml
git checkout 5.5.0
disclude scan --severity info --diff 5.4.3 .