openjdk.ruOpenJDK на русском

JEP 342: Limit Speculative Execution

Ограничение спекулятивного исполнения

ОтветственныйJesper Wilhelmsson
ТипFeature
ОбластьJDK
СтатусClosed / Withdrawn
Компонентhotspot / compiler
Обсуждениеjdk dash dev at openjdk dot java dot net
ТрудоёмкостьL
ДлительностьL
РецензентыMikael Vidstedt
Создан2018/07/12 21:36
Обновлён2019/08/05 11:10
Задача8207206

Аннотация

Помочь разработчикам и тем, кто развёртывает приложения, защищаться от уязвимостей спекулятивного исполнения («Spectre»): дать средство ограничить спекулятивное исполнение и создать возможность реализовать дополнительные меры защиты в будущих выпусках.

Что не является целью

Автоматически определять, когда следует ограничивать спекулятивное исполнение, не является целью. Это решение придётся принимать конечным пользователям.

Обеспечить полную защиту от всех форм спекулятивного исполнения не является целью.

Описание

Один из способов защиты от уязвимостей спекулятивного исполнения — перекомпилировать код на C и C++ с параметрами компилятора, которые ограничивают, в какой мере процессор может выполнять спекулятивное исполнение. Однако ограничение спекулятивного исполнения может сказаться на производительности. Для кода на C и C++ в JDK это влияние может быть значительным.

Поэтому мы включим в JDK отдельную альтернативную JVM, которая скомпилирована с этими параметрами и может быть выбрана при запуске. Весь код, не относящийся к JVM, мы будем по умолчанию компилировать с этими параметрами; поскольку влияние на производительность невелико, включать вторые копии всего этого кода нет смысла.

Решать, ограничивать ли спекулятивное исполнение, будет конечный пользователь. Влияние на производительность может сильно различаться в зависимости от таких факторов, как тип процессора, операционная система и характер нагрузки, и его следует оценивать с помощью тестирования производительности. Однако если где-либо в системе выполняется недоверенный код, мы рекомендуем использовать альтернативную JVM.

Выбор и определение альтернативной JVM

Новый параметр командной строки программы запуска, -nonspeculative, будет выбирать альтернативную JVM. Текущая JVM, которая не ограничивает спекулятивное исполнение, останется JVM по умолчанию.

Вывод java --version будет показывать, какая JVM используется. Например:

$ java --version
java 11-ea 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11-ea+19)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11-ea+19, mixed mode, sharing)
$ java -nonspeculative --version
java 11-ea 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11-ea+19)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11-ea+19, limit speculative execution, mixed mode)
$

(Это JDK собственной сборки; точный вывод в штатной сборке будет немного отличаться.)

На платформах, где альтернативная JVM недоступна, но явно запрошена флагом -nonspeculative, будет выведено сообщение об ошибке, и JVM завершит работу:

Unrecognized option: -nonspeculative
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Отличия альтернативной JVM

Альтернативная JVM будет компилироваться следующим образом:

  • Linux(*): будут включены следующие параметры gcc: -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register (требуется gcc 7.3.0+)

  • Windows: будет включён следующий параметр компилятора VisualStudio: /Qspectre (требуется VS2017 15.5+)

(*) Платформы Linux, где используется gcc и реализованы соответствующие флаги, например x86/x64.

JIT-компиляторы в JVM также потребуется обновить во многом так же, как это было сделано для компиляторов C/C++. Эти изменения могут значительно повлиять на производительность большей части JIT-скомпилированного кода, поэтому изменения JIT-компилятора будут включены только в альтернативной JVM. В будущих выпусках мы можем добавить в альтернативную JVM дополнительные изменения, чтобы усилить обеспечиваемую ею защиту.

Тестирование

Эта возможность не требует новых функциональных тестов, но на альтернативной JVM следует провести соответствующее нагрузочное тестирование и тестирование производительности.