在我的公司,我们正在开发一个由多个服务器组成的大型系统。 该系统由大约5个逻辑组件组成。数据存储在XML,MS SQL和SQLite中。它是一个.Net系统(主要是),组件使用WCF进行通信,以及一些自定义UDP。 客户端主要通过自定义UDP或WEB(ASP.NET& Silverlight)访问系统。
保护通信很简单,一些SSL,以及WCF上的一些安全性,我们已经完成了。
我们面临的主要问题是系统需要部署在客户的网站上,这是我们不一定信任的客户。我们需要保护服务器上的数据,以及软件本身的逆向工程。两者对我们都至关重要。
我们还需要一个杀戮开关,我希望根据命令销毁数据和软件,或者如果在一段时间内无法打电话回家。
我想到的方向是使用TPM,或类似的东西 - 一些硬件加密解决方案,结合我们可以在内部加密服务器上的所有软件和数据的另一项服务,以便密钥将会到来从我们的服务器安全地在我们的网站,也许从TPM的记忆窗帘。
你如何建议解决这个问题?
更新 04/02 我正在寻找实用的建议,或者对可以帮助我的产品提出建议,所以我开始给予赏金......
看起来我们基本上把我们的机器放在客户的网站上(出于商业和实用的原因),我们拥有那台机器,客户收到他在几小时内付出的所有费用,他可以随心所欲地处理数据。 。但我在那台机器上运行的算法,以及存储在那里的一些数据是我们想要保护的商业机密。 理想情况下,我希望机器根本不工作,甚至不启动,如果我不说它没关系,没有我的确保机器上的所有东西都保持加密状态。内存窗帘看起来也是一种在执行时保护机器的好方法。
理想情况下,我希望所有机器上的HD和存储器一旦有人用螺丝刀靠近它们就会爆炸...... :-)但我觉得这样做太过分了......
更新 10/02 好。在做了一些研究之后,我想我们将尝试与PS3加密系统一样的方向,除了我们将引入用于解密软件和来自我们服务器的数据的密钥。这样我们可以决定我们的机器是否信任服务器请求密钥,我们只需重新安装机器即可获得一个kill开关。这可能是基于TPM或类似的东西,也许是英特尔的TXT ...... 我对内存幕布作为一个重要的安全功能非常感兴趣...
顺便说一句,我们无法通过将我们系统的有价值部分移到我们的网站来解决这个问题,这既是因为业务需求,也是因为它在技术上不可行 - 我们需要一个巨大的带宽....答案 0 :(得分:10)
实际上,你所要求的是圣杯。这大致相当于为游戏控制台所做的事情,你可以在不受信任的环境中运行可信平台。
考虑一下你是否可以将机器视为从第1天开始受到损害。如果你可以在这个假设下工作,那么对你来说事情变得相当容易,但这在这里听起来并不可行。
在实际保护方面,有一些问题:
我知道这些都相当模糊,但这确实是过去几年游戏控制台保护的历史 - 如果你对如何一遍又一遍地解决(和破坏)感到好奇,那么看看控制台制造商。
它从未完全成功完成,但你可以大大提高进入门槛。
答案 1 :(得分:4)
...说实话,听起来你问的是如何在你的应用程序中编写病毒,这让我觉得你的客户可能有更多的理由不相信你,而不是相反。
由于种种原因,这是一个可怕的想法:
答案 2 :(得分:4)
这个问题每周要问2-3次,答案总是一样的 - 无论你给用户的是什么,都不再是你的了。
您可以让用户更难获取数据,但是您无法阻止他完全到达那里。您可以加密数据,您可以将解密密钥保存在USB cryptotoken(不泄露密钥),但理论上如果代码可以调用cryptotoken并要求它解密数据块,那么黑客可以复制您的代码(理论上)并使此代码调用cryptotoken来解密所有数据。
实际上,任务可能变得足够复杂,使得获取数据变得不可行。此时,您应该检查解密数据对用户的重要程度。
关于kill switch :这不起作用。决不。如果需要,用户可以制作副本并从备份中恢复。他可以改变电脑时钟。他甚至可能会减慢计算机的时钟速度(如果数据非常有价值,那么投资自定义仿真硬件是可行的)。
关于关键数据:有时事实证明,您的宝贵资产对其他任何人来说都没什么价值[并且您解决方案的其他方面也是如此]。示例:我们提供了驱动程序产品的源代码。它对我们来说是最有价值的资产,但用户不需要支付代码行,而是支付,更新和其他好处。如果不投入金额,用户将无法有效使用[被盗]源代码,与我们的许可证成本相当。
关于混淆:代码片段(例如VMProtect产品)的虚拟化似乎非常有效,但是,它也可以通过一定的努力来绕过。
总的来说,我可以想到一些定制的硬件和定制的操作系统,像自动取款机一样密封(这样客户无法在不破坏密封的情况下进入),定期检查等。这可能有效。因此,任务不仅仅是技术性的,而且主要是组织性的 - 您需要安排定期检查机器等。
总结:如果数据 有价值,请将其保留在服务器上并仅提供Internet连接。否则,您只能将风险降至最低,而不是完全避免风险。
答案 3 :(得分:2)
正如其他人所说,没有灵丹妙药。用户可以关闭机器,将HD作为其他机器的从属设备,备份所有内容,反向引导您的代码,然后成功破解它。一旦用户具有对可执行文件的物理访问权限,它就可能受到损害,并且在100%的情况下无法阻止它。
你能做的最好的事情就是让潜在的破解者的工作变得艰难,但无论你做什么,它都不会牢不可破。
如果出现问题,可以使用自我破坏可以通过备份所有内容的黑客来解决。
使用USB驱动程序中的密钥有助于使破解者的生活更加艰难,但最终可能被一个有能力的决定性破解者击败:未加密的代码不能处于加密状态(包括获取密钥的部分) ),这是最大的弱点。黑客攻击那部分代码以便在其他地方保存密钥会使密钥失效。
如果软件在远程服务器中进行身份验证,则可以通过攻击客户端并启动身份验证来实现此功能。如果从服务器获取密钥,则可以使用嗅探网络来拦截包含密钥的服务器数据。如果服务器数据是加密的,那么破解者可以通过分析未加密的软件并捕获未加密的数据来解密它。
特别是,如果他使用模拟器来运行能够保存内存快照的软件(包括算法的未加密版本),那么对于一个破解者来说将更加容易。如果他能在运行你的软件时直接操作和固定内存,那就更容易了。
如果你不希望你的不受信任的客户非常坚定,你可能会让事情复杂化,并希望他们永远不会获得足够的能量和技能来打破它。
在我看来,更好的解决方案是将所有软件都放在您信任的服务器中,让他们的服务器只是让您的服务器完成这项工作,并将您的算法保存在服务器中。这比其他任何东西都更安全,更简单,因为它消除了基本问题:用户不再具有对算法的物理访问权限。你真的应该通过消除将代码保存在客户端的需求来考虑这种方法。然而,即使这不是不可破解的,黑客也可以通过分析输入函数的输出来推断算法的作用。在大多数情况下(看起来这不是你的情况),算法并不是系统中最重要的,而是数据。
所以,如果你真的无法避免在不受信任的一方运行算法,你就不能做比你已经说过的更多的事情:加密一切(最好是在硬件中),验证和检查一切,破坏重要的如果你怀疑某些事情是错误的话,有人会考虑备份数据之前的数据,并且会让某些人难以破解它。
但是,如果你真的想要一些想法,并且真的想要这样做,那么我们就去了:
我建议你让你的程序变异。 I.E:当您解密代码时,使用不同的密钥对其进行加密并丢弃旧密钥。从服务器获取一个新密钥并断言密钥本身的编码方式是很难用提供受损新密钥的东西来模拟服务器。确保密钥是唯一的,并且永远不会重复使用。同样,这不是牢不可破的(破解者首先要做的就是攻击这个特性)。
还有一件事:放置很多非显而易见的红色鲱鱼,进行无意义的奇怪一致性检查,其中很多非功能性伪造版本的算法并添加了大量复杂的overbloat,实际上无效并断言它从真实代码中按预期运行。让真正的代码做一些看起来很奇怪和没有意义的事情。这使得调试和反向引擎变得更加困难,因为破解者需要花费大量精力来尝试将有用的东西与垃圾分离。
编辑:显然,让垃圾代码的一部分看起来比正确的更好,所以一个破解者会首先看到那里,实际上失去了时间和耐心。毋庸置疑,混淆了一切,所以即使破解者获得了简单的未加密的运行代码,它仍然看起来令人困惑并且非常奇怪。
答案 4 :(得分:2)
我知道其他人可能会在这个解决方案中找到漏洞 - 并且我可以自由地这样做,因为我这样做是为了谋生,并欢迎挑战! - 但为什么不这样做:
由于您正在使用Windows,因此请使用最高安全设置在硬盘驱动器上启用位锁定驱动器保护。这将有助于减轻人们克隆驱动器的理解 - 如果我错了,请这样说! - 其内容将根据系统硬件设置进行加密。
在硬件上启用TPM并为您的软件正确配置它。这将有助于阻止硬件嗅探。
禁用您未使用的所有帐户,并锁定系统帐户和组以仅使用您需要的帐户。设置Active Directory和安全VPN的奖励点,以便您可以通过后门远程访问其网络,无需进行正式的现场访问即可检查系统。
要提高进入此项目所需的技术条件,请使用C ++或其他非.Net语言编写软件,因为MSIL字节代码可通过公开免费工具轻松地解码为源代码。即使使用正确的工具仍然非常可行,他们需要更多的技术才能在装配中反编译某些东西。确保为将要使用的硬件启用所有cpu指令,以使问题更加复杂。
让您的软件经常验证已部署系统的硬件配置文件(唯一硬件ID')。如果失败(如在硬件中已经改变那样)让它自毁。
验证硬件后,从加载到加密RAM磁盘中的加密二进制映像加载软件,然后在(非固定!)内存中对其进行解密。不要固定它,或使用恒定的内存地址,因为这是一个坏主意。
要非常小心,一旦解密完成,密钥就会从RAM中删除,因为有些编译器会愚蠢地优化非安全的bzero / memset0调用,并将密钥保留在内存中。
请记住,安全密钥可以通过与其他内存块相关的随机性在内存中检测到。为了帮助减轻这种影响,请确保使用多个" dummy"如果使用的话,触发入侵检测和爆炸场景。由于您不应该固定密钥使用的内存,这将允许人们多次触发相同的虚拟密钥。如果您可以随机生成所有虚拟密钥,并且由于下面的#12,真正的密钥每次都不同,这样他们就不能简单地寻找不会改变的密钥,因为他们都会这样做。 / p>
使用多态汇编代码。请记住,程序集实际上只是可以根据指令和堆栈状态/之前调用的内容进行自修改的数字。例如,在简单的i386系统中,0x0F97(如上所述设置字节)可以很容易地完全相反(如果在下面设置字节)指令,只需减去5.使用您的密钥初始化堆栈并利用CPU的L1 / L2缓存,如果你真的想要努力去核心。
确保您的系统了解当前日期/时间并验证当前日期/时间是否在可接受的范围内。从部署前一天开始并将其限制为4年将与保修/支持下硬盘驱动器的硬件故障响铃曲线兼容,这样您就可以利用这种保护并在硬件更新之间留出足够的时间。如果验证失败,请将其自行终止。
您可以通过确保每隔一段时间更新当前时间来帮助缓解人们对时钟的误解;将其上次修改时间(作为文件系统上的加密数据及其文件属性)与当前时间进行比较将是一个早期预警系统,如果人们已经搞砸了时钟。检测到问题,爆炸。
所有数据文件都应使用在您的命令上更新自身的密钥进行加密。将系统设置为每周至少更新一次,并在每次重新启动时更新。将此添加到您应具备的软件更新服务器功能中。
所有加密都应遵循FIPS指南。所以使用强加密,使用HMACS等。考虑到你目前的情况,你应该尝试达到FIPS-140-2-level-4规格,但可以理解的是,从经济的角度来看,有些要求可能是不可行的,而且实际上,FIPS-140 -2级-2可能是你的限制。
在所有自我毁灭的情况下,先让它给你回家,这样你就可以立即知道发生了什么。
最后是一些非软件解决方案:
如果它不能打电话给家...作为最后的努力,自定义硬件设备连接到内部串行/ USB端口,设置为激活继电器,然后如果检测到任何一种情况,就会引发一块Thermite ,硬件或软件篡改。将它放在硬盘驱动器的顶部并将它们放在主板上将是最好的工作。但是,如果这不是美国军方批准的情况,您需要向您的法律部门查询所需的许可证,因为我假设您在美国。
要确保硬件未被篡改,请参阅FIPS物理安全要求,以获取有关确保系统物理安全的更多详细信息。如果您能看到将您使用的现代机架用螺栓固定/焊接到旧的AS400机箱作为伪装,以帮助减轻硬件的移动/篡改,则可获得奖励积分。年轻人不会知道该做什么,并担心打破"吮吸旧东西"老年人会怀疑" wtf?",并且大多数人都会留下可以使用的血液后来作为篡改的证据,如果他们篡改经常锋利的案件,至少根据我自己的经验。
在入侵通知的情况下,从轨道上进行核武器......这是确定的唯一方法。 ;)只需确保您已填写所有法律形式和访问要求,以便法律对减轻风险或责任感到满意......或者,您可以设置通知系统,以便在您获得告诉你它爆炸的通知。
答案 5 :(得分:1)
“拥有完全安全系统的唯一方法就是用锤子粉碎它”
也就是说,有可能与潜在的黑客搞混,足以让它比它的价值更麻烦。如果机器是一个“黑匣子”,他们无法真正直接访问它,而是有程序处理它,那么你最大的威胁就是物理访问。您可以锁定箱子,甚至可以将一个小的易碎物品装入箱子中,如果箱子被打开就会被折断...确保您的服务人员总是更换这个物品...它会告诉您是否有人打开它没有授权(是的,这是一个古老的青少年技巧,但它的工作原理)。至于盒子本身,物理上禁用你并不绝对需要的任何硬件(如USB端口)。
如果你正在处理一个不是黑盒子的机器,那就加密了所有的东西......如果没有密钥,256位加密实际上是无法破解的......那么技巧就变成了关键。 / p>
理论上,您可能会拥有密钥更改(通过重新加密数据),并且只能由直接与您的(安全)服务器通信的进程检索。
此外,跟踪框中发生的所有事情,特别是在正常使用之外的软件中发生的任何事情。其中大部分内容无法保护您免受真正,非常坚定的人的影响......但可以提醒您系统已遭到入侵。 (你可以起诉那些闯进来的人)
至于杀戮开关......好吧,睡眠病毒就在那里,但正如所说的那样,它们可能被愚弄或意外引爆。我建议不要擦干净,如果你怀疑有破坏,让系统用随机生成的密钥加密所有内容,将密钥发送到你的服务器(这样你就可以撤消损坏),然后“粉碎”用于包含密钥的文件。 (许多文件粉碎机可以很好地破坏数据,几乎不可能恢复。)
答案 6 :(得分:1)
总结答案,是的。这个问题没有“完全安全”的解决方案,因为它需要homomorphic encryption(现在只能以有限原型的形式存在,需要大量的计算)。
在实践中,您需要的是适当的需求工程和安全工程的组合(评估利益相关者,利益,部署系统中的宝贵资产,可能的攻击和每个成功攻击场景的损害VS成本来防御它。)< / p>
在那之后,你会发现实际上并不需要保护,或者你可以部署一些合理的措施并用合法的东西覆盖其他“漏洞”,或者从业务模式开始完全重新设计系统(不太可能,但也可能。)
通常,安全性是系统工程问题,您不应仅限于技术方法。