小智 8
Dnsmasq 有一个--min-cache-ttl=[seconds]参数,在哪里seconds?3600(1 小时)。
您实际上可以通过利用 dnsmasq C 源代码中的整数溢出漏洞绕过 3600 秒 --min-cache-ttl 检查,而无需重新编译。这是一个有效的值:
通过命令行:--min-cache-ttl=6442450943
通过 dnsmasq.conf: min-cache-ttl=6442450943
为什么这样做?嗯,dnsmasq C 代码指定了一个 3600 秒的有符号整数值常量,将其与用户指定的覆盖值进行比较和检查。如果该值大于 3600,则用户输入将被忽略,而是使用常量 3600。这个覆盖值也是一个有符号整数,但在代码的几行后面,当初始化守护进程时,输入的 ttl 值被转换为一个无符号长整数。
乍一看,您可能想知道我们是否只是在输入或配置文件中将值设置为 -20 亿。好吧,有一个初始的 dnsmasq 输入检查会提前中止并终止。但是,如果我们将整数包装在 +40 亿以上,我们将从零开始。再加上 +20 亿 + 1,我们就可以返回一个有效的负数,同时仍然绕过初始检查。
那么,为什么这样做呢?因为有符号整数的范围大约从 -20 亿到 +20 亿,而无符号整数的范围从 0 到 +40 亿。我们需要让值在大约 +20 亿标记处回绕,以便在输入解析后通过 dnsmasq 检查解释为负值。本质上,ttl > 3600 的检查将通过,因为该值被负面解释为 -20 亿。-20 亿肯定 < 3600。但是当代码的第二部分去转换 -20 亿时,它最终会将我们的输入 ttl 转换为大约 2^31 + 1(无符号),而不是 -2 ^31 + 1(签名)。
当然,您只能通过这种方式指定非常大的 ttl 值,这可能对任何人都没有用,因为这样的 ttl 值根本不是很合理。但这是一个巧妙的技巧(dnsmasq 错误)。希望这对某人有所帮助,即使它仅对调试或作为临时解决方案有用。如果这对您的情况有效或无效,请随时发表评论。享受!:)
根据我对你对加雷斯的评论的回答(这确实应该纳入你的问题中),我想说,你的问题最可能的原因是: