Как на Java нейтрализуются атаки по сторонним каналам ветки кода?
Когда вы работаете с секретными ключами, если ваш код разветвляется неравномерно, он может раскрывать биты секретных ключей по сторонним каналам. Поэтому для некоторых алгоритмов он должен разветвляться равномерно независимо от секретного ключа.
В C/C++/Rust вы можете использовать ассемблер, чтобы быть уверенным, что никакие оптимизации компилятора не испортят ветвление. Однако на Java ситуация сложная. Прежде всего, он выполняет JIT для десктопа и AOT для Android, поэтому есть 2 возможности оптимизации кода непредсказуемым образом, поскольку JIT и AOT всегда меняются и могут быть разными для каждого устройства. Итак, как на Java предотвращаются атаки по сторонним каналам, использующие ветвление?
1 ответ
При выполнении атак по побочным каналам одним из основных способов сделать это является считывание энергопотребления чипа с использованием дифференциального анализа мощности (DPA) .. Когда у вас есть ветвь в коде, например оператор if, это может неблагоприятно повлиять на энергопотребление таким образом, что можно будет сделать корреляции относительно того, какой выбор делается. Чтобы помешать этому анализу, в ваших интересах было бы иметь «линейное» энергопотребление. Это может быть в некоторой степени смягчено кодом, но в конечном итоге это будет зависеть от самого устройства. Согласно Brennan et.al [1], некоторые решили решить проблему JIT Java путем кэширования инструкций. В коде «лучшее», что вы могли бы сделать, это программировать с использованием канареек, чтобы сбить злоумышленника с толку, как это было предложено Brennan et.al [2] и продемонстрировано в следующем (очень упрощенном) примере кода:
public bool check(String guess) {
for(int i=0; i<guess.len; i++)
return false;
}
return true;
}
против;
public bool check(String guess) {
bool flag=true, fakeFlag=true;
for(int i=0; i<guess.len; i++) {
if (guess[i] != password[i])
flag=false;
else
fakeFlag = false:
}
return flag;
}
}
[1]: Т. Бреннан, «Обнаружение и устранение побочных каналов, вызванных JIT*», 42-я Международная конференция IEEE/ACM по программной инженерии, 2020 г.: сопутствующие материалы (ICSE-Companion), 2020 г., стр. 143–145.
[2]: Т. Бреннан, Н. Рознер и Т. Бултан, «Утечки JIT: создание побочных каналов синхронизации посредством своевременной компиляции», Симпозиум IEEE по безопасности и конфиденциальности (SP), 2020 г., 2020 г., стр. 1207-1222, дои: 10.1109/SP40000.2020.00007.