npm / yaml / 2.9.1

yaml 2.9.1

Source
https://github.com/eemeli/yaml
Tag scanned
v2.9.1
Compared with
v2.9.0 (0 signals introduced since)
Files
136 scanned, 5 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 18 info
Scan time
6.1 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 4 of 4 warn and critical signals; 4 demoted to info.
Disclude version
4.1.0
Scanned (UTC)
2026-10-22 14:30

Signals

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

  1. info warn → info by review dynamic-import src/cli.ts:134:18

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

          const visitor: visitor | null = opt.visit
            ? (await import(resolve(opt.visit))).default
            : null
          let source = ''
    likely benign LLM, confidence 0.80 CLI option that dynamically imports a user-specified visitor module.
    Reasoning

    The specifier is resolve(opt.visit), a path the user passes explicitly to the CLI via a visit option. Loading a user-chosen visitor module is a plugin-style feature, not hidden behavior. The non-literal import is worth a note, but nothing in the snippet shows concealment or an automatic payload.

  2. info warn → info by review dynamic-execution src/schema/yaml-1.1/binary.ts:24:19

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

          // On IE 11, atob() can't handle newlines
          const str = atob(src.replace(/[\n\r]/g, ''))
          const buffer = new Uint8Array(str.length)
          for (let i = 0; i < str.length; ++i) buffer[i] = str.charCodeAt(i)
    dismissed LLM, confidence 0.90 YAML !!binary schema decoder that base64-decodes values into a byte buffer.
    Reasoning

    This is the YAML 1.1 !!binary decoder. atob turns the base64 scalar into bytes, and the code copies those bytes into a Uint8Array. The IE11 newline comment matches a standard compatibility fix. The decoded data is not executed or fetched.

  3. info dynamic-execution src/schema/yaml-1.1/binary.ts:48:13

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

          for (let i = 0; i < buf.length; ++i) s += String.fromCharCode(buf[i])
          str = btoa(s)
        } else {
          throw new Error(
  4. info unicode-surrogate tests/doc/stringify.ts:240:9

    surrogate pair \uD834\uDF06 (non-scalar Unicode codepoints in string literal) (token pass, confidence 0.70)

      })
      test('\uD834\uDF06', () => {
        expect(YAML.stringify('\uD834\uDF06')).toBe('𝌆\n')
      })
  5. info unicode-surrogate tests/doc/stringify.ts:241:28

    surrogate pair \uD834\uDF06 (non-scalar Unicode codepoints in string literal) (token pass, confidence 0.70)

      test('\uD834\uDF06', () => {
        expect(YAML.stringify('\uD834\uDF06')).toBe('𝌆\n')
      })
      test('😀', () => {
  6. info unicode-surrogate tests/doc/stringify.ts:246:9

    surrogate pair \uD83D\uDE00 (non-scalar Unicode codepoints in string literal) (token pass, confidence 0.70)

      })
      test('\uD83D\uDE00', () => {
        expect(YAML.stringify('\uD83D\uDE00')).toBe('😀\n')
      })
  7. info unicode-surrogate tests/doc/stringify.ts:247:28

    surrogate pair \uD83D\uDE00 (non-scalar Unicode codepoints in string literal) (token pass, confidence 0.70)

      test('\uD83D\uDE00', () => {
        expect(YAML.stringify('\uD83D\uDE00')).toBe('😀\n')
      })
      test('\uDF06\uD834', () => {
  8. info unicode-surrogate tests/doc/stringify.ts:249:9

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

      })
      test('\uDF06\uD834', () => {
        expect(YAML.stringify('\uDF06\uD834')).toBe('"\\udf06\\ud834"\n')
      })
  9. info unicode-surrogate tests/doc/stringify.ts:249:15

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

      })
      test('\uDF06\uD834', () => {
        expect(YAML.stringify('\uDF06\uD834')).toBe('"\\udf06\\ud834"\n')
      })
  10. info unicode-surrogate tests/doc/stringify.ts:250:28

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

      test('\uDF06\uD834', () => {
        expect(YAML.stringify('\uDF06\uD834')).toBe('"\\udf06\\ud834"\n')
      })
      test('\uDEAD', () => {
  11. info unicode-surrogate tests/doc/stringify.ts:250:34

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

      test('\uDF06\uD834', () => {
        expect(YAML.stringify('\uDF06\uD834')).toBe('"\\udf06\\ud834"\n')
      })
      test('\uDEAD', () => {
  12. info unicode-surrogate tests/doc/stringify.ts:250:52

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

      test('\uDF06\uD834', () => {
        expect(YAML.stringify('\uDF06\uD834')).toBe('"\\udf06\\ud834"\n')
      })
      test('\uDEAD', () => {
  13. info unicode-surrogate tests/doc/stringify.ts:250:59

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

      test('\uDF06\uD834', () => {
        expect(YAML.stringify('\uDF06\uD834')).toBe('"\\udf06\\ud834"\n')
      })
      test('\uDEAD', () => {
  14. info unicode-surrogate tests/doc/stringify.ts:252:9

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

      })
      test('\uDEAD', () => {
        expect(YAML.stringify('\uDEAD')).toBe('"\\udead"\n')
      })
  15. info unicode-surrogate tests/doc/stringify.ts:253:28

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

      test('\uDEAD', () => {
        expect(YAML.stringify('\uDEAD')).toBe('"\\udead"\n')
      })
    })
  16. info unicode-surrogate tests/doc/stringify.ts:253:46

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

      test('\uDEAD', () => {
        expect(YAML.stringify('\uDEAD')).toBe('"\\udead"\n')
      })
    })
  17. info warn → info by review encoding-base64 tests/doc/types.ts:515: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 |
     R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
    dismissed LLM, confidence 0.93 Base64 sample data inside a YAML documentation/test fixture for !!binary.
    Reasoning

    The blob sits inside a YAML test fixture for the !!binary tag. It is a sample GIF/MIME payload used to test parsing, a legitimate test-data pattern. The raw-pass base64 heuristic fires on expected content.

  18. info warn → info by review encoding-base64 tests/doc/types.ts:544:3

    base64-like blob (77 bytes, compression ratio 1.14) (raw pass, confidence 0.60)

      +fn5OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/\\
      ++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuNAFOhpEMTRiggcz4BN\\
      JHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="
    generic: !!binary |-
    dismissed LLM, confidence 0.93 Multi-line base64 sample in a YAML !!binary test fixture.
    Reasoning

    This is another !!binary test fixture in a YAML types test file, with the same base64 sample content as the neighboring case. The raw-pass hit is an expected feature of the test data and shows no malicious intent.

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/eemeli/yaml yaml && cd yaml
git checkout v2.9.1
disclude scan --severity info --diff v2.9.0 .