`JSON.dump(obj, io)` e `JSON::State#generate(obj, io)` podem escrever além do buffer interno do gerador JSON quando um objeto streamed contém uma string controlada pelo atacante perto 16 KB. O problema é um monte de gravação fora de limites no caminho de transmissão de IO e é demonstrado como um crash de processo confiável / negação de serviço. Isto foi triado no HackerOne como relatório # 3785370. O problema foi confirmado e me foi pedido que abrisse aqui. A causa da raiz está no `ext/json/ fbuffer/ fbuffer.h`, `fbuffer_do_inc_capa()`. No caminho IO, o buffer é criado para `FBUFFER_IO_BUFFER_SIZE` ( 16383 ), mas o retorno precoce verifica a capacidade total em vez da capacidade restante:.

```c if (RB_UNLIKELY(fb->io)) { if (fb->capa < FBUFFER_IO_BUFFER_ SIZARE) { fbuffer_relaloc( fb, FBUFFER_IO_BUFFER_ SIZARERE); } senão { fbuffer_ flush( fb); } se (RB_LIKELY(pedido capa)) { retorna; } } } ```. Se ` fb->len` já contém bytes da sintaxe JSON, e um flush de string tem ` 16383 - fb->len <= solicitado < 16383 `, esta verificação retorna mesmo não havendo espaço suficiente. ` fbuffer_ append_reserved()`, em seguida, escreve além do buffer: ```c MEMCPY( fb->ptr + fb->len, newstr, char, len); ```. A correção mínima é comparar com a capacidade restante: ``` diff - se (RB_LIKELY(pedido capa)) { + se (RB_LIKELY(pedido capa - fb->len)) { retorno; } ```.

````ruby requer "json" requer "stringio". io = StringIO.novo grande = "a" * 16385 grande[ 16382 ] = '"' # byte escapável perto do limite do buffer JSON.dump([grande], io) ```. ``` Texto Ruby 4.0.5 / json agrupado 2.18.0: malloc(): tamanho inválido (não triado).../ json/common.rb: 956: [BUG] Abortado mestre ruby/ruby c 78418 b 7 a 0 / json 2.19.8 / ASan: WRITE de tamanho de sobrefluxo de pilhas- buffer 16382 fbuffer_ append_ reservado ext/json/fbuffer/ fbuffer.h: 145 search_flush ext/json/generator/generator.c: 139 converter_UTF 8 _to_JSON ext/json/generator/generator.c: 231 raw_generate_json_string ext/json/generator/generator.c: 922 cState_ m_ gerar ext/ json/generator/generator.c: 1891 ``` Controle: os mesmos dados através de `JSON.dump([big])` sem um argumento IO retorna normalmente. O erro é específico para o caminho de transmissão de IO.

Um atacante remoto pode ativar uma gravação de um monte fora de limites se controlar um campo de string que um aplicativo serializa através de `JSON.dump(obj, io)' ou `JSON::State#generate(obj, io)'. O impacto demonstrado é uma negação de serviço confiável. Não estou reclamando a execução de código ou divulgação de informações. Registro de aconselhamento: GHSA-x 2 f 5 - 4 prf- w 687. Identificadores relacionados: CVE- 2026 - 54696. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 23 T 19: 48: 08.000 Z e lista a sua última modificação como 2026 - 07 - 23 T 19: 48: 08.000 Z.

Severidade: LOW. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L. Software afetado e informações de versão: pacote RubyGems json — ECOSISTEM: introduzido 2.9.0, corrigido 2.19.9. Classificação e evidência: identificadores de fraqueza CWE- 122, CWE- 131, CWE- 787. O registro contém 6 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.