2010-09-22 35 views
4

在客户端 - 服务器应用程序中,服务器如何知道请求来自真正的应用程序,而不是来自其被篡改的副本? 我还没有开发客户端和服务器应用程序。解决方案可能是纯插座,wcf,IIS托管或任何其他。如何确保.Net应用程序是真的?

+0

“篡改”是什么意思? – NullUserException 2010-09-22 22:41:02

+0

我的意思是假装是一个真正的应用程序。 – Eduardo 2010-09-23 00:56:21

+0

*然后它是做什么*?到目前为止,您还没有对*资源*提出*威胁*。那么,如果第三方客户端使用你的服务器呢? *谁受伤?*请告诉我们关于这种情况,因为那是你应该实际分析的情况。在进行安全分析时,始终以*威胁*开始,而不是*漏洞*开始。也就是说,不要从“这个窗口被解锁”开始,而是从“有人可能试图窃取我的电视”开始。如果您从漏洞入手,那么您可能会错过一个漏洞,或者您可能会减轻错误的威胁。 – 2010-09-23 14:07:32

回答

7

真的没有办法。任何你可能要求提供的应用程序,一个流氓应用程序可能会欺骗。最终的答案是你不应该相信任何客户端应用程序。您可以信任用户提供的身份验证,但客户端本身100%不可信。

为了说明这一点,我可以通过代理服务器运行所有流量并随意注入/删除消息。那么你有一个合法的客户与虚假消息。

现在,如果你正在谈论一个你打算在客户端使用的库,确保它没有被篡改,那就是强大的命名组件。但那不会帮助你通过电线。

3

您无法“保证”您使用的是真实客户端。电脑里确实没有“秘密”。只有更难以发现的事实。有些事情可以使您的客户更有可能成为真正的交易:

  • 身份验证。数字签名,内部哈希以及用户提供的数据都可能使您更倾向于与您交谈的内容。但是,程序可能会被使用您的客户端程序集作为傀儡的恶意软件劫持。即使您的代码没有可公开访问的钩子,但获取使用SkipVerification运行权限的恶意软件或黑客可以反映到您的程序集并调用私有成员。

  • 安全监控。您创建的客户端可以定期询问Windows当前谁的代码中有内存挂钩。如果有人正在倾听客户端或使用它,客户端无法识别或服务器已识别为敌对客户端,则客户端可能会崩溃并刻录,并且服务器知道客户端已被入侵。这通常很难解决,但有关安全过程的知识可以通过快速工作以避免安全“巡逻”,或者通过劫持客户端到Windows的钩子来询问可疑活动来帮助妥协。

  • 行为监控。如果客户端开始发送无意义的消息,或者每隔一段时间都不会发送“仍在此处,仍然健全”的消息,则服务器可以检测到客户端出现问题并对待它如可疑,要么完全忽略它,要么限制敏感数据。同样,知道客户端应该发送什么,或者捎带客户端,可以让攻击者欺骗预期的行为。

2

许多公司通过在每端部署数字证书(称为双向或双向身份验证)确保客户端和服务器之间存在信任通道。实际上不可能窥探或欺骗已启用相互身份验证的应用程序之间的任何通信。

当然,这只能保护通道,而不能保护客户端应用程序本身。确保客户端完全防篡改的唯一方法是实施保护正在运行的应用程序(即ATM和POS机)的物理安全控制。

1

我同意Hounshell的评论,因为网上的所有数据都应该视为不可信。然而,您可以采取一些步骤来增加所需攻击的复杂性并防止客户轻易被篡改,例如建议使用强名称。 Authenticode证书还可以防止代码被篡改,并确保来自特定源的软件是真实的。

您也可以在客户端和服务器之间实现身份验证,凭据身份验证仅基于用户已知的数据(未写入代码)。这规避了篡改客户端的有效性,因为攻击者如果没有必要的凭据来验证服务器,就无法真正实现更多功能。为了完成攻击,他们需要在传输过程中拦截数据,或者在用户机器上安装某些东西(无论如何它都是游戏)。

为保护传输中的数据免受数据窃听(中间人攻击)攻击,您需要对数据进行加密。这可以通过客户端和服务器之间的SSL通信来实现,只要执行一些基本检查即可。客户端应确保证书由受信任的根CA签署,尚未过期,并针对与所调用的URL相匹配的URL发布。

+4

您必须使用正确的安全技术来完成正确的工作。强名称绝对不是用于验证客户端**,所以**不要将它们用于**。强名称旨在帮助*用户*对安装在他们计算机上的应用程序进行信任决策*,而不是帮助*服务器*对*客户端*做出信任决定。使用安全技术的目的不是它的目的,比根本不使用安全技术更糟糕;使用它会产生错误的安全感,这比安全性较弱的正确感更糟。 – 2010-09-22 23:37:28

+0

完全同意 - 强名称的建议是为了防止篡改客户端,可能会对服务器造成攻击。它绝不会使服务器与任何更可信的服务器通信,但它是提高安全性并提高攻击所需工作量的另一环节。 – TheCodeKing 2010-09-22 23:44:21

1

您无法远程验证应用程序。

您可以对用户进行身份验证,并且可以防止中间人攻击。但是,如果您认为已通过身份验证的用户本身是敌对的,并且可能会篡改应用程序,那么就无法阻止这种情况的发生。

最好的办法是验证所有输入,为服务器上的操作保留关键部分,记录每个经过验证的用户的所有活动,并尽可能限制用户可以通过系统或通过系统造成的损害。

相关问题