Унификация и исправление уязвимостей
Ветка Linux 7.3 получит масштабную переработку кода входа в системные вызовы (syscall entry handling). Инициатором изменений стал ветеран разработки ядра Thomas Gleixner, который при анализе патчей обнаружил критические несоответствия в реализации рандомизации kernel stack across различных архитектур. В частности, архитектура PowerPC применяла функцию add_random_kstack_offset() некорректно, что могло снижать эффективность защиты от атак типа ROP/JOP. Другие архитектуры вызывали рандомизацию слишком поздно — после завершения всей работы входа из пользовательского режима, что создавало избыточные накладные расходы.
Технические детали оптимизации
Gleixner переписал код так, чтобы все архитектуры использовали общий (generic) код входа в системные вызовы. Ключевые технические изменения включают:
- Введение новых вариантов
[syscall_]enter_from_user_mode(), которые включают рандомизацию стека на самой ранней возможной стадии. - Использование новой функции
add_random_kstack_offset_irqsoff(), которая избегает накладных расходовget/put_cpu_var()в регионах с отключенными прерываниями. - Адаптация x86-специфичного кода для устранения исторических «странностей» (oddities) и упрощение логики.
- Интеграция патчей от Jinjie (Huawei) для улучшения работы seccomp и изменение возвращаемых значений функций ptrace на булевы для четкой индикации разрешения системного вызова.
Результаты бенчмарков
Несмотря на то, что функциональных изменений не предполагалось, тестирование тяжелых нагрузок на системные вызовы и микробенчмарки показали небольшой, но измеримый прирост производительности. Это стало возможным за счет устранения избыточных проверок и оптимизации пути выполнения кода. Размер бинарного кода входа в системные вызовы для x86_64 также немного уменьшился.
| Аспект | До изменений | После изменений (Linux 7.3) |
|---|---|---|
| Рандомизация стека (PowerPC) | Некорректная / suboptimal | Исправленная, ранняя инициализация |
| Накладные расходы (x86/другие) | Вызов get/put_cpu_var в interrupt-disabled region | Использование irqsoff-вариантов, исключение лишних вызовов |
| Производительность | Базовая | Небольшой прирост (small performance gain) |
| Размер кода (x86_64) | Исходный | Слегка уменьшен |
Статус интеграции
Патчи уже находятся в ветке tip/tip.git (core/entry) и ожидаются в окне слияния (merge window) для выпуска Linux 7.3. Это изменение важно для всех пользователей, так как оно не только улучшает производительность, но и стандартизирует безопасность работы с стеком на уровне ядра для всех поддерживаемых архитектур.
Источник: Phoronix ↗
