Snapshot.load accepts a blob from another V8 version, and Context.new then kills the process
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 52/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- javascript, ruby
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- JavaScript
- Stelle
- 628
- Fork
- 100
- Merge medio
- 1g 20h
- PR unite (30g)
- 2
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di rubyjs/mini_racer
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
rubyjs/mini_racer#449 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
rubyjs/mini_racer#450 ·
-
bug/crash platform: linux/x86
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
rubyjs/mini_racer#422 · 10 commenti ·
-
platform: darwin/x86
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
rubyjs/mini_racer#388 · 4 commenti ·
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
rubyjs/mini_racer#376 ·
Tutte le issue di rubyjs/mini_racer
Issue simili
-
ew
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
I maintainer di solito rispondono entro 1 giorno
-
priority: medium status: needs-decision work-class: scoped
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
melodic-software/claude-code-plugins#9339 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
bug-report bug-report-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
Codeinwp/templates-patterns-collection#539 ·
I maintainer di solito rispondono entro 1 giorno
-
建议增加URL参数构建的工具Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
-
[Bug] dsh 0.2.1 返回 session/not-found 时 sessionExists 不重建会话,消息恒失败并被误报为 INTERNAL_UNKNOWNForse già presa @ANIIAN91 l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
xmanrui/dsh-im#444 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno