Snapshot.load accepts a blob from another V8 version, and Context.new then kills the process
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 52/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- javascript, ruby
Direção de pesquisa
Read ext/mini_racer_extension/mini_racer_extension.c around snapshot_load and ext/mini_racer_extension/mini_racer_v8.cc around v8_thread_init, where the blob reaches v8::Isolate::New. Check V8 snapshot header length and section offsets before V8 uses the data, including the truncated-tail case. Done means incompatible or malformed blobs raise MiniRacer::SnapshotError instead of terminating the process; add focused coverage for both reproductions.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Snapshot.load accepts an incompatible snapshot blob, then Context.new terminates the process inside V8. This affects trusted snapshots persisted across upgrades that change libv8-node.
Reproduce
require "mini_racer"
blob = MiniRacer::Snapshot.new("var a = 1").dump.dup
blob.setbyte(16, blob.getbyte(16) ^ 1)
MiniRacer::Context.new(snapshot: MiniRacer::Snapshot.load(blob))
puts "not reached"
Byte 16 is the first byte of the version string in V8 13.6's snapshot header, so flipping it stands in for a blob saved by a different libv8-node.
What happens
#
# Fatal error in , line 0
# Version mismatch between V8 binary and snapshot.
# V8 binary version: 13.6.233.17-node.37
# Snapshot version: 03.6.233.17-node.37
# The snapshot consists of 410911 bytes and contains 1 context(s).
Exit status 133 (SIGTRAP), followed by a native backtrace.
Cutting the last 16 bytes from the blob instead produces no message and exits with status 139 (SIGSEGV). Both cases reproduced in 3 of 3 runs.
Expected
Snapshot.load or Context.new should raise MiniRacer::SnapshotError when the current V8 cannot use the blob.
Cause
snapshot_load only duplicates the supplied String (ext/mini_racer_extension/mini_racer_extension.c:2152, ext/mini_racer_extension/mini_racer_extension.c:2160). v8_thread_init passes the blob to v8::Isolate::New without validating it (ext/mini_racer_extension/mini_racer_v8.cc:451, ext/mini_racer_extension/mini_racer_v8.cc:456). V8 handles a version mismatch with FATAL and invalid section offsets with CHECK, so malformed or stale data ends the process.
Possible fix
Check that the blob is longer than the header, then call v8::StartupData::IsValid() and raise SnapshotError on failure. The length check must come first because IsValid() checks the header bounds fatally. A truncated tail also needs bounds validation for the section offsets because V8 verifies the checksum only in debug builds.
Related: closed PR #101 discussed a version mismatch abort in 2018.
Environment
- mini_racer 0.22.1 with libv8-node 24.12.0.1 (V8 13.6.233.17-node.37)
- Ruby 3.4.2 x86_64-linux
- Fedora 44
Reproduced in 3 of 3 runs.
- Linguagem predominante
- JavaScript
- Estrelas
- 628
- Forks
- 100
- Merge médio
- 1d 20h
- PRs com merge (30d)
- 2
Preparar o ambiente
- Inclui um Dockerfile ou arquivo Docker Compose
- Sem modelo de pull request
- Sem guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de rubyjs/mini_racer
-
bug/crash platform: linux/x86
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 42/100
rubyjs/mini_racer#422 · 10 comentários ·
-
platform: darwin/x86
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
rubyjs/mini_racer#388 · 4 comentários ·
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 20/100
rubyjs/mini_racer#376 ·
-
Load script as moduleAberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
rubyjs/mini_racer#353 ·
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 35/100
rubyjs/mini_racer#346 · 6 comentários · 1 reação ·
Todas as issues de rubyjs/mini_racer
Issues semelhantes
-
[Feature]: 建议导入源后,自动切换到新导入的源Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
lyswhut/lx-music-desktop#3026 ·
-
good first issue server
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 67/100
openstreetmap/iD#13054 ·
Mantenedores costumam responder em até 1 dia
-
community marketing priority: low
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
TMHSDigital/Free-Game-Dev-Assets#151 ·
Mantenedores costumam responder em até 1 dia
-
Read a vector index's quantization back on Neo4j 2026.10, which reports vector.quantization.typeAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
liberation-data/drivine#231 ·
Mantenedores costumam responder em até 1 dia