如果我创建一个公开返回服务器时间的 servlet(不需要身份验证),这会是一个安全问题吗?我想不出这有什么问题,但不知怎的,有些事情告诉我我可能是错的。
更详细地说,移动应用程序将使用此端点来增强其安全性(通过调整设备日期来避免作弊)。
如果我创建一个公开返回服务器时间的 servlet(不需要身份验证),这会是一个安全问题吗?我想不出这有什么问题,但不知怎的,有些事情告诉我我可能是错的。
更详细地说,移动应用程序将使用此端点来增强其安全性(通过调整设备日期来避免作弊)。
服务器时间对攻击者几乎没有用处,一般来说,只要它是准确的。事实上,所揭示的不是当前时间(毕竟,除了相对论物理学,时间在任何地方都是一致的),而是时间偏差。请注意,即使您没有明确显示时间,通常也有很多方法可以获取本地服务器时间。例如,直到 1.2 版(包括 1.2 版)的 TLS将当前时间嵌入到握手中,网页可能会显示动态页面的最后修改日期,HTTP 响应本身可能会在响应标头中包含当前时间和日期等。
了解服务器的确切时钟偏差只是非常具体的威胁模型中的一个问题:
时钟偏差可用于攻击对 Tor 隐藏服务进行去匿名化。
编写不佳的应用程序可能会使用服务器时间来生成秘密值。
RTC 的环境条件可能会在人为的情况下暴露出来。
“Servlet”听起来好像您已经在那里运行了一个复杂的服务器。
协议泄漏服务器时间的方式有很多。例如,HTTP 有一个流行的创建/修改时间标头字段,如果使用得当,动态生成的数据将始终具有当前系统时间。
出于 TLS 身份验证的原因,您甚至可以使用过期的客户端证书进行二进制搜索以查找端点的日期和时间。
这是一个必要的坏事——如果你在做 TLS,你的服务器需要有一个时间概念来知道什么是有效的密钥/证书,什么不是。如果是这种情况,这很可能是 NTP 协调的时间。因此,您真的无法说出攻击者不知道的有关服务器的任何信息——实际上只有一个“正确”时间。
如果您不使用 TLS:泄漏系统时间可能不是您应该解决的第一件事。
关于安全性:不太确定您是否应该公开另一个 servlet 只是为了让设备计算世界时间。
更详细地说,移动应用程序将使用此端点来增强其安全性(通过调整设备日期来避免作弊)。
红旗。您依赖于您的客户未修改的安全性。永远不要那样做。您根本无法相信用户设备上发生的任何事情。这些不是您的设备。他们可以简单地连接调试器并修改进程的内存时间概念,无论是由手机的操作系统还是由您的应用程序保存。
唯一可能真正暴露安全风险的是高精度计时器和性能计数器。这些可用于精确计时某些加密过程在服务器上花费的时间,并从中推断出秘密数据。
将数据计时到毫秒或正常的“滴答”率不太可能暴露这一点。
服务器时间不是秘密。相反,强烈建议您将时间同步到外部客观时间源(例如通过时间服务器公开的原子钟)。
不作为秘密有两个后果: