8

在我的公司,我们正在开发一个由多台服务器组成的大型系统。该系统由大约 5 个逻辑组件组成。数据存储在 XML、MS SQL 和 SQLite 中。这是一个 .Net 系统(大部分),组件使用 WCF 和一些自定义 UDP 进行通信。客户端主要通过自定义 UDP 或 WEB(ASP.NET & Silverlight)访问系统。

保护通信很容易,一些 SSL 和 WCF 上的一些安全性,我们就完成了。

我们面临的主要问题是系统需要部署在客户的站点上,我们不一定信任的客户。我们需要保护服务器上的数据以及软件本身免受逆向工程的影响。两者对我们都至关重要。

我们还需要一个终止开关,我想要一些破坏数据和软件的东西,根据命令,或者如果在一段时间内无法打电话回家。

我正在考虑的方向是使用 TPM 或类似的东西 - 一些硬件加密解决方案,结合我们可以在内部保留的另一个服务来加密服务器上的所有软件和数据,以便密钥将来自我们的服务器安全地在我们的站点中,并且可能会从 TPM 中屏蔽内存。

你建议如何解决这样的问题?


更新04/02 我正在寻找实用的建议,或者对可以帮助我的产品提出建议,所以我开始赏金......

伙计们,我们基本上是把我们的机器放在客户的网站上(出于商业和实用性的原因),我们拥有那台机器,客户在几小时内收到他支付的一切,他可以随心所欲地处理数据。但是我在那台机器上运行的算法,以及存储在那里的一些数据是我们想要保护的商业机密。理想情况下,如果我不说没问题,我希望机器根本不工作,甚至不启动,如果没有我的好,机器上的所有内容都保持加密状态。内存窗帘看起来也是在执行时保护机器的好方法。

理想情况下,我希望所有机器上的 HD 和存储在有人用螺丝刀靠近它们时立即爆炸...... :-) 但我认为这太过分了......


更新10/02 好的,在进行了一些研究之后,我认为我们将尝试与 PS3 加密系统相同的方向,除了我们将引入用于解密软件和来自我们服务器的数据的密钥。这样做我们可以在我们的机器上决定我们是否信任请求密钥的服务器,我们可以通过重新安装机器来获得一个终止开关。这可能是基于 TPM 或类似的东西,也许是英特尔的 TXT ......我也对内存帘作为一个重要的安全功能很感兴趣......

顺便说一句,我们无法通过将系统的有价值部分移动到我们的站点来解决这个问题,这既是因为业务需求,也是因为它在技术上不可行——我们需要巨大的带宽......

4

7 回答 7

10

实际上,您所要求的是圣杯。这大致相当于对游戏控制台所做的,在游戏控制台中,您有一个在不受信任的环境中运行的受信任平台。

考虑一下您是否可以从第一天起就将机器视为受到损害。如果您可以在这种假设下工作,那么事情对您来说会变得容易得多,但这在这里听起来不太可行。

在实际保护它方面,有几个问题:

  • 您必须加密文件系统并使用硬件解密
  • 您必须将您的应用程序彼此隔离,以便一个安全问题不会危及其他应用程序
  • 您必须为安全问题的发生做好计划,这意味着实施安全管理程序等缓解策略

我知道这些都相当模糊,但这确实是过去几年游戏机保护的历史——如果你对如何一遍又一遍地解决(和破坏)这个问题感到好奇,看看游戏机制造商.

它从未完全成功地完成,但您可以显着提高进入门槛。

于 2011-02-01T21:50:22.307 回答
4

...老实说,这听起来像是您在问如何将病毒写入您的应用程序,这让我认为您的客户可能有更多的理由不信任您而不是相反。

话虽这么说,这是一个糟糕的主意,原因有很多:

  1. 如果他们的互联网连接中断或他们移动办公室并断开机器一段时间会发生什么?
  2. 如果您编码错误并且失火怎么办?即使客户使用正确,也要删除数据?
  3. 我只能假设您的请求意味着您的应用程序不提供备份功能。我对么?听起来完全像我不会买的产品。
  4. 您的应用程序管理的数据有多大价值?如果删除,会给客户带来什么样的经济损失?您的法律部门是否已签署并确认您无需承担责任?
于 2011-02-01T21:39:36.977 回答
4

这个问题每周被问 2-3 次,答案总是一样的——你给用户的任何东西都不再是你的了。

你可以让用户更难获取数据,但你不能阻止他完全到达那里。您可以加密数据,您可以将解密密钥保存在 USB cryptotoken 上(不会暴露密钥),但理论上如果代码可以调用 cryptotoken 并要求它解密数据块,那么黑客可以复制您的代码(理论上)并使此代码调用cryptotoken来解密所有数据。

实际上,任务可以变得足够复杂,以至于无法获取数据。此时您应该检查解密数据对用户的真正重要性。

关于终止开关:这不起作用。绝不。如果需要,用户可以制作副本并从备份中恢复。他可以改变电脑时钟。他甚至可以减慢计算机的时钟(如果数据如此宝贵,以至于投资定制仿真硬件是可行的)。

关于关键数据:有时事实证明,您的宝贵资产对其他人来说确实没有什么价值[而您的解决方案的其他方面也是如此]。示例:我们提供驱动程序产品的源代码。它对我们来说是最有价值的资产,但用户支付的不是代码行数,而是支持、更新和其他好处。用户将无法有效使用 [被盗] 源代码,而无需投入与我们的许可证成本相当的资金。

关于混淆:代码片段的虚拟化(例如 VMProtect 产品)似乎非常有效,但是也可以通过一定的努力绕过它。

一般来说,我可以想到一些带有定制操作系统的定制硬件,像自动取款机一样密封(这样客户在不破坏密封的情况下无法进入),并定期检查等。这可能有效。因此,这项任务不仅是技术性的,而且主要是组织性的——您需要安排对机器等进行定期检查。

总结一下:如果数据很有价值,请将其保存在您的服务器上并仅提供 Internet 连接。否则只能将风险降到最低,而不能完全避免。

于 2011-02-01T21:46:35.057 回答
2

我知道其他人可能会在这个解决方案中戳破洞 - 并且可以随意这样做,因为我以做这种事情为生,并欢迎挑战!- 但为什么不这样做:

  1. 由于您显然使用的是 Windows,因此请使用最大安全设置在硬盘驱动器上启用 bit-locker 驱动器保护。据我了解,这将有助于减轻人们克隆驱动器的风险-如果我错了,请直说!- 它的内容是否会根据系统硬件设置进行加密。

  2. 在硬件上启用 TPM 并为您的软件正确配置它。这将有助于阻止硬件嗅探。

  3. 禁用您未使用的任何帐户并锁定系统帐户和组以仅使用您需要的内容。设置 Active Directory 和安全 VPN 的奖励积分,因此您可以通过后门远程访问他们的网络以检查系统,而无需进行正式的现场访问。

  4. 为了提高进入该领域所需的技术门槛,请使用 C++ 或其他一些非 .Net 语言编写软件,因为 MSIL 字节码很容易通过公开可用的免费工具反编译成源代码,并且反编译需要更多的技术技能即使使用正确的工具仍然非常可行,也可以组装一些东西。确保为您将使用的硬件启用所有 cpu 指令,以使事情进一步复杂化。

  5. 让您的软件每隔一段时间验证已部署系统的硬件配置文件(唯一硬件 ID)。如果失败(因为硬件已经改变)让它自毁。

  6. 一旦硬件经过验证,从加载到加密 RAM 磁盘中的加密二进制映像加载您的软件,然后在(非固定!)内存中解密。不要固定它,或者使用恒定的内存地址,因为这是一个坏主意。

  7. 要非常小心,一旦解密完成,密钥就会从 RAM 中删除,因为某些编译器会愚蠢地优化非安全 bzero/memset0 调用并将您的密钥留在内存中。

  8. 请记住,可以通过它们相对于其他内存块的随机性在内存中检测到安全密钥。为了帮助缓解这种情况,请确保您使用多个“虚拟”键,如果使用这些键,则会触发入侵检测和爆炸场景。由于您不应该固定键使用的内存,这将允许人们多次触发相同的虚拟键。如果您可以随机生成所有虚拟密钥,并且由于下面的#12,每次都不同的真实密钥,那么他们就不能简单地寻找不变的密钥......因为他们都这样做了。

  9. 利用多态汇编代码。请记住,程序集实际上只是可以根据堆栈的指令和状态/之前调用的内容进行自我修改的数字。例如,在一个简单的 i386 系统中,0x0F97(如果在上面设置字节)很容易通过简单地减去 5 来完全相反(如果在下面设置字节)指令。如果你真的使用你的键来初始化堆栈并利用 CPU 的 L1/L2 缓存想去硬核。

  10. 确保您的系统了解当前日期/时间并验证当前日期/时间在可接受的范围内。从部署前一天开始并将其限制为 4 年,这将与保修/支持下硬盘驱动器的硬件故障钟形曲线兼容,因此您可以利用此类保护并在硬件更新之间留出良好的时间。在此验证失败时,让它自我毁灭。

  11. 您可以通过确保您的 pid 文件每隔一段时间更新当前时间来帮助减轻人们对时钟的困扰;将其上次修改时间(作为文件系统上的加密数据及其文件属性)与当前时间进行比较将是一个预警系统,以防人们是否搞砸了时钟。在检测到问题时,爆炸。

  12. 所有数据文件都应使用根据您的命令自行更新的密钥进行加密。将您的系统设置为至少每周更新一次,并在每次重新启动时更新。将此添加到您应该拥有的软件从您的服务器更新的功能中。

  13. 所有密码学都应遵循 FIPS 指南。所以使用强加密,使用 HMACS 等。鉴于您目前的情况,您应该尝试达到 FIPS-140-2-level-4 规范,但可以理解的是,从经济角度来看,有些要求可能不可行,实际上,FIPS-140 -2-level-2 可能是你的极限。

  14. 在所有自毁案例中,首先让它给您打电话,以便您立即知道发生了什么。

最后是一些非软件解决方案:

  1. 如果它不能打电话回家.. 作为最后的努力,连接到内部串行/usb 端口的自定义硬件设备被设置为激活继电器,然后如果它检测到任何情况、硬件或软件篡改,就会触发一个 Thermite 块. 将它放在硬盘驱动器上并将它们放在主板上会做得最好。但是,如果这不是美国军方批准的情况,您将需要向您的法律部门查询所需的许可证等,因为我假设您在美国。

  2. 为确保硬件未被篡改,请参阅 FIPS 物理安全要求,了解有关确保系统物理安全的更多详细信息。如果您能看到将您使用的现代机架螺栓/焊接到旧 AS400 机箱中作为伪装,以帮助减轻硬件的移动/篡改,则可以获得奖励积分。年轻人不知道该怎么做,担心打破“吸老东西”,年长的人会怀疑“wtf?”,大多数人都会留下血迹,如果他们经常篡改,以后可以用作篡改的证据锋利的案例,至少根据我自己的经验。

  3. 在入侵通知的情况下,将其从轨道上击落……这是唯一确定的方法。;) 只需确保您填写了所有法律表格和访问要求,以便法律对降低风险或责任感到满意……或者您可以将通知系统设置为自动通过电子邮件/短信/电话向人们发送通知告诉你它爆炸了。

于 2012-06-01T16:59:39.493 回答
2

正如其他人所说,没有灵丹妙药。用户可以关闭机器,将 HD 作为其他机器的奴隶,备份所有内容,逆向引擎代码,然后成功破解。一旦用户对可执行文件有物理访问权,它就有可能受到损害,并且在 100% 的情况下没有办法阻止它。

你能做的最好的事情就是让一个潜在的破解者的工作变得非常困难,但无论你做什么,它都不是牢不可破的。

在出现问题的情况下使用自我毁灭可以通过备份所有内容的破解者来解决。

在 USB 驱动程序中使用密钥有助于使破解者更加困难,但最终会被有能力的破解者打败:解密事物的代码不能处于加密状态(包括获取密钥的部分),所以这是一个很大的弱点。破解那部分代码以将密钥保存在其他地方会破坏密钥。

如果软件在远程服务器中进行身份验证,则可以通过攻击客户端并绕过身份验证来实现。如果它从服务器获取密钥,则可以使用嗅探网络来拦截包含该密钥的服务器数据。如果服务器数据被加密,破解者可以通过分析解密它的软件并钓鱼未加密的数据来解密它。

特别是,如果破解者使用模拟器来运行能够保存内存快照的软件(包括算法的未加密版本),那么对破解者来说,一切都会变得容易得多。如果他可以在运行您的软件时直接操纵和固定内存,那就更容易了。

如果你不期望你不信任的客户非常坚定,你可以把事情复杂化,并希望他们永远不会有足够的精力和技能来打破它。

在我看来,更好的解决方案是将所有软件放在您受信任的服务器中,让他们的服务器只要求您的服务器完成这项工作,并将您的算法保存在您的服务器中。这比其他任何事情都更安全、更简单,因为它消除了根本问题:用户不再可以物理访问算法。您真的应该考虑一种方法,通过消除将代码保留在客户端中的需要来做到这一点。然而,即使这不是牢不可破的,黑客也可以通过分析输入函数的输出来推断算法的作用。在大多数情况下(看起来不是你的情况),算法不是系统中最重要的,而是数据。

所以,如果你真的无法避免在不受信任的一方运行算法,那么你只能做你已经说过要做的事情:加密所有内容(尤其是在硬件中),验证和检查所有内容,在有人之前销毁重要数据如果您怀疑有问题,请考虑备份它,并使其难以破解。


但是,如果您真的想要一些想法,并且真的想要这样做,那么我们开始吧:

我可以建议你让你的程序变种。IE:当你解密你的代码时,用不同的密钥加密它并丢弃旧密钥。从服务器获取一个新密钥,并断言该密钥本身的编码方式很难用提供受损新密钥的东西来模拟服务器。确保密钥是唯一的并且永远不会重复使用。同样,这不是牢不可破的(破解者要做的第一件事就是攻击这个特性)。

还有一件事:放置许多不明显的红鲱鱼,它们会进行无意义的奇怪一致性检查,其中有很多您的算法的非功能性伪造版本,并添加了许多实际上什么都不做并断言它运行的复杂过度膨胀正如真实代码所期望的那样。让真正的代码也做一些看起来很奇怪和无意义的事情。这使得调试和逆向工程变得更加困难,因为破解者需要付出很多努力才能将有用的内容与垃圾内容区分开来。

编辑:很明显,让垃圾代码的一部分看起来比正确的代码更好,所以破解者会首先看那里,实际上是在浪费时间和耐心。不用说,混淆了一切,所以即使破解者得到了纯未加密的运行代码,它仍然看起来很混乱,很奇怪。

于 2011-02-09T23:01:08.190 回答
1

“拥有一个完全安全的系统的唯一方法是用锤子砸碎它”

也就是说,有可能与潜在的黑客搞得一团糟,以至于造成的麻烦超过了它的价值。如果机器是一个“黑匣子”,他们不能真正直接访问它,而是有处理它的程序,那么你对它的最大威胁就是物理访问。您可以锁定箱子,甚至可以在箱子中安装一个小的、易碎的物品,如果箱子打开就会被折断...确保您的服务人员总是更换这个物品...如果有人打开了它会通知您它未经授权(是的,这是一个老少年的把戏,但它有效)。至于盒子本身,请物理禁用您绝对不需要的任何硬件(如 USB 端口)。

如果您正在处理一台不是黑盒的机器,请对所有内容进行加密......如果没有密钥,256 位加密实际上是不可能破解的......那么诀窍就变成了获取密钥。

从理论上讲,您可能会更改密钥(通过重新加密数据)并且只能通过直接与您的(安全)服务器通信的进程来检索。

此外,跟踪盒子上发生的所有事情,尤其是软件中出现的超出正常使用范围的任何事情。其中大部分内容并不能保护您免受真正、真正有决心的人的伤害……但它可以提醒您您的系统已被入侵。(在此之后,您可以起诉闯入的人)

至于杀戮开关……嗯,潜伏病毒就在那里,但正如前面所说,它们可能会被愚弄或意外触发。我建议不要将自己擦干净,如果您怀疑存在违规行为,请让系统使用随机生成的密钥加密所有可能的内容,将密钥发送到您的服务器(这样您就可以撤消损坏),然后“粉碎”用于包含密钥的文件。(那里的许多文件粉碎机可以很好地破坏数据,以至于(几乎)无法恢复。)

于 2011-02-08T21:02:42.740 回答
1

总结答案,是的。这个问题没有“完全安全”的解决方案,因为它需要同态加密(现在只以有限原型的形式存在,需要大量的计算)。

在实践中,您需要的是适当的需求工程和安全工程的结合(评估利益相关者、利益、部署系统中的宝贵资产、每个成功的攻击场景可能的攻击和损害以及防御成本。)

在那之后,您要么会发现实际上并不需要保护,要么您可以部署一些合理的措施并用合法的东西来弥补其他“漏洞”,或者从商业模式开始重新设计系统(不太可能,但也可能)。

通常,安全性是系统工程问题,您不应仅限于技术方法。

于 2011-02-10T08:47:46.877 回答