Java 如何缓解代码分支侧信道攻击?

How are code-branch side channel attacks mitigated on Java?

当您使用密钥时,如果您的代码分支不均匀,它可能会通过侧通道泄露密钥位。所以对于某些算法,它应该独立于密钥进行统一分支。

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

执行 side-channel 攻击时,其中一种主要方法是使用 差分功率分析 (DPA)[=21= 读取芯片的 power-consumption ].当您在代码中有一个分支时,例如 if 语句,这可能会对功率消耗产生不利影响,从而可以对正在做出的选择进行关联。为了阻止这种分析,“线性”功耗符合您的利益。这可以在一定程度上通过代码来缓解,但最终取决于设备本身。根据 Brennan et.al [1],一些人选择通过缓存指令来解决 java JIT 问题。在代码中,您可以做的“最好的”是使用金丝雀进行编程,以迷惑攻击者,正如 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]:T. Brennan,“JIT-Induced 侧信道的检测和缓解*”,2020 年 IEEE/ACM 第 42 届软件工程国际会议:配套论文集 (ICSE-Companion) ,2020 年,第 143-145 页。

[2]:T. Brennan、N. Rosner 和 T. Bultan,“JIT 泄漏:通过 Just-In-Time 编译引入时序侧通道”,2020 年 IEEE 安全与隐私研讨会 (SP),2020 年, 第 1207-1222 页,doi:10.1109/SP40000.2020.00007.