Chrome · V8
CVE-2025-10585
Type Confusion in V8
Overview
High
Severity
—
CVSS
Yes
Exploited ITW
Fixed
Fix Status
Changed Functions
| Function | Change | Notes |
|---|---|---|
switchsrc/compiler/backend/arm64/instruction-selector-arm64.cc |
modified |
Files Changed
src/compiler/backend/arm64/instruction-selector-arm64.cc
Patch
From ec6c184783824fa8f974013aae28a45c36c0112f Mon Sep 17 00:00:00 2001 From: Darius Mercadier <[email protected]> Date: Tue, 16 Sep 2025 16:40:24 +0200 Subject: [PATCH] [compiler] Don't assume that upper 32-bit of Int32MulOvfCheck are 0 Because Arm64 doesn't have a flag-setting 32-bit multiplication, which means that instead with use a 64-bit multiplication, and compare result.X() and result.W() to check if an overflow happened. But this leads to the upper 32-bit not being zeroed. Fixed: 445380761 Change-Id: I31287faf37dc615695047021324e9d1d802cbec2 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6954290 Auto-Submit: Darius Mercadier <[email protected]> Commit-Queue: Leszek Swirski <[email protected]> Reviewed-by: Leszek Swirski <[email protected]> Cr-Commit-Position: refs/heads/main@{#102530} --- diff --git a/src/compiler/backend/arm64/instruction-selector-arm64.cc b/src/compiler/backend/arm64/instruction-selector-arm64.cc index 2b6d584..0aad1ef 100644 --- a/src/compiler/backend/arm64/instruction-selector-arm64.cc +++ b/src/compiler/backend/arm64/instruction-selector-arm64.cc @@ -2973,9 +2973,19 @@ return op.Cast<ShiftOp>().rep == WordRepresentation::Word32(); case Opcode::kComparison: return op.Cast<ComparisonOp>().rep == RegisterRepresentation::Word32(); - case Opcode::kOverflowCheckedBinop: - return op.Cast<OverflowCheckedBinopOp>().rep == - WordRepresentation::Word32(); + case Opcode::kOverflowCheckedBinop: { + const OverflowCheckedBinopOp& binop = op.Cast<OverflowCheckedBinopOp>(); + if (binop.rep != WordRepresentation::Word32()) return false; + switch (binop.kind) { + case OverflowCheckedBinopOp::Kind::kSignedAdd: + case OverflowCheckedBinopOp::Kind::kSignedSub: + return true; + case OverflowCheckedBinopOp::Kind::kSignedMul: + // EmitInt32MulWithOverflow doesn't zero-extend because Arm64 doesn't + // have a flag-setting int32 multiplication. + return false; + } + } case Opcode::kProjection: return ZeroExtendsWord32ToWord64NoPhis(op.Cast<ProjectionOp>().input()); case Opcode::kLoad: {
Loading diff…
Original Bug Report
The reporter's bug is still restricted on the tracker. Chrome de-restricts security bugs ~30–90 days after the fix ships; a later run will backfill it here.
References
On This Page