2011-02-01 38 views
8

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

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

我们面临的主要问题是系统需要部署在客户端的网站上,这是我们不一定信任的客户端。我们需要捍卫服务器上的数据,以及逆向工程中的软件本身。两者对我们都非常重要。

此外,我们需要一个杀死开关,我希望某些东西可以根据命令破坏数据和软件,或者如果无法在一定时间内致电回家。

我想到的方向是使用TPM或类似的东西 - 一些硬件加密解决方案,与另一种服务相结合,我们可以在内部保留这些服务以加密服务器上的所有软件和数据,以便密钥的意愿来自我们的服务器安全地在我们的网站,并可能从TPM的内存窗帘。

你如何解决这个问题?


UPDATE 04/02 我在寻找切实可行的建议,或产品,可以帮助我建议,所以我开始赏金......

看家伙我们基本上把我们的机器放在客户的网站上(出于商业和实际的原因),我们拥有这台机器,客户在几个小时内收到他所付的一切,他可以随心所欲地处理数据。但是我在那台机器上运行的算法,以及存储在那里的一些数据是我们想要保护的商业秘密。 理想情况下,我希望机器不工作,甚至不开机,如果我不说,这是好的,没有我的确定在机器上的一切保持加密。内存遮挡看起来也是在执行时保护机器的好方法。

理想情况下,我希望HD和所有机器上的存储器一旦有人用螺丝刀接近它们就会爆炸...... :-)但我认为这会花费太多......


UPDATE 10/02 OK在做了一些研究之后,我认为我们会尝试一些与PS3加密系统相同的方向,除了我们要带来解密软件和我们服务器数据的密钥。这样做,我们可以决定我们的机器是否信任请求密钥的服务器,我们可以通过重新设置机器来获得kill switch。这可能是基于TPM或类似的东西,也许英特尔的TXT ... 我也真的有兴趣在内存窗帘作为一项重要的安全功能...

顺便说一句,我们不能通过移动有价值的零件我们的系统到我们的网站,无论是因为业务需求,还是因为它不具备技术上的可行性 - 我们需要巨大的带宽......

+0

为使讨论更有意义:您认为攻击者会将什么样的努力放到您的系统中? (像租用一个集群,雇用10名安全研究员,每小时100美元,为期一个月,或类似) – wizzard0 2011-02-10 21:59:01

+0

> PS3加密系统 >业务需求 >巨大的带宽.... 另外,我见过一个系统这样的要求。在源代码中。与银行业务有关。所以,实践起来,我可以帮你设计它(不是真的相信你可以聘请一个完整的陌生人,但是)。 – wizzard0 2011-02-10 22:04:53

回答

10

你要求,实际上是什么,是求之不得的。这大致相当于游戏控制台的功能,您可以在不受信任的环境中运行可信平台。

考虑你是否可以把机器从1日遭到损害如果你能这样的假设下工作,那么事情就变得对你相当容易,但是,这并不可怕的声音在这里存活。

在实际上保证它而言,有几个顾虑:

  • 您必须加密文件系统和使用硬件解密
  • 您必须彼此隔离应用程序,所以在一个安全问题不妥协别人
  • 您必须规划发生安全问题,这意味着把减灾战略就像一个安全的虚拟机管理程序到位

我知道这些都是相当含糊的,但这真的是过去几年游戏机保护的历史 - 如果您对这种解决方法(和破解)感到好奇,请向控制台制造商寻求帮助。

这是从来没有完全成功地做到,但你可以显著提高进入的门槛。

+0

我无法将机器视为受损。我正在寻找相反的方法。将机器视为安全,并在其损坏后立即处理。基本上我正在寻找类似于游戏控制台上存在的东西,但对于企业服务器来说,并且要严格得多。而且我的迁移策略会在我认为已经受损的情况下彻底杀死机器。 +1顺便说一句,以便了解如何在游戏控制台上完成这些内容。 – 2011-02-04 13:21:24

4

...说实话,听起来好像你在问怎么把病毒写入你的应用程序,这让我认为你的客户可能有更多的理由不相信你而不是相反。

话虽这么说,这是有很多原因一个可怕的念头:

  1. 如果他们的互联网连接 死亡或他们移动办公 和断开机器的 位会发生什么?
  2. 如果你的代码错了,它会怎样? 失火?删除数据,即使 客户正确使用它?
  3. 我只能假设你的请求 意味着你的应用程序提供 没有备份功能。我的 是否正确?听起来就像我不会购买的 产品。
  4. 您的 应用程序管理的数据有多宝贵?如果是 删除了什么样的金融 这会导致客户的损失?您的法务部门已经 签收了 这并验证您不能持有 责任?
+0

首先,我不确定我是否需要一个关闭开关,我认为提供关键码来打开我们服务器上的所有内容就足够了......第二个客户端收到他在几个小时内收到的所有内容,只要我们完成处理,我们正在销售服务而不是软件。客户希望我们将实施服务的服务器放在网站上,我不希望他们有权访问我们实施服务的方式。第三,如果你没有提高生产力,那么请避免自己。 – 2011-02-01 21:43:23

4

这个问题每周2-3次提问,答案总是一样的 - 无论你给用户的是不是你的。

您可以让用户更难获取数据,但您无法完全阻止他到达目的地。您可以对数据进行加密,您可以将解密密钥保留在USB cryptotoken(不公开密钥)上,但理论上如果代码可以调用cryptotoken并要求它解密数据块,那么黑客可以复制你的代码(理论上),并使这个代码调用cryptotoken来解密所有数据。

实际上,任务可能会变得很复杂,以至于无法获取数据。此时您应该检查,解密数据对用户来说真的有多重要。

关于杀死开关:这是行不通的。决不。如果需要,用户可以制作副本并从备份中恢复。他可以更换电脑时钟。他甚至可能放慢计算机的时钟速度(如果数据非常有价值,那么投资到自定义仿真硬件是可行的)。

关于关键数据:有时会发现您的宝贵资产对其他任何人都没有多大价值[并且您的解决方案的其他方面是]。例如:我们提供我们的驱动程序产品的源代码。这对我们来说是最宝贵的资产,但用户不是为代码行付钱,而是为了获得支持,更新和其他好处。用户将无法有效使用[偷来的]源代码而不用投入金额,这与我们的许可证的成本相当。

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

一般而言,我可以考虑使用定制操作系统的一些定制硬件,像自动取款机一样密封(以便客户无法进入而不打破封条),定期检查等。这可能有效。所以这个任务不仅仅是技术性的,而且主要是组织性的 - 你需要定期检查机器等。

总结:如果数据价值,保持您的服务器上,并只提供互联网连接。否则,您只能将风险降至最低,而不能完全避免。

+0

这个软件对我们来说更重要,那么数据呢,我们又一次试图捍卫整个盒子。不是客户端机器上的软件,它是我们的机器,我们拥有它。 – 2011-02-04 13:05:08

+0

@Hellfrost密封盒子并实现自定义GUI,不会让用户获得管理员访问系统的权限。并定期检查印章。 – 2011-02-04 14:57:50

1

“有一个完全安全的系统的唯一方法是用锤子打破它”

这就是说,它可以有足够的想成为黑客螺丝,使之更麻烦比它的价值。如果机器是一个'黑匣子',他们不能直接访问它,而是有处理它的程序,那么你最大的威胁就是物理访问。您可以锁定箱子,甚至可以将一个小巧的易碎物品安装到箱子中,如果箱子被打开,它会被折断......确保您的服务人员总是更换这个物品......它会让您知道某人是否已经打开它没有授权(是的,这是一个旧的青少年技巧,但它的工作原理)。至于盒子本身,在物理上禁用任何您不需要的硬件(如USB端口)。

如果你正在处理一个机器,是不是一个黑盒子,加密了地狱的一切...... 256位加密实际上不可能没有密钥破解......然后的伎俩变得越来越关键。

从理论上讲,你可能有关键变化(通过重新加密的数据),并只能由直接与您的(安全)服务器通信的过程中检索。

此外,追踪一切发生的变化中,尤其是发生在正常使用的情况,软件什么。这在很大程度上不能保护你从别人谁是真的,真的确定......但它可以通知您,您的系统已经被入侵。 (你可以起诉任何人破门而入)

至于杀死开关......好吧,睡眠病毒在那里,但正如已经说过的,他们可能会被愚弄或偶然发生。我会建议,如果你怀疑违规,系统会用随机生成的密钥加密一切,然后把密钥发送到你的服务器(这样你就可以撤销破坏),而不是把它自己擦干净,然后'撕碎'用来包含密钥的文件。 (多种文件粉碎机在那里可能会破坏数据不够好,这是(几乎)不可能恢复。)

2

正如其他人说,没有灵丹妙药。用户可以关闭机器,将HD作为其他机器的奴隶,备份所有内容,反向引导您的代码,然后成功破解它。一旦用户对可执行文件进行了物理访问,它可能会受到影响,并且无法在100%的情况下将其停止。

你能做的最好的就是让潜在的黑客工作辛苦得要命,不过无论你做什么,它不会是牢不可破的。

中的一些错误的情况下使用的自我毁灭可以围绕由backup'd一切裂解装置进行加工。

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

如果软件在远程服务器的身份验证,这可以通过攻击客户端和circunventing认证进行加工。如果它从服务器获取密钥,则可以使用嗅探网络来拦截包含该密钥的服务器数据。如果服务器数据被加密,那么黑客可以通过分析未加密的软件并捕获未加密的数据来解密它。

特别是,如果他使用模拟器运行能够保存内存快照的软件(包括算法的未加密版本),那么对于黑客来说,任何事情都会容易得多。如果他可以在运行软件的同时直接操纵并锁定内存,则更容易。

如果你不希望你的不信任客户端都非常确定,则可以只复杂的事情,并希望他们将永远不会得到足够的能量和技能来沃辛打破它。

更好的解决办法,在我看来,是让所有的软件在您值得信赖的服务器,并让他们的服务器只问你的服务器来完成这项工作,并保持你的算法,在您的服务器。这比其他一切都更安全和简单,因为它消除了基本问题:用户不再拥有对算法的物理访问权限。您应该真的考虑通过消除将代码保留在客户端中的需求来实现此目的的方法。然而,即使这不是牢不可破的,黑客可以通过分析输入函数的输出来推断出算法的作用。在大多数情况下(看起来不是这种情况),算法不是系统中最重要的,而是数据。因此,如果你真的无法避免在不受信任的团队中运行算法,那么你不能做比你已经说过的更多的事情:加密所有东西(优先考虑硬件),验证和检查一切,破坏重要的数据在有人考虑备份它之前,如果你怀疑有什么不对,并且让别人破解它很难。


,但如果你真的想要一些想法,真要做到这一点,我们开始吧:

我可以建议你使你的程序突变。一世。E:当你解密你的代码时,用一个不同的密钥加密并丢弃旧密钥。从服务器获取一个新的密钥,并声明密钥本身的编码方式很难用服务器嘲弄新密钥泄漏的东西。保证密钥是唯一的,不会被重复使用。同样,这不是不可破解的(并且破解者会做的第一件事就是攻击这个特性)。

还有一件事:把很多不明显的红色鲱鱼,做无意义的奇怪的一致性检查,其中很多非功能性的虚假版本的算法,并添加了很多复杂的overbloat,有效地什么也没做,断言它按照预期从真实代码运行。让真正的代码做一些看起来很奇怪和无意义的事情。这使得调试和反向工程变得更加困难,因为破解者需要付出很多努力来分离什么是垃圾。

编辑:显然,使垃圾代码看起来比正确的一部分更好,所以一个黑客会先看看那里,有效地失去时间和耐心。不用说,混淆一切,所以即使破解者获得原始的未加密运行代码,它仍然看起来很混乱,很奇怪。

1

总结答案,是的。对于这个问题没有“完全安全”的解决方案,因为它需要homomorphic encryption(现在只存在于需要大量计算的有限原型中)。在实践中,您需要的是正确的需求工程和安全工程的组合(评估部署系统中的利益相关者,兴趣,有价值的资产,每个成功的攻击场景可能发生的攻击和损害以及防御它的成本)。

之后,您将看到保护不是真的需要,或者您可以部署一些合理的措施并用合法的东西覆盖其他“漏洞”,或者完全重新设计系统,从商业模式开始(不太可能,但也可能)。

一般来说,安全是系统工程问题,您不应该仅限于技术方法。

2

我知道其他人可能会在这个解决方案中发现漏洞 - 并且随时可以这么做,因为我以此为生,并欢迎挑战! - 但为什么不能做到这一点:

  1. 既然你都清楚地使用Windows,启用与最大的安全设置硬盘驱动器上的比特更衣室驱动保护。根据我的理解,这将有助于缓解克隆驱动器的人 - 如果我错了,就这么说! - 其内容将根据系统硬件设置进行加密。

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

  3. 禁用您未使用的任何帐户,并锁定系统帐户和组以仅使用您所需的帐户。用于设置活动目录和安全VPN的奖励点,以便您可以通过后门远程访问其网络,以便在不进行正式现场访问的情况下检查系统。

  4. 为了提高进入该技术所需的技术栏,请使用C++或其他非.Net语言编写软件,因为MSIL字节码可通过公共免费工具轻松解编为源代码,并且需要更多的技术技能来反编译装配中的某些东西,即使它仍然非常适合使用正确的工具。确保你启用了所有你将要使用的硬件的cpu指令,以进一步使问题复杂化。

  5. 让您的软件经常验证部署系统的硬件配置文件(唯一硬件ID)。如果失败(如硬件改变),它会自毁。

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

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

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

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

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

  11. 通过确保您的pid文件每隔一段时间更新一次当前时间,您可以帮助减轻人们与时钟混淆的时间;比较上次修改时间(作为文件系统上的加密数据及其文件属性)与当前时间的比较将是一个早期预警系统,用于人们是否与时钟连接。在检测到的问题上,爆炸。

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

  13. 所有密码学都应遵循FIPS指南。因此,请使用强大的加密技术,使用HMACS等。根据您当前的情况,您应该尝试达到FIPS-140-2-level-4规范,但可以理解的是,从经济角度和实际情况来看,某些要求可能并不可行,FIPS-140 -2级2可能是你的限制。

  14. 在所有的自毁案例中,首先让它回家给你,让你立刻知道发生了什么。

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

  1. 如果它不能打电话回家..作为最后一个努力的一个定制硬件设备连接到内部串行/ USB端口,该端口被设置为激活一个继电器,然后如果它检测到案件,硬件或软件篡改,则会启动一块Thermite。将它放在硬盘的顶部并将它们放置在主板上将最有效。但是,如果这不是美国军方批准的情况,那么您需要向法务部门查询许可证等,因为我假设您在美国。

  2. 要确保硬件没有被篡改,请参阅FIPS物理安全要求,以获取有关确保系统物理安全的更多详细信息。奖励积分,如果您可以看到有关使用旧式AS400机箱的现代机架作为伪装进行螺栓连接/焊接,以帮助减轻硬件的移动/篡改。年轻人不知道该怎么做,并担心打破“旧东西”,年长的人会想知道“wtf?”,而且大多数人都会留下血迹,以后可以用作篡改证据,如果他们经常篡改尖锐的情况下,至少根据我自己的经验。

  3. 在入侵通知的情况下,从轨道核武器..它唯一的方法是确定的。 ;)只要确保您具有填写的所有法律形式和访问要求,法律就能够减轻风险或责任;或者您可以设置您的通知系统,以便在您获得电子邮件时自动发送电子邮件/文字/电话告诉你它爆炸了。