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
4.6 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 4 of 4 warn and critical signals; 4 demoted to info.
Disclude version
4.0.0
Scanned (UTC)
2026-10-14 19:25

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 A CLI option dynamically imports a user-specified visitor module.
    Reasoning

    The import specifier is `resolve(opt.visit)`, a user-supplied CLI option for loading a visitor module. Loading a user-chosen plugin file is a deliberate feature, not hidden execution. The file is user-controlled rather than fetched from the network or decoded from data, so it is a minor supply-chain consideration at most.

  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)
    likely benign LLM, confidence 0.90 atob decodes base64 for the YAML 1.1 !!binary tag.
    Reasoning

    This is the standard YAML !!binary decoder. The comment about IE 11 and newlines shows it is a deliberate browser-compatibility step. The decoded bytes are only converted to a Uint8Array, not evaluated 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
    likely benign LLM, confidence 0.90 A base64 GIF sample inside a YAML binary-type test fixture.
    Reasoning

    This is a YAML test fixture for the !!binary tag. The blob decodes to a GIF header (GIF89a) followed by test data, which is expected content for a binary-type test. The raw pass has a high false-positive rate for base64 in test data.

  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 |-
    likely benign LLM, confidence 0.90 A multi-line base64 GIF sample in a YAML binary test fixture.
    Reasoning

    This is another YAML !!binary test fixture with the same GIF-style base64 content, split across lines. It is test data for the YAML parser and shows no sign of obfuscated payload.

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