如何在Java上减轻代码分支侧通道攻击



当您使用密钥时,如果您的代码分支不相等,它可能会通过侧通道泄露密钥的部分。因此,对于某些算法,它应该独立于密钥而一致地分支。

在C/C++/Rust上,您可以使用程序集来确保编译器优化不会干扰分支。然而,在Java上,情况很困难。首先,它为桌面执行JIT,在Android上执行AOT,因此代码有两种可能以不可预测的方式优化,因为JIT和AOT总是在变化,并且每个设备可能不同。那么,如何在Java上防止利用分支的侧通道攻击呢?

执行侧信道攻击时,执行这些攻击的主要方法之一是使用差分功率分析(DPA(读取芯片的功耗。当代码中有一个分支(如if语句(时,这可能会对功率消耗产生不利影响,从而可以关联正在进行的选择。为了阻止这种分析;线性";功耗。这可以通过代码在一定程度上减轻,但最终取决于设备本身。根据Brennan等人[1]的说法,有些人选择通过缓存指令来解决javaJIT问题。在代码中;最好的";正如Brennan等人[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] :T.Brennan,";JIT引起的侧信道的检测和缓解*;2020年IEEE/ACM第42届软件工程国际会议:配套论文集(ICSE Companion(,2020年,第143-145页。

[2] :T.Brennan、N.Rosner和T.Bultan,";JIT泄漏:通过实时编译诱导定时侧通道,";2020年IEEE安全与隐私研讨会(SP(,2020,第1207-1222页,doi:10.1009/SP40000.2020.00007。

最新更新