本讲座深入探讨了硬件安全中的侧信道攻击及其防御方法,强调了性能与安全性之间的权衡。
if (secret) slow_task() else fast_task()。
min(len(input_pwd), len(real_pwd)) 仍然会泄露密码长度信息。如果攻击者输入的密码长度短于实际密码,程序的执行时间会随着攻击者输入长度的增加而增加,直到达到实际密码长度后时间趋于平稳,这个“临界点”泄露了密码的真实长度。
if/else)时,它会在分支结果确定之前,通过“分支预测器”猜测哪个路径更有可能被执行,然后推测性地执行该路径上的指令,以避免等待时间。
if (x < A.size) { y = A[x]; z = B[y]; }。其中A是受害者内存中的一个数组,可能包含秘密信息;B是另一个数组,用于将秘密信息编码到缓存行访问模式中。x是攻击者可控制的输入。A数组边界的x值。if (x < A.size)条件为真,即使x实际上越界。y = A[x]: 由于x越界,CPU会从内存中一个不应访问的地址(可能包含秘密信息)加载数据到y。此秘密数据也会被加载到缓存中。z = B[y]: 推测性地使用秘密值y作为索引来访问B数组。这将导致B数组中对应于y值的缓存行被加载到缓存中(如果不在缓存中则发生缓存未命中)。y和z)。B[y],导致对应的缓存行被加载或逐出,这个缓存状态的改变仍然保留。B数组中所有可能的缓存行。通过测量访问时间,攻击者可以发现哪个缓存行被受害者推测性地访问过(访问时间较慢的表示被加载或逐出过)。y相关,攻击者通过观察缓存行变化模式,就可以推断出秘密值y,从而泄露敏感信息。
简单的软件方法 (Lfence):
更巧妙的软件方法 (投机加载硬化SLH) [44:45]:
if (cond) { y = load(x); z = load(y); } 中,修改为:
y = load(x);
y_prime = cond ? y : 0;
z = load(y_prime);y_prime的计算依赖于cond。在cond(分支条件)的结果尚未确定之前,y_prime的值是不可用的。z的加载依赖于y_prime,因此即使CPU推测性地执行到load(y_prime),它也无法实际加载数据,因为y_prime的值尚未确定。这阻止了秘密值y在推测执行期间通过load(y_prime)泄露到缓存中。硬件方法: