我们对 9.9.7-P1 和 9.9.7-P2 这两个版本进行了 diff,发现其主要 Patch 点位于 lib/dns/tkey.c文件中第 653 行 dns_tkey_processquery() 函数中:

在该函数中两次调用 dns_message_findname() 函数来分别从 DNS_SECTION_ADDITIONAL 和 DNS_SECTION_ANSWER 中寻找 TEKY 记录,从代码中可以看到,第一次函数调用之前 na
me 变量进行了初始化,被赋值为 NULL,而第二次调用前却未进行初始化。 dns_message_findname() 函数原型位于 lib/dns/message.c 文件中,其主要代码如下:

分析源码可知,在第一次 dns_message_findname() 函数调用之后,name 指针会被赋值,而 在第二次调用 dns_message_findname() 函数时,会进行变量判断(红色 圈注所示),而 REQUIRE 最终会使用 assert() 函数进行断言判断,其声明位于 lib/lwres/assert_p.h 文件第 27 行,如下图所示:

由于第二次 name 指针已经非空,断言失败导致程序退出。使得攻击者可以构造 TKEY 查 询请求来触发异常使程序退出,直接 DoS 服务。
全部评论 (5)