OPENSSL拒绝服务漏洞【CVE-2022-0778】

本文详细分析了OpenSSL中的CVE-2022-0778拒绝服务漏洞,该漏洞涉及BN_mod_sqrt函数中的 Tonelli/Shanks 算法。通过修改特定代码段,导致无限循环,从而引发拒绝服务。博客作者分享了代码修改前后对比,并提供了POC验证,展示了如何利用此漏洞使CPU占用率飙升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OPENSSL拒绝服务漏洞【CVE-2022-0778】


废话不多说直接去看官方github的commit记录

https://github.com/openssl/openssl/commit/9eafb53614bf65797db25f467946e735e1b43dc9#

大哥的分析

https://github.com/drago-96/CVE-2022-0778

在这里插入图片描述
整个文件对应了函数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) {
   
               
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值