data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-90288 in the interactive tracker

CVE-2026-90288

phy: renesas: rcar-gen2: Fix double of_node_put on phy creation failure

7.4 EPSS 0.2% AV:L

Published 2026-09-17 (31 days ago) by the Linux kernel CNA. Subsystem drivers/phy. Debian urgency: unimportant.

Debian does not build this code. The per-release build detail is under "Where it lives" below.

What to do, per Debian release

Debian's own status for CVE-2026-90288 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormnot affected6.1.190-1Nothing to do. bookworm never shipped the vulnerable code.
Debian 13trixienot affected6.12.113-1Nothing to do. trixie never shipped the vulnerable code.
Debian 14forkyfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

for_each_child_of_node_scoped() releases the node reference on scope exit, so the explicit of_node_put(np) in the devm_phy_create() error path drops it twice. Drop the redundant of_node_put() and let the scoped cleanup handle it.

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

drivers/phy/renesas/phy-rcar-gen2.c

What this is
GENERIC PHY FRAMEWORKMAINTAINERS section matched on drivers/phy/ · linux-phy@lists.infradead.org · Supported
Kernel module
none to look for. The file would have gone into phy_rcar_gen2, and Debian does not compile it into that module, so finding phy_rcar_gen2 in lsmod would say nothing about this CVE.

Check it on the machine

grep -wE 'CONFIG_GENERIC_PHY|CONFIG_PHY_RCAR_GEN2' /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

Show whether Debian builds this, per release

Debian does not build this code. In 4 releases below, every kernel flavour Debian publishes has the switch off, so the vulnerable file is compiled into no kernel binary Debian ships.

  • bookworm, trixie, forky, sidn
n
not enabled on any flavour - this release does not build the code
Build switches
CONFIG_GENERIC_PHY, CONFIG_PHY_RCAR_GEN2
Reads as
all on means the file is compiled; any one off means it is not.

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2026-09-17 (31 days ago)source
CVSS
7.4 high
CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.15%, higher than 4.1% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
unimportantsource
Subsystem
drivers/phy

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
7.07.2.65374f3d53376
7.07.3b780b8929c75

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:LAttack vector, local
The extra of_node_put(np) runs only in rcar_gen2_phy_probe() after a failed devm_phy_create() on a usb-phy@0/@2 child, reached via platform_probe() when the renesas,rcar-gen2-usb-phy device (usb-phy-controller@e6590100) is bound from DT; USB transfers and network packets never enter this probe.
AC:HAttack complexity, high
The double put runs only when phy_create() fails inside rcar_gen2_phy_probe() (kzalloc/ida_alloc/devres_alloc ENOMEM, regulator_get_optional("phy") -EPROBE_DEFER, or device_add failure). Those GFP_KERNEL/sysfs failures are not attacker-controlled, and of_node_put() is a no-op unless CONFIG_OF_DYNAMIC is enabled.
PR:NPrivileges required, none
rcar_gen2_phy_probe() has no capable() check; with PHY_RCAR_GEN2=y (shmobile_defconfig) platform_probe() binds usb-phy-controller@e6590100 during kernel init on boards that set &usbphy { status = "okay" }, so the failed-create path needs no user account. Sysfs bind is 0200 root-only but is not required for that boot path.
UI:NUser interaction, none
Lager, Koelsch, Porter, Silk, and iwg23s-sbc enable &usbphy/&usbphy0 in DT, so of_platform populate plus platform_probe() run rcar_gen2_phy_probe() unattended at boot; no mount, open, or USB plug-in is required to hit the devm_phy_create() error path.
S:UScope, unchanged
kobject_cleanup() of the still-attached usb-phy@0 device_node and the extra put on its parent usb-phy-controller node occur in host kernel OF/kobject code; this is not a KVM/Xen escape or IOMMU/DMA bypass.
C:HConfidentiality impact, high
When the second of_node_put(np) drops the usb-phy@0 kobject to zero, kobject_cleanup() kfree_const()s kobj->name while the node stays in the OF tree and rcar_gen2_phy_xlate() still compares args->np to channel->of_node; later kobject_name() reads reclaimed heap, and of_node_release()'s dump_stack() leaks kernel pointers.
I:HIntegrity impact, high
kobject_cleanup() also __kobject_del()s the live usb-phy@0 sysfs dir and kobject_put()s the parent controller node, leaving a released kobject with a dangling name pointer still linked via channel->of_node; reclaiming that name slab plus later kobject_get/put on the zero-ref kobject provides write and control-flow primitives.
A:HAvailability impact, high
of_node_release() prints "detected bad of_node_put()" and dump_stack() for the still-attached usb-phy@0 node; the next of_node_get/put hits refcount_t underflow/UAF (panic under panic_on_warn), and tearing down /sys/firmware/devicetree for a node still used by rcar_gen2_phy_xlate() can oops.