Cuando trabaja con claves secretas, si su código se bifurca de manera desigual, podría revelar partes de las claves secretas a través de canales laterales. Entonces, para algunos algoritmos, debería bifurcarse uniformemente independientemente de la clave secreta.
En C/C++/Rust, puede usar ensamblador para asegurarse de que ninguna optimización del compilador interfiera con la bifurcación. Sin embargo, en Java, la situación es difícil. En primer lugar, hace JIT para escritorio y AOT en Android, por lo que hay 2 posibilidades para que el código se optimice de forma impredecible, ya que JIT y AOT siempre están cambiando y pueden ser diferentes para cada dispositivo. Entonces, ¿cómo se previenen los ataques de canal lateral que aprovechan la bifurcación en Java?
Al realizar ataques de canal lateral, una de las principales formas de hacerlo es leer el consumo de energía del chip mediante el análisis de potencia diferencial (DPA) . Cuando tiene una rama en un código, como una declaración if, esto puede afectar negativamente el consumo de energía de tal manera que se pueden hacer correlaciones en cuanto a las elecciones que se están haciendo. Para frustrar este análisis, le interesaría tener un consumo de energía "lineal". Esto puede mitigarse en cierta medida con el código, pero en última instancia dependería del dispositivo en sí. Según Brennan et.al [1], algunos optaron por abordar el problema de Java JIT mediante el almacenamiento en caché de instrucciones. En el código, lo "mejor" que podría hacer sería programar usando canarios, para confundir a un atacante, como proponen Brennan et.al [2], y se demuestra en el siguiente código de ejemplo (muy simplificado):
public bool check(String guess) { for(int i=0; i<guess.len; i++) return false; } return true; }versus;
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]: T. Brennan, "Detección y mitigación de canales laterales inducidos por JIT*", 2020 IEEE/ACM 42nd International Conference on Software Engineering: Companion Proceedings (ICSE-Companion), 2020, págs. 143-145.
[2]: T. Brennan, N. Rosner y T. Bultan, "Fugas JIT: Inducción de canales secundarios de tiempo a través de la compilación justo a tiempo", Simposio IEEE sobre seguridad y privacidad (SP) de 2020, 2020, págs. 1207- 1222, doi: 10.1109/SP40000.2020.00007.