Reader Exif 4.40.0 pode lançar um `Erro de Alcance: O offset está fora dos limites do DataView` enquanto analisa os arquivos HEIC/AVIF criados. O arquivo só precisa de uma caixa de `ftyp` válida com uma marca principal HEIC/AVIF seguida de uma caixa ISO-BMFF mal formada, como uma caixa vazia 8 -byte caixa ` livre` ou uma caixa de tamanho estendido truncado. Isto é alcançável através da API pública `ExifReader.load()` para buffers em memória e através dos carregadores de arquivo async/URL quando um aplicativo analisa imagens fornecidas pelo atacante. Em aplicativos que não enrolam todos os pars em uma tentativa/ captura defensiva, uma única imagem carregada ou recuperada pode abortar o pedido/ trabalhador e causar uma negação de serviço. Crédito solicitado: Yaohui Wang.
Versão afetada testada. - pacote npm: `exifreader` - Versão: ` 4.40.0 ` - Commit de repositório testado: ` 8 cb 0261 a 26 b 7 d 986955 fe 0 a 6780 f 076 dcb 7902 e 7 ` O analisador ISO-BMFF assume que cada caixa de nível superior com pelo menos um 8 -byte header também tem bytes suficientes para os campos necessários pela sua forma analisada. Em `src/image-header-iso- bmff.js`: - ` FindMetaBox()` chama `parseBox(dataView, offset)` enquanto apenas verifica que `offset + 8 <= dataView.byteLength`. - `parseBox()` chama `getBoxLength()` e então lê incondicionalmente campos como o byte de versão de caixa completa para caixas `meta`/`iloc`/`iinf`/`idat`. - `getBoxLength()` manipula `boxLength' === 1 ` chamando `hasEmptyHighBits(dataView, offset)`, que lê `dataView.getUint 32 (compensação + 8 )` sem verificar primeiro que o 64 - o campo de tamanho estendido bit está presente.
Como resultado, caixas sintáticamente pequenas ou truncadas após uma caixa HEIC/AVIF `ftyp` válida escapam dos blocos de captura de detecção de formato e lançam do caminho de análise principal. Execute isto a partir da raiz do repositório contra o pacote `dist/exif-reader.js' comprometido: ```js const ExifReader = require('./ dist/ exif-reader.js'). função u 32 be(n) { retorna [(n >>> 24 ) & 255, (n >>> 16 ) & 255, (n >>> 8 ) & 255, n & 255 ]; } função ascii { devolver Array.from(Buffer.from(s, 'ascii')); } função caixa(tipo, conteúdo = []) { devolver [...u 32 be( 8 + conteúdo. comprimento),...ascii(tipo),... conteúdo]; }.
para (marca const de ['heic', 'avif']) { para (caixa const de ('livre', 'abcd']) { bytes const = Uint 8 Array.from([...box('ftyp', ascii(brand)),...box(badbox), // 8 -byte caixa cabeçalho sem conteúdo ]); Tentar { ExifReader. load(bytes.buffer); console.log(`${brand}/${badBox}: no lance`); } pegar (e) { console.log(`${brand}/${badBox}: ${e. name}: ${e.message}`); console.log(String( e. stack). split('\n'). slice('\n'). 0, 6 ).join( '\n')); } } } ``` Saída observada no nó v 23.11.0 com o ExifReader 4.40.0. ``` text heic/free: GamaErro: Desvio está fora dos limites do DataView GamaErro: Desvio está fora dos limites do DataView no DataView.prototype.getUint 8 ( ) no parseBox (.../ dist/ exif-reader.js: 1: 16513 ) no findMetaBox (.../ dist/ exif- Reader.js: 1: 19032 ) no findOffsets (.../ dist/ exif-reader.js: 1: 19101 ).
heic/ abcd: GamaErro: Desvio está fora dos limites do DataView avif/ livre: GamaErro: Desvio está fora dos limites do DataView avif/ abcd: GamaErro: Desvio está fora dos limites do DataView ``` Uma segunda variante desencadeia o caminho de tamanho estendido. ```js const truncadoExtendedBox = [...u 32 be( 1 ),...ascii('livre')]; const heic = Uint 8 Array.from([...box('ftyp', ascii('heic')),...truncadoExtendedBox]); ExifReader. load(heic.buffer); ``` Isso é lançado a partir de `hasEmptyHighBits()` / `getBoxLongth()` porque os campos de tamanho estendido alto/ baixo não estão presentes.
Comportamento esperado. As caixas de metadados malformados/truncados devem ser manipuladas como outros metadados malformados no projeto: retorna apenas o tipo/ metadado de arquivo analisado com sucesso, não retorna nenhum marcador de aplicativo ou lança um erro controlado específico do projeto. Um erro de limites JavaScript seguro não deve escapar do analisador para um recipiente de imagens controlado pelo atacante. Este é um problema de negação de serviço para serviços que analisam arquivos HEIC/AVIF fornecidos pelo usuário com ExifReader. Um buffer de imagem controlado pelo atacante mínimo pode causar uma exceção não manipulada no analisador e abortar o pedido/operário ao redor se o aplicativo de incorporação não captar todos os erros de análise. Severidade sugerida: Médio. CVSS sugerido: `CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L`.
Adicione limites explícitos antes de cada 'DataView' lida no analisador de caixa ISO- BMFF, especialmente: - antes de ler o 64 - campos de tamanho estendido em bits em `getBoxLength()`; - antes de ler o byte de versão de caixa completa em `parseBox()'; - antes de descer para `parseSubBoxes()` quando um comprimento de caixa declarado excede os bytes disponíveis; - certifique- se de que ` encontrarMetaBox()` quebra em caixas cujo comprimento declarado é inválido ou não está totalmente presente. Um teste de regressão deve cobrir `ftyp/heic` e `ftyp/avif` seguido de um 8 -byte vazio caixa `free`/ desconhecido e por uma caixa de tamanho estendido truncado.
Registro de aconselhamento: GHSA- g 77 h- 45 rf-hcx 4. Identificadores relacionados: CVE- 2026 - 53496. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 17 T 20: 19: 39.000 Z e lista a sua última modificação como 2026 - 07 - 17 T 20: 19: 39.000 Z. Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L.
Informações sobre software e versão afetadas: exifreader de pacote npm — ECOSISTEM: introduzido 0, corrigido 4.40.1. Classificação e evidência: identificadores de fraqueza CWE- 248, CWE- 755. O registro contém 3 suporte de referências nestes tipos: WEB, PACKAGE.