如果我创建了一个可以公开返回服务器时间(无需身份验证)的servlet,这会带来安全性问题吗?我想不出有什么问题,但是不知何故告诉我我可能是错的。通过调整设备日期进行欺诈)。

评论

您应该问的是“公开暴露服务器时间会带来多少安全风险?”尽管时间(假设它是准确的)处于威胁范围的最低端,但是暴露有关系统的任何内容都是潜在的风险。

顺便说一句,“服务器时间”应该是UTC并通过NTP设置,这意味着无论如何它都是公共信息。 (哦,如果您是直接编写servlet而不是使用诸如Spring或Dropwizard之类的框架,那么手动执行比暴露时间更容易引起安全漏洞。)
您应该假设他们可以更改任何内容。如果他们愿意在手机上更改日期,谁会说他们不会在防火墙处拦截来自服务器的响应,也不会在那里更改日期?您只能依靠客户告诉您的是客户想要做什么。任何其他验证,无论多么琐碎,都必须假定已被破坏并在可以信任的地方进行了检查。

#1 楼

只要准确,服务器时间对攻击者几乎没有用。实际上,所揭示的不是当前时间(毕竟,相对论物理学除外,时间在任何地方都是一致的),不如时间歪斜。请注意,即使您没有明确显示时间,也通常有很多方法可以获取本地服务器的时间。例如,直到1.2版的TLS都将当前时间嵌入到握手中,网页可能会显示动态页面的最后修改日期,HTTP响应本身可能会在响应标头中包含当前时间和日期,等等。

知道服务器的确切时钟偏斜只是在非常特定的威胁模型中存在的一个问题:


时钟偏斜可用于攻击中以匿名化Tor隐藏服务。编写的应用程序可能会使用服务器时间来生成秘密值。
在人为的情况下,可能会显示RTC的环境状况。


评论


当前时间也必须在任何HTTP响应中发送。

– Benoit Esnard
18年6月8日9:36



服务器时间不准确时会成为问题吗?

–托德·塞维尔(Todd Sewell)
18年6月8日在10:26

@ToddSewell如果服务器时间不正确,则攻击者可以多种方式滥用该时间。 TLS和证书通常取决于准确的系统时间。

–森林
18年6月8日在10:27

相关的,我写了一个指南,指导您确定远程服务器上的时间的多种方法。

–多项式
18年6月8日在11:33

“只要是准确的”,这似乎暗示服务器时间不准确将是一个安全问题。是吗?如果是这样,怎么办?

– code_dredd
18年6月8日在22:23



#2 楼

“ Servlet”听起来好像您已经在其中运行复杂的服务器。

有很多方法可以使协议浪费服务器时间。例如,HTTP具有一个用于创建/修改时间的流行标头字段,如果正确使用,动态生成的数据将始终具有当前系统时间。

出于TLS身份验证的原因,您甚至可以二进制搜索使用过期的客户端证书来查找端点的日期和时间。这是一个必不可少的弊端–如果您正在执行TLS,则服务器需要有一个时间概念来知道什么是有效的密钥/证书,并且没什么如果是这样,这很可能是NTP协调时间。因此,您真的无法告诉任何有关攻击者尚不知道的服务器的信息–确实只有一个“正确”的时间。

如果您不执行TLS:泄漏系统时间就是

关于安全性:不确定要为设备弄清楚世界时间而公开另一个servlet。


为了进一步说明,移动应用程序将使用此端点来增强其安全性(通过调整设备日期来避免作弊)。


红旗。您取决于客户对安全性的不变性。绝对不要那样做。您根本无法相信用户设备上发生的任何事情。这些不是您的设备。他们可以简单地连接调试器并修改进程的内存时间概念,无论是通过电话操作系统还是由应用程序保存。

评论


我认为您误解了“解释更多..”部分。相反,我已经假设移动应用程序用户更有可能将设备时间更改为作弊行为,这就是为什么我需要服务器时间来进行反检查。如果有更正确的方法可以做到,那么我无所不能。但是也感谢您的投入。

–保姆
18 Jun 8'在10:51



@Manny:将每个命令发送到服务器。让服务器验证所有操作。您可以在客户端代码中假设服务器将批准并执行结果。如果结果是服务器拒绝某项操作(例如,一秒钟后),请在客户端上还原。这样,您的服务器就是授权者。您的服务器(应该是)处于100%的控制之下,在那里您可以信任诸如系统时间之类的东西。

– marstato
18 Jun 8'在13:58



“泄漏”系统时间永远都不应固定。必须公开此信息以确保TLS和HTTP的正确运行。

–橙色狗
18年6月8日在18:00

@OrangeDog正是我在回答中所说的。

– MarcusMüller
18年6月8日在18:07

#3 楼

唯一可能真正暴露安全风险的是高精度计时器和性能计数器。这些可以用来精确计时服务器上某个加密过程需要多长时间,并从那里推断出秘密数据。

将数据计时到毫秒或正常的“滴答”速率不太可能暴露这种情况。 br />

#4 楼

服务器时间不是秘密。相反,强烈建议您将时间同步到外部客观时间源(例如通过时间服务器公开的原子钟)。

不作为秘密有两个后果:


您无需保护或隐藏它。您可以放心地假设攻击者能够弄清楚当前时间。
它不应对您希望保护或隐藏的任何东西起作用。例如,您不应从该时间派生任何密钥或机密。您正在使用的任何随机函数都不应使用当前时间作为种子(很多时候还是默认的),而应该使用更好的种子源。


#5 楼

知道服务器时间对攻击者几乎没有用。因此,在这里您应该找到可能的副作用。


对servlet的保护(以任何方式)是否比其他servlet的保护弱?对于DOS / DDOS攻击,不需要身份验证可能带来什么影响。如果在其他更安全的服务器中处理了身份验证,则可能很重要。反向代理有什么区别?
该Servlet中的安全漏洞有哪些风险?它是否遵循了与其他servlet相同的质量保险控制措施?它的维护周期如何?
它的servlet容器又如何呢?


#6 楼

我想通过指出这一假设来回答这个问题,那就是暴露服务器时间实际上是一种风险。任何设置为正确时间的服务器都将很容易受到攻击,因为正确或接近正确的服务器时间很容易被猜到。
这也意味着需要付出巨大的开发努力才能将错误的设置转换为正确的时间,以便在每个时间使用时间相关的应用程序。系统上的每个文件都将带有错误的时间戳。其他答案中提到了一些示例,但您还必须考虑通常必须正确设置时间的分布式应用程序或群集。基本上,您存储的任何与时间相关的信息都是有缺陷的。但是很可能还有很多其他问题您没有引起足够的重视。有关安全性相关问题和最佳做法,请参阅https://www.owasp.org/index.php/Main_Page。

#7 楼

我唯一能想到的是,如果您暴露了服务器的“正常运行时间”,这可能表明最近安装的补丁;但是我相信这通常不会公开显示-但是尚未检查,因此如果您有兴趣的话,可能值得确认。