安全是有分量的

ddos清洗_服务器防御系统_零元试用

2022-01-12 22:30栏目:创投界

ddos清洗_服务器防御系统_零元试用

在一个有关自动加密测试的内部项目中,我们发现许多实现不遵守标准规范,特别是签名算法。让我们更深入地研究一下。我们将主要讨论DSA和ECDSA算法及其各自的域和参数。

重要的是要知道,这两种数字签名算法都是由标准带入现场的,分别是NIST FIPS 186,也称为"数字签名标准"和ANSI X9.62(付费,但这里有免费的描述)。请注意,当前186-4版本中的fips186也讨论了ECDSA。这意味着大多数实现者(希望)引用这些文档来将算法添加到他们的软件中。

DSA

标准总是包含许多建议,而实现者在之后并不总是遵循这些建议。例如,DSA密钥参数在标准中被限制为四对不同的密钥长度:而且,虽然许多实现实际上接受任何大小的密钥。

虽然这看起来可能不是问题,但是一个实现可能无法执行其他检查。让我们首先研究DSA病例。根据FIPS 186-4,DSA参数定义如下:

是素模,其中,和是的位长度。是的素因子,其中,是的位长度。是GF(p)的乘法群中q阶子群的生成元,这样。是必须保密的私钥;是随机或伪随机生成的整数,例如。是公钥,其中。是每个消息唯一的秘密号码;是一个随机或伪随机生成的整数,这样

我们称之为域参数

注意通常是在签名过程中生成的,必须保密。现在,该标准还规定DSA和ECDSA的签名操作应如下:

根据FIPS 186-4由预期签名人进行初始设置。

现在,如您所见,"获取域参数有效性保证"以及"获取公钥有效性保证"都是过程的一部分。验证也是如此,如下所示:

根据FIPS 186-4的数字签名验证和验证过程。

现在,有意思的是,签名过程中的域参数可能由另一个实体生成,即可能由对手生成。

如下所示,我假设你知道(EC)DSA是如何工作的。如果没有,他们各自的维基百科页面(DSA、ECDSA)就足以理解本文的其余部分。

让我们从DSA开始。本标准规定了以下关于签名生成的内容:

应检查和的值,以确定是否为或。如果为或,应生成新的值,并重新计算签名。现在,在实现DSA时,大多数实现都遵循以下思想:只要我们以或等于结束,那么我们就可以返回到生成新的签名。例如,在Go v1.7.4中,实现如下:

123456789101112131415161718192021对于{k:=new(big.Int)buf:=make([]byte,n)[…]kInv:=fermatInverse(k,priv.Q)r=new(big.Int).Exp(priv.G,k,priv.P)r.Mod(r,如果r.Sign()==0{continue}z:=k.SetBytes(hash)s=new(big.Int).Mul(priv.X,r)[…]如果s.Sign()!=0{break}}

现在,如果这样一个实现尝试使用作为域参数来计算签名,它会发生什么?然后它将导致r=new(big.Int).Exp(priv.G,k,priv.P)始终等于,并且如果r.Sign()==0的分支将始终被采用,静态资源高防cdn,从而导致一个无限循环,从而导致CPU耗尽导致潜在的DoS。一个可能的解决方法,现在可以在我们的报告之后的Gov1.8.0中找到,就是将循环限制为几个迭代,并检查是否卡住:

12345678910var attempts intfor attempts=10;尝试次数>0;尝试--{k:=new(big.Int)[…]}//只有退化的私钥需要多次尝试。如果尝试==0{return nil,nil,ErrInvalidPublicKey}

这是一个简单的解决方法,实际上,确保这种情况不会发生的最好方法是在使用任何密钥材料执行DSA之前,按照规定执行适当的域参数和密钥有效性检查。

如果您认为无限循环不是一个bug而是一个特性,那么您同意OpenSSL团队的意见,没有对其进行修补:

123456/**如果FIPS 186-3要求r或s为零,则重做:这是非常不可能的。*/如果(BN_为零(ret->r)| BN_为零(ret->s))则重做;

例如,如果

现在,想象一下下面的场景,在我看来,这个场景不会太长:

服务器和客户机正在通信。服务器向客户机请求他想要使用的域参数,这似乎是标准所允许的。客户端提供恶意构建的域参数,例如服务器使用这些参数生成密钥对,并将公钥发送到客户端。服务器使用私钥执行签名操作。服务器易受攻击,因为他使用了提供的无效域参数。

在执行DSA时,表示易受攻击服务器所需的主要操作的架构。

只有在服务器无法获得域参数有效性保证的情况下,才可能出现这种情况,因为否则它会拒绝它们,并且不会实际使用恶意输入。

这里实际上比"仅仅"一个DoS有更多的风险:假设客户端作为生成器传递值,那么,如果没有执行正确的检查,防御ddos要多少钱,那么在第4步生成的密钥对将是假的(请注意,在Go的情况下,func GenerateKey的文档说明"PrivateKey的参数必须已经有效",但目前没有函数允许检查它。在OpenSSL的情况下,微软云防御ddos,这是没有文档记录的。)

密钥对是如何生成的?好吧,让我们看看DSA公钥和私钥的生成方式,当给定时:

随机选择一个密钥,这样计算公钥

So,if,then。然后验证过程只依赖于必须等于的事实,这很容易制作。

ECDSA