背景:我正在开发一个使用持久TCP连接到后端服务器的移动应用程序(在线聊天)。在之前的版本中,我们使用了众所周知的加密方案来保护有效负载并使用共享密钥进行签名。这为数据篡改和逆向工程提供了足够的保护。但是流量仍然容易受到重播攻击:有人可以捕获网络流量并重放它,服务器会接受请求,因为它不知道它是真实的还是重放的。为了解决这个问题,我们引入了时间戳和nonce,它们可以防止重放攻击。
一切都很好。后来决定使用TLS(传输层安全性)来保护客户端和服务器之间的所有通信。实施TLS并为中间人攻击提供额外的保护层,我们在客户端上固定了服务器的公共证书。
这让我想到了一个问题:是否仍然需要使用自定义加密并防止重放攻击,因为TLS已经提供了针对这些的保护?在我的研究中,我发现TLS在传输过程中提供了保护,即防止中间人,但如果发起者本身想欺骗系统并修改有效载荷或重放流量会怎样? TLS是否可以防止故意欺骗者试图以某种方式拦截其操作系统网络层中的流量?我的理解是TLS提供端到端加密,但我怀疑TLS流量实际上可以在发起者希望的情况下重放。
我也知道基于内存的攻击,其中攻击者会修改设备上的这个修改有效负载的内存(甚至可能是记录和重放。)但是即使我们的自定义加密+重播后卫也无法防范这些。
来自:https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet#Benefits
“TLS还提供了两个通常被忽视的额外好处;完整性保证和重放防止.TLS通信流包含内置控件,以防止篡改加密数据的任何部分。此外,还构建控件 - in以防止捕获的TLS数据流在以后重播。
应该注意的是,TLS在传输过程中为数据提供了上述保证。 TLS不会为静态数据提供任何此类安全优势。因此,必须添加适当的安全控制措施,以便在应用程序内或数据存储库中静止时保护数据。“
答案 0 :(得分:1)
TLS仅保护传输,因此它仅提供对加密数据的修改或重放的保护。它不能防止在加密之前或解密之后对数据进行任何类型的修改或重放。通过TLS连接再次发送相同的数据实际上是完全有效的。
但是,用于检测重播的nonce和timestamp也不能防止修改或重放。发件人仍然可以使用相同的数据,但使用新的nonce和新的时间戳“保护”这些数据。只要攻击者能够修改客户端代码,如果客户端在攻击者拥有的系统上运行,就像在智能手机游戏中那样,那么根本不可能防止这种基于客户端的攻击。智能手机的拥有者喜欢作弊。