Decoder accepts indefinite-length items

Aperta
#230 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
58/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Tranquilla
Stack tecnologico
javascript, node.js
Ambito
backend, security

Direzione di ricerca

Start by tracing the decoder path used by decodeFirstSync and how it handles indefinite-length items; compare that behavior with the encoder’s output and the CBOR specification linked in the issue. Add coverage for the supplied byte sequence and verify that decoding rejects it in strict or canonical mode, while checking existing tests for any intended lenient behavior.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Summary

RFC 8949 section 4.2.1 forbids indefinite-length items in the deterministic encoding profile, and DAG-CBOR forbids them outright, because the same value then has more than one valid encoding.

Specification: https://ipld.io/specs/codecs/dag-cbor/spec/

Problem

node-cbor accepts an input that its own encoder would
never produce
. Decoding the witness below succeeds, and re-encoding the
decoded value with the same library yields different bytes. The library is
therefore not the inverse of itself on this input, so two peers that disagree
about whether to accept it will disagree about the value's encoding, and any
system that treats the encoding as identifying (content addressing, signature
preimages, deduplication) can be made to see two encodings of one value.

Version tested: cbor 10.0.12

Reproduction

import cbor from 'cbor';
const buf = Buffer.from('bf617007617007ff', 'hex');
const v = cbor.decodeFirstSync(buf);
const re = Buffer.from(cbor.encodeOne(v));
console.log('input   :', buf.toString('hex'));
console.log('decoded :', JSON.stringify(v, (_k, x) => typeof x === 'bigint' ? x.toString() : x));
console.log('re-encode:', re.toString('hex'));
console.log(re.equals(buf) ? 'ROUNDTRIP-STABLE' : 'REENCODE-DIFFERS');

Observed output:

input   : bf617007617007ff
decoded : {"p":7}
re-encode: a1617007
REENCODE-DIFFERS

The re-encoding differs from the input, which is the defect.

Expected behavior

The decoder should reject this input rather than accept it, because the
encoding is not the canonical one for the decoded value. A canonical encoding of the same value is 07, which round-trips byte-identically.

Suggested fix

Reject the indefinite-length initial byte outright when decoding, rather than
assembling the chunks into a definite-length value. A strict/canonical decode
mode is the usual place for this if the lenient behaviour must stay available.

Lingua principale
JavaScript
Stelle
379
Fork
73
Merge medio
7m
PR unite (30g)
1

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

  • Nessun Dockerfile né file Docker Compose
  • Nessun modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di hildjj/node-cbor

Tutte le issue di hildjj/node-cbor

Issue simili

Altre issue su JavaScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.