В ядре Linux устранена следующая уязвимость:
openrisc: исправлена синхронизация jump_label с smp. Исходный коммит 8c30b0018f9d («openrisc: добавить поддержку меток перехода»)
копирует из Arm64 и не учитывает должным образом, как аннулирование icache
на удаленных ядрах работает в OpenRISC. На удаленных icache OpenRISC необходимо
быть признаны недействительными, в противном случае статические ключи могут оставаться в рабочем состоянии после обновления.
Исправьте синхронизацию кэша SMP:
1. Правильно делайте недействительными удаленные icache-файлы ядра в системах SMP с помощью
icache_all_inv. Старый код используетick_all_cpus_sync(), который запускает
бездействующий вызов функции IPI на удаленных процессорах, который выполняет много операций
код и при этом очищает множество строк кэша, но не очищает
все это не правильно на OpenRISC.
2.
Для архитектур, в которых нет кэшей WRITETHROUGH, убедитесь, что
для очистки dcache после установки исправления. Чтобы проверить это, я сначала воспроизвел проблему, используя специальный тестовый модуль.
[0]. Тест подтвердил, что некоторые строки icache остались устаревшими.
последовательности кода static_key после вызова static_branch_enable().
После
в этом патче больше нет проблем с согласованностью jump_label.
[0] https://github.com/stffrdhrn/or1k-utils/tree/master/tests/smp_static_key_test
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: openrisc: Fix jump_label smp syncing The original commit 8c30b0018f9d ("openrisc: Add jump label support") copies from arm64 and does not properly consider how icache invalidation on remote cores works in OpenRISC. On OpenRISC remote icaches need to be invalidated otherwise static key's may remain state after updating. Fix SMP cache syncing by: 1. Properly invalidate remote core icaches on SMP systems by using icache_all_inv. The old code uses kick_all_cpus_sync() which runs a no-op IPI function call on remote CPU's which does execute a lot of code and flushes many cache lines in the process, but does not flush all and it's not correct on OpenRISC. 2. For architectures that do not have WRITETHROUGH caches be sure to flush the dcache after patching. To test this I first reproduced the issue using a custom test module [0]. The test confirmed that some icache lines maintained stale static_key code sequences after calling static_branch_enable(). After this patch there are no longer jump_label coherency issues. [0] https://github.com/stffrdhrn/or1k-utils/tree/master/tests/smp_static_key_test
Характеристики атаки
Последствия
Строка CVSS v3.1