来自 DDOS 2021-06-12 00:03 的文章

国内高防cdn_cc防御cdn_超稳定

国内高防cdn_cc防御cdn_超稳定

本文探讨glibc库中CVE-2015-7547漏洞的根本原因,以及利用该漏洞所需的条件。成功的攻击需要三个关键元素,但在所有情况下,padavan如何防御ddos,必须向受害者发送大于2048字节的DNS应答,并且必须触发重试条件,才能发生缓冲区溢出。因此,在极少数情况下,立即修补glibc库不是一个可行的选择,以下任何缓解步骤都是有效的(但可能对合法的DNS通信量有不利的副作用):阻止UDP应答>2048字节和所有TCP应答阻止UDP回复>2048字节和TCP回复>2048字节只使用一个nameserver条目配置glibc解析器,并阻止UDP回复>1024字节配置只有一个nameserver条目的glibc解析器并启用use vc选项以强制对所有查询使用TCP(glibc2.14及更高版本)其中,后两个选项更具吸引力,因为它们没有对通过TCP接收的回复施加任何长度限制。因此,它们对合法域名产生不利影响的可能性要小得多功能性以下缓解步骤在孤立的情况下是无效的(即,一次只实现一个,而不是一起实现):阻止所有TCP响应阻止TCP回复>2048字节阻止UDP回复>2048字节阻止设置了TC标志的UDP应答阻止无效的DNS答复阻止类型AAAA答复禁用EDNS0简介当GNU C库的DNS存根解析程序部分首次宣布CVE-2015-7547缓冲区溢出漏洞时,在现实世界条件下,其可利用性以及提出的一些缓解措施的影响存在很大的不确定性。在本文中,我们的目标是通过更仔细地研究实际的glibc代码来阐明这些问题。特别是,我们概述了成功攻击的关键阶段,以及每个阶段必须满足的触发条件阶段。在首先,值得一提的是,对于本文的大部分内容,我们假设攻击者可以直接与受害者的glibc解析器交互。在中间人场景中,攻击者截获受害者的DNS查询,并使用精心编制的响应进行响应,这些响应将在不进行任何修改的情况下传递给受害者。这种情况可能在现实世界中出现(例如通过恶意无线接入点),ddos防御nginx,但在大多数情况下,受害者和攻击者之间会有一个或多个缓存DNS服务器。我们在文章。我们已经发布了概念验证代码,演示了所讨论的攻击变体这里。开裂快速浏览相关代码的代码,我们将关注glibc2.21版本-除了这个漏洞发生时碰巧在我们的ubuntu15.04工作站上运行的版本外,没有什么特别的原因宣布。到缩小我们需要分析的代码量,下面是应用程序调用getaddrinfo()解析主机时发生的函数调用链名字。我们的send()和最后两个函数。前者通过TCP处理DNS查询,而后者处理基于UDP的查询。大多数参数是通过地址传递给这些函数的。这是发生意外副作用的处方。在我们继续进行我们的分析。下降该漏洞的根本原因是send_vc()和send_dg()函数可以被强制使其参数处于不一致的状态–这可以通过响应具有适当编制的DNS响应的查询。因为glibc解析器通常首先通过UDP发送查询(除非在/etc中设置了use-vc选项)/决议.conf),让我们从第一次调用send_dg()时堆栈上参数的初始状态开始时间:注意send_dg()的大多数参数都指向gethostbyname4\u r()的堆栈帧,其中值得注意的是ansp和anssizp的异常,它们指向的是\uu libc_res_nsend()的堆栈帧。后两个参数将成为攻击者试图操纵的目标。在图中所示的初始状态中,ansp间接地指向一个大小为2048字节的堆栈分配的缓冲区,而anssipp则指向一个整型变量,该变量的大小为该值缓冲区总体规划很简单。攻击者的目标是强制这两个参数不匹配,以便ansp仍然指向2048字节的缓冲区,而anssixp则指示更大的缓冲区大小。然后,send_dg()或send_vc()将在两个参数处于不一致状态时再次调用,并且将向函数发送大于2048字节的响应,非网站cc防御,从而触发缓冲区溢出。有几种不同的攻击方式,但它们都依赖于三种关键的攻击方式元素:超大DNS回复用于强制函数分配新的缓冲区。当传入的应答太大而无法放入堆栈分配的2048字节缓冲区时,函数将在堆上分配一个新的64k缓冲区。当发生这种情况时,anssiz参数将更新以反映新缓冲区的大小,而ans参数将左指向旧的2048字节堆栈分配的缓冲区。这就是使攻击成为可能的bug。会触发一个重试条件,导致函数返回调用者(只会再次被调用),但这次的缓冲区参数不一致。实现这一点有几种方法。缓冲区参数状态现在已准备好进行攻击,将发送两个额外的DNS响应,其中第二个将使2048字节的缓冲区溢出并破坏堆栈。迷失在SpaceLet中,我们将跟踪当响应到达时send_dg()的参数状态,该响应大于2048字节的初始缓冲区大小。首先,函数设置一些局部变量:int*thisanssipp;你的角色是什么;int*本报告;如果((recvresp1 | recvresp2)==0 | | buf2==空){thisanssipp=anssipp;thisansp=anscp?:ansp;由于这是第一个传入的应答,recvresp1和recvresp2标志都为零,软件防御cc,因此if条件为true。整型指针thisanssipp将被设置为指向\uu libc_res_nsend()堆栈帧上的anssiz参数,其中包含2048作为缓冲区大小的值。但是,在这种情况下,使用非ansu()调用的指针是否为空,这取决于我们的情况。因此,它将被设置为指向gethostbyname4\u r()堆栈帧上的host_buffer变量,而不是像预期那样设置为指向\uu libc_res_nsend()堆栈帧上的ans参数。现在,主机缓冲区和ans仍然指向内存中的同一个位置,所以一切都是这样好吧。下一个, 该函数测试当前缓冲区大小是否小于MAXPACKET字节(这个测试似乎是一个不完美的尝试,用于检查调用方传入的默认缓冲区是否仍在使用),阿波罗ddos防御体系,以及传入消息是否适合当前缓冲区。由于传入消息大于2048字节,if条件为true,函数将在堆上分配一个新的MAXPACKET大小的缓冲区(MAXPACKET定义为64k字节):if(*thisanssixp