OPENSSL拒绝服务漏洞【CVE-2022-0778】
废话不多说直接去看官方github的commit记录
https://github.com/openssl/openssl/commit/9eafb53614bf65797db25f467946e735e1b43dc9#
大哥的分析
整个文件对应了函数BN_mod_sqrt,该函数接受4个参数,按照顺序我们称为ret,a,p,ctx,函数最终的实现效果是利用Tonelli/Shanks算法计算ret,Tonelli/Shanks算法是用来结算二次剩余的一种算法,关于二次剩余解释为存在一个数X的平方与n mod p同余,则称n为模p的二次剩余。
这个洞太考验数学了,对我这种半路出家的渣渣来说后面的数学推导过程真的是不要太难受。
关键的修改发生在这一部分
这一部分代码被包裹在一个大的循环里面,这里贴出来完整的代码:
while (1) {
/*-
* Now b is a^q * y^k for some even k (0 <= k < 2^E
* where E refers to the original value of e, which we
* don't keep in a variable), and x is a^((q+1)/2) * y^(k/2).
*
* We have a*b = x^2,
* y^2^(e-1) = -1,
* b^2^(e-1) = 1.
*/
if (BN_is_one(b)) {
if (!BN_copy(ret, x))
goto end;
err = 0;
goto vrfy;
}
/* find smallest i such that b^(2^i) = 1 */
/***********修改前的代码***********/
i = 1;
if (!BN_mod_sqr(t, b, p, ctx))
goto end;
while (!BN_is_one(t)) {
i++;
if (i == e) {