В ядре Linux устранена следующая уязвимость: tracing: реструктурировать trace_clock_global(), чтобы никогда не блокироваться. Сообщалось, ч…
В ядре Linux устранена следующая уязвимость: tracing: реструктурировать trace_clock_global(), чтобы никогда не блокироваться. Сообщалось, что исправление обнаружения рекурсии кольцевого буфера приведет к зависанию машины при выполнении тестирования приостановки/возобновления. Следующая трассировка стека была извлечена из отладки этого случая: Call Trace: trace_clock_global+0x91/0xa0 __rb_reserve_next+0x237/0x460 ring_buffer_lock_reserve+0x12a/0x3f0 trace_buffer_lock_reserve+0x10/0x50 __trace_graph_return+0x1f/0x80 trace_graph_return+0xb7/0xf0 ? trace_clock_global+0x91/0xa0 ftrace_return_to_handler+0x8b/0xf0 ? pv_hash+0xa0/0xa0 return_to_handler+0x15/0x30 ? ftrace_graph_caller+0xa0/0xa0 ? trace_clock_global+0x91/0xa0 ? __rb_reserve_next+0x237/0x460 ? ring_buffer_lock_reserve+0x12a/0x3f0 ? trace_event_buffer_lock_reserve+0x3c/0x120 ? trace_event_buffer_reserve+0x6b/0xc0 ? trace_event_raw_event_device_pm_callback_start+0x125/0x2d0 ? dpm_run_callback+0x3b/0xc0 ? pm_ops_is_empty+0x50/0x50 ? platform_get_irq_byname_optional+0x90/0x90 ? trace_device_pm_callback_start+0x82/0xd0 ? dpm_run_callback+0x49/0xc0 Со следующим RIP: RIP: 0010:native_queued_spin_lock_slowpath+0x69/0x200 Поскольку исправление обнаружения рекурсии позволит произойти одной рекурсии во время трассировки, это привело к тому, что trace_clock_global() взял спин-блокировку, а затем попытался взять ее снова: ring_buffer_lock_reserve() { trace_clock_global() { arch_spin_lock() { queued_spin_lock_slowpath() { /* lock taken */ (что-то еще трассируется трассировщиком графов функций) ring_buffer_lock_reserve() { trace_clock_global() { arch_spin_lock() { queued_spin_lock_slowpath() { /* DEAD LOCK! */ Трассировка *никогда* не должна блокироваться, так как это может привести к странным зависаниям, как описано выше. Реструктурируйте код trace_clock_global(), чтобы вместо простого взятия блокировки для обновления записанного "prev_time" просто использовать его, поскольку два события, происходящие на двух разных ЦП, которые вызывают это одновременно, действительно не имеют значения, какое из них произойдет первым. Используйте trylock для захвата блокировки для обновления prev_time, и если это не удастся, просто попробуйте еще раз в следующий раз. Если не удалось ее взять, это означает, что кто-то другой уже обновляет ее. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=212761
Программный продукт использует несколько потоков, процессов, компонентов или систем для предоставления временного доступа к общему ресурсу, который может принадлежать только одному процессу единовременно, однако не обеспечивает надлежащую синхронизацию этих действий, что может приводить к одновременному доступу к ресурсу из нескольких потоков или процессов.
https://cwe.mitre.org/data/definitions/662.html →Открыть в коллекции CWE →Продукт содержит несколько потоков или исполняемых сегментов, ожидающих освобождения необходимой блокировки друг другом, что приводит к взаимоблокировке.
https://cwe.mitre.org/data/definitions/833.html →Открыть в коллекции CWE →Злоумышленник провоцирует и эксплуатирует состояние взаимоблокировки в целевом программном обеспечении, чтобы вызвать отказ в обслуживании. Взаимоблокировка может возникнуть, когда два или более конкурирующих действия ожидают завершения друг друга и в итоге ни одно из них не завершается. Состояния взаимоблокировки бывает сложно обнаружить.
https://capec.mitre.org/data/definitions/25.html →Открыть в коллекции CAPEC →Злоумышленник нацеливается на состояние гонки, возникающее когда несколько процессов одновременно обращаются к одному ресурсу и манипулируют им, а результат выполнения зависит от конкретного порядка этих обращений. Злоумышленник может эксплуатировать состояние гонки, «участвуя в гонке»: изменяя ресурс и нарушая нормальный порядок выполнения. Например, состояние гонки может возникнуть при обращении к файлу: злоумышленник может обмануть систему, подменив исходный файл своей версией и заставив систему прочитать вредоносный файл.
https://capec.mitre.org/data/definitions/26.html →Открыть в коллекции CAPEC →Данная атака эксплуатирует использование символических ссылок (Symlink) для записи в конфиденциальные файлы. Злоумышленник может создать символическую ссылку на целевой файл, к которому у него нет прямого доступа. Когда привилегированная программа пытается создать временный файл с тем же именем, что и символическая ссылка, она фактически записывает данные в целевой файл, на который указывает символическая ссылка злоумышленника. Если злоумышленник может поместить вредоносное содержимое во временный файл, он тем самым запишет его в конфиденциальный файл через символическую ссылку. Состояние гонки возникает потому, что система проверяет существование временного файла, а затем создаёт его. Злоумышленник, как правило, создаёт символическую ссылку в промежутке между проверкой и созданием временного файла.
https://capec.mitre.org/data/definitions/27.html →Открыть в коллекции CAPEC →Данная атака нацелена на состояние гонки, возникающее между моментом проверки (состояния) ресурса и моментом его использования. Типичный пример — обращение к файлу. Злоумышленник может эксплуатировать состояние гонки при обращении к файлу, «участвуя в гонке»: изменяя ресурс между первым обращением целевой программы к файлу и фактическим его использованием. В этом промежутке злоумышленник может заменить или изменить файл, вызвав неожиданное поведение приложения.
https://capec.mitre.org/data/definitions/29.html →Открыть в коллекции CAPEC →| Продукт | Вендор | Статус |
|---|---|---|
| kernel | Отслеживается | |
| kernel-rt | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux-allwinner-5.19 | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается |