{"id":21394,"date":"2026-09-12T04:31:07","date_gmt":"2026-09-11T20:31:07","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89472"},"modified":"2026-09-12T04:31:07","modified_gmt":"2026-09-11T20:31:07","slug":"cve-2026-89472","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89472","title":{"rendered":"CVE-2026-89472 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\npower: supply: charge"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>power: supply: charger-manager: register regulators before exposing sysfs<\/p>\n<p>charger_manager_remove() and the err_reg_extcon probe error path free each<br \/>\ncharger regulator with regulator_put() before tearing down the power_supply<br \/>\nsysfs entries (power_supply_unregister()). charger_manager_remove() also<br \/>\ncalls try_charger_enable(cm, false) after the regulator_put() loop. A<br \/>\nconcurrent write to a charger&#8217;s externally_control sysfs attribute that<br \/>\nlands between regulator_put() and power_supply_unregister() can run<br \/>\ncharger_externally_control_store() and call try_charger_enable(), which,<br \/>\nwhen charging is enabled, dereferences the already-freed consumer handle.<br \/>\nWhen charging is enabled, try_charger_enable(cm, false) in .remove() also<br \/>\ndereferences the freed handles directly. Both leave use-after-free windows.<br \/>\nSymmetrically, probe registers the sysfs entries (power_supply_register)<br \/>\nbefore acquiring the regulators (regulator_get, inside<br \/>\ncharger_manager_register_extcon), so userspace can reach externally_control<br \/>\nbefore the regulators are available.<\/p>\n<p>Split charger_manager_register_extcon() on the sync\/async boundary:<br \/>\ncharger_manager_get_regulators() (regulator_get only, no async producer)<br \/>\nnow runs before power_supply_register() so sysfs is not live before<br \/>\nregulators are available, and charger_manager_register_extcon() keeps only<br \/>\nthe extcon notifier\/work setup, still after power_supply_register() so a<br \/>\npower_supply_register() failure cannot reach extcon setup. This keeps the<br \/>\nsysfs setup\/teardown ordering symmetric without introducing an asynchronous<br \/>\nproducer on the earlier probe-error path.<\/p>\n<p>Move power_supply_unregister() and try_charger_enable(cm, false) ahead of<br \/>\nthe regulator_put() loop on both teardown paths, and adjust err_reg_extcon<br \/>\n(power_supply_unregister() then fall through err_regulator for<br \/>\nregulator_put(); get_regulators self-rolls back on its own failure).<\/p>\n<p>This does not address the separate extcon-notifier-driven deref of the same<br \/>\nhandles, which needs its own synchronization design.<\/p>\n<p>Found by an in-house static analysis tool.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>power: supply: charger-manager: register regulators before exposing sysfs<\/p>\n<p>charger_manager_remove() and the err_reg_extcon probe er<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-21394","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/21394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}