В ядре Linux устранена следующая уязвимость:
мощность: источник питания: менеджер зарядного устройства: зарегистрируйте регуляторы перед раскрытием sysfs
charge_manager_remove() и путь ошибки зонда err_reg_extcon освобождаются каждый
регулятор зарядного устройства с помощью Regulator_put() перед отключением power_supply
записи sysfs (power_supply_unregister()). charge_manager_remove() также
вызывает try_charger_enable(cm, false) после цикла регулятора_put(). А
одновременная запись в атрибут externally_control sysfs зарядного устройства, который
земли между регулятором_put() и power_supply_unregister() могут работать
charge_externally_control_store() и вызовите try_charger_enable(), что
когда зарядка включена, разыменовывается уже освобожденный дескриптор потребителя. Когда зарядка включена, попробуйте также try_charger_enable(cm, false) в .remove().
разыменовывает освобожденные дескрипторы напрямую.
Оба оставляют окна использования после освобождения. Симметрично, зонд регистрирует записи sysfs (power_supply_register).
перед приобретением регуляторов (regulator_get, внутри
charge_manager_register_extcon), чтобы пользовательское пространство могло получить доступ к external_control
до того, как будут доступны регуляторы. Разделите charge_manager_register_extcon() на границе синхронизации/асинхронности:
charge_manager_get_regulators() (только Regulator_get, без асинхронного производителя)
теперь запускается до power_supply_register(), поэтому sysfs раньше не работает
регуляторы доступны, а charge_manager_register_extcon() сохраняет только
настройка уведомления/работы extcon, все еще после power_supply_register(), поэтому
Ошибка power_supply_register() не может достичь настройки extcon.
Это сохраняет
установка/разборка sysfs в симметричном порядке без введения асинхронного
производитель на более раннем пути проверки-ошибки. Переместите power_supply_unregister() и try_charger_enable(cm, false) вперед
цикл регулятора_put() на обоих путях удаления и настройте err_reg_extcon
(power_supply_unregister() затем проходит через err_regulator для
регулятор_пут(); get_regulators самостоятельно откатывается в случае сбоя). Это не касается отдельного разыменования, управляемого extcon-уведомителем, того же самого
handles, для которого требуется собственный дизайн синхронизации.
Обнаружено с помощью собственного инструмента статического анализа.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: power: supply: charger-manager: register regulators before exposing sysfs charger_manager_remove() and the err_reg_extcon probe error path free each charger regulator with regulator_put() before tearing down the power_supply sysfs entries (power_supply_unregister()). charger_manager_remove() also calls try_charger_enable(cm, false) after the regulator_put() loop. A concurrent write to a charger's externally_control sysfs attribute that lands between regulator_put() and power_supply_unregister() can run charger_externally_control_store() and call try_charger_enable(), which, when charging is enabled, dereferences the already-freed consumer handle. When charging is enabled, try_charger_enable(cm, false) in .remove() also dereferences the freed handles directly. Both leave use-after-free windows. Symmetrically, probe registers the sysfs entries (power_supply_register) before acquiring the regulators (regulator_get, inside charger_manager_register_extcon), so userspace can reach externally_control before the regulators are available. Split charger_manager_register_extcon() on the sync/async boundary: charger_manager_get_regulators() (regulator_get only, no async producer) now runs before power_supply_register() so sysfs is not live before regulators are available, and charger_manager_register_extcon() keeps only the extcon notifier/work setup, still after power_supply_register() so a power_supply_register() failure cannot reach extcon setup. This keeps the sysfs setup/teardown ordering symmetric without introducing an asynchronous producer on the earlier probe-error path. Move power_supply_unregister() and try_charger_enable(cm, false) ahead of the regulator_put() loop on both teardown paths, and adjust err_reg_extcon (power_supply_unregister() then fall through err_regulator for regulator_put(); get_regulators self-rolls back on its own failure). This does not address the separate extcon-notifier-driven deref of the same handles, which needs its own synchronization design. Found by an in-house static analysis tool.
Характеристики атаки
Последствия
Строка CVSS v3.1