Разработчик Firefox перепутал два символа — и подарил хакерам RCE-уязвимость в движке JavaScript
NewsMakerКак один неправильный символ довел Mozilla до истерики.
В движке JavaScript SpiderMonkey, который используется в Mozilla Firefox, нашли критическую уязвимость удалённого выполнения кода (RCE) . Источник оказался почти анекдотическим: одна опечатка в один символ в коде сборщика мусора для WebAssembly, где разработчик поставил побитовое AND & вместо побитового OR |.
Ошибка находилась в реализации сборки мусора WebAssembly и появилась после рефакторинга метаданных массивов WebAssembly. Уязвимость внесли коммитом fcc2f20e35ec от 19 января 2026 года в файле js/src/wasm/WasmGcObject.cpp. Проблемная строка выглядела так:
В движке JavaScript SpiderMonkey, который используется в Mozilla Firefox, нашли критическую уязвимость удалённого выполнения кода (RCE) . Источник оказался почти анекдотическим: одна опечатка в один символ в коде сборщика мусора для WebAssembly, где разработчик поставил побитовое AND & вместо побитового OR |.
Ошибка находилась в реализации сборки мусора WebAssembly и появилась после рефакторинга метаданных массивов WebAssembly. Уязвимость внесли коммитом fcc2f20e35ec от 19 января 2026 года в файле js/src/wasm/WasmGcObject.cpp. Проблемная строка выглядела так:
oolHeaderOld->word = uintptr_t(oolHeaderNew) & 1; Хотя по смыслу должна была быть: oolHeaderOld->word = uintptr_t(oolHeaderNew) | 1; Разница между & и | здесь принципиальная. | 1 выставляет младший бит в 1, то есть помечает значение. & 1, наоборот, оставляет только младший бит, а все остальные обнуляет. Дальше сработала особенность выравнивания указателей в памяти: адреса объектов, как правило, кратны 2 (и чаще кратны 8 или 16), поэтому младший бит у них равен 0. В результате выражение uintptr_t(oolHeaderNew) & 1 почти всегда давало 0. Вместо «указателя с меткой» в поле заголовка записывался ноль.