大多数当前和历史上的计算机和网络安全问题都可以归结为一个观察结果:让别人控制我们的设备对我们是有害的。以后,我会解释我所说的“其他人”和“坏”是什么意思。出于本文的目的,我将完全专注于我所说的内容控制。我们失去对设备控制的一种方式是外部分布式拒绝服务(DDoS)攻击,它使网络充满了不必要的流量,没有给真正的(“想要的”)流量留下空间。其他形式的DDoS类似于低轨道离子炮(LOIC)的攻击,例如,它可能不会完全填满网络,但它可以使Web服务器忙于响应无用的攻击请求,服务器无法响应任何有用的客户请求。不管怎样,DDoS都意味着外界正在控制我们的设备,这对我们是不利的。
监视、泄露和其他形式的隐私损失通常采取恶意软件或硬件(所以,“恶意软件”)的形式,它们以某种方式进入你的设备,添加诸如读取你的地址簿或监视你的按键并向外部报告这些信息的功能。恶意软件供应商通常比我们作为用户(或制造商)更了解我们的设备,尤其是当他们毒害了我们的供应链时。这意味着我们有时会使用我们不认为是可编程的设备,但这些设备实际上是由一个知道某些漏洞或秘密握手的外部人员编程的。监视和泄露只是设备在做它的主人不知道、不喜欢和无法控制的事情的例子。
由于互联网是一个分布式系统,它涉及在计算机和智能手机等设备之间发送消息,每台设备都包含一些硬件和软件。到目前为止,恶意软件注入这些设备的最常见方式是故意发送畸形信息,利用接收设备的硬件或软件中的漏洞或漏洞,使我们认为的数据变成代码。在可以从其他设备接收消息的设备中,大多数防御机制都阻止将预期包含文本、图形或电子表格的数据传输到其他设备代码这意味着向设备发出指令,告诉它如何操作(或定义其功能)。杀毒软件的失败承诺是恶意软件可以通过模式匹配检测到。今天,我们使用反病毒工具来清理受感染的系统,但我们知道,我们不能指望及时检测恶意软件来防止感染。
所以我们加固我们的设备,试图防止外部的数据变成内部的代码。我们关闭不必要的服务,我们打补丁并更新我们的操作系统,我们使用防火墙来控制谁可以访问我们无法关闭的服务,我们用加密方式签名并验证我们的代码,我们在程序内存中随机分配对象的位置,因此,如果来自外部的数据确实以某种方式变成了我们设备内部的代码,这些代码会猜测错误的位置,从而不会伤害我们。我们使我们的设备内存的某些部分仅为数据,而其他部分仅为代码,因此一次成功的攻击将把外部的数据放入我们设备内存中不允许执行代码的部分。
我们记录对系统的访问,对防火墙的访问,以及对网络的流量,试图校准正常的,以突出异常的。我们购买了网络信誉系统的订阅,这样其他已知感染了恶意软件的设备就无法访问我们的服务。我们在客户注册系统中添加验证码,以防止僵尸网络创建假账户,从我们的边界内攻击我们。我们把每个面向互联网的服务都放在自己的虚拟机中,所以成功的攻击只会影响到我们企业的一小部分。
然后,在花费了所有这些复杂的防御之后,我们中的一些人继续安装一个动态内容管理系统(DCMS)作为我们面向公共的Web服务器。这种方法就像建造了一个强大的有围墙的城市,然后邀请特洛伊木马进去,或者使阿喀琉斯除了他的脚跟以外,没有任何伤害。WordPress和Drupal就是数百个dcms的例子。dcms在网站管理中有一个很好的和必要的位置,但这个位置不是在我们的代码暴露于外部数据的第一线。
dcm的吸引力在于,非技术编辑可以对网站进行更改或添加,而这些更改几乎可以立即被公众或客户看到。在万维网的早期,网站是使用UNIX服务器上的文本编辑器用原始HTML编写的,这意味着,在Web的早期,所有的出版物都涉及能够在UNIX文本编辑器中处理原始HTML的技术用户。虽然我个人认为那是“过去的好时光”,但我也承认,当完全由技术用户控制Web时,它既没有今天那么有趣,也没有今天那么高效。dcm使网络能够实现印刷机的承诺,使每个人都成为潜在的出版者。当与公众对话的能力被限制在富人、权贵或技术高超的人才能使用时,人类社会就无法繁荣发展。
动态内容管理系统对使用它的操作者来说是极其危险的。
然而,DCMS对于使用它的操作者来说是极其危险的。这是因为用于编写dcms的计算机语言具有不可思议的能力和灵活性,以及dcms本身的能力和灵活性。dms让我们有机会在外部的数据和内部的代码之间重新战斗,并且经常再次失败。大多数用于编写Web应用程序(如dcms)的计算机语言都包含一个称为eval
在那里,编程指令可以在运行时有意地从数据提升到代码。我知道这听起来很疯狂,也确实很疯狂,但是eval
仅仅是另一个怎样的例子所有的电动工具都能杀人。在熟练的人手中,eval
是一个成功的制造者,但当它留给不熟练或恶意的用户时,eval
是灾难的根源。如果您想知道当攻击者找到一种新的方法来攻击您的代码时,他们会有多兴奋和高兴eval
他们的数据,在网上搜索“小鲍比表”。
但即使没有eval
在用于编程DCMS的底层计算机语言中,或者在用于管理该程序的长期数据(如学生记录)的数据库中,大多数DCMS都是内部数据驱动的,这意味着DCMS软件通常被构建得像一个机器人,将网站的内容视为一组要遵循的指令。要攻击DCMS,让它将数据转化为代码,有时只需要添加一篇特殊格式的博客文章,甚至是对现有博客文章的评论。为了保护DCMS免受这种攻击,需要审计用于DCMS编程的每一个软件碎片,包括计算机语言解释器;所有代码库,特别是Open SSL;操作系统,包括其内核、实用程序和编译器;Web服务器软件;以及任何安装在DCMS旁边的第三方应用程序。(提示:这太荒谬了。)
让我们暂时从远程代码执行漏洞(将外部数据提升为可执行代码)回到DDoS。即使您的DCMS是完全非交互式的,例如它从不向用户提供输入的机会,url和请求环境变量的输入数据路径已经经过了仔细的审计,并且没有像Bash那样安装在与Web服务器相同的计算机上,对于DDoS攻击来说,DCMS仍然是一个“踢我”的标志。这是因为每个DCMS页面视图都涉及到在Web服务器上运行一些很小的软件,而不仅仅是返回之前生成的一些文件的内容。在现代计算机上执行代码相当快,但仍然比返回预生成文件的内容慢得多。如果有人使用LOIC或任何类似的工具攻击Web服务,那么攻击者消耗DCMS所需的时间将比消耗静态或基于文件的服务所需的时间少1000倍。
精明的读者会注意到我的个人网站是一个DCMS。我不会用“鞋匠的孩子不穿鞋”这样蹩脚的辩解,我要指出DCMS的吸引力是如此明显,即使我能看到它们,我也不喜欢在不需要的时候使用UNIX文本编辑器处理原始HTML,而且我的个人Web服务器不是收入来源,也不包含任何敏感数据。我确实时不时会收到DDoS攻击,我不得不定期删除大量的垃圾评论。拥有它的总成本很低,如果你的企业网站和我的个人网站一样不重要,那么你应该像我一样自由地运行一个DCMS。(提示:在你的企业网站上挂一个“踢我”的牌子可能对生意不好。)
在工作中,我们面向公众的网站是完全静态的。有一个内容管理系统(CMS),但它是非常技术性的,它需要使用UNIX文本编辑器,一个叫做GIT的版本控制工具,以及一种叫做Markdown的语言知识。这让我们的非技术员工(包括业务团队的一些成员)感到沮丧,但这意味着我们的Web服务器不运行任何代码来呈现Web对象,只返回使用Ikiwiki CMS预生成的文件。Bricolage是另一个非动态CMS的例子,但它对非技术WYSIWYG用户来说比Ikiwiki更友好。请注意,没有人是防ddos的,无论他们的营销文献或年度报告可能说什么。我们都生活在一个缺乏任何形式的准入控制的互联网上,因此大多数低投资的攻击者可以轻而易举地干掉大多数高投资的防御者。然而,我们确实可以选择我们的网站是否挂着“踢我”的标志。
有一种混合模型,我称之为主要是静态的在这里,所有的样式表、图形、菜单和其他对象都是预先生成的,这些对象不会在视图之间更改,可以被许多查看器共享,并作为文件提供。在查看器登录之前,Web服务器不会代表查看器执行任何代码,甚至在登录之后,每个页面视图返回的大多数对象都是静态的(来自文件)。这比a更不安全完全静态的但对于许多Web服务运营商来说,这是一个现实的妥协。我说“不太安全”,是因为攻击者可以在服务中注册一些帐户,以便使以后的攻击更有效。大量创建帐户是僵尸网络的一项常见任务,因此大多数允许在线注册的Web服务运营商都试图使用验证码来保护他们的服务。
基本静态的模型也适用于内容分发网络(CDNs),在CDNs中,您的观看者的Web浏览器连接到的实际前端服务器位于云的某个地方,由专家操作,并且大量过度配置,以应对除最高级别的DDoS攻击外的所有攻击。为了实现这一点,网站必须向静态对象(如图形、样式表和JavaScript文件)发出可缓存的信号。这就告诉CDN提供商,它可以通过网络分发这些文件,并将它们多次返回给许多查看者,如果是DDoS攻击,则多次返回给许多攻击者。当然,一旦用户登录到站点,就会出现一些动态内容,这时CDN将把请求传递给真正的Web服务器,DCMS将再次暴露给外部数据。这必须永远成为一个值得关注、警惕、谨慎和应急计划的理由。
作为一种几乎是cdn的混合模型,一个基本静态的DCMS可能放在前端Web代理(如Squid或mod_proxyApache的特性。这不会像外包给CDN那样保护你的网络免受DDoS攻击,但它可以保护你的DCMS资源免于耗尽。请注意,任何静态模型(CDN或非CDN)仍然无法保护您的DCMS代码不暴露于外部数据。这对安全行业中的大多数人来说意味着,如果可以使用静态发布模型满足Web服务的业务目的,那么静态比静态要好。
因此,如果你真的想运行基于web的服务,就不要在上面贴上“踢我”的标签。要么静下来,要么回家。
相关文章
在queue.acm.org
在苹果里发现不止一条虫子
迈克平淡
http://queue.acm.org/detail.cfm?id=2620662
内部访问控制
Geetanjali Sampemane
http://queue.acm.org/detail.cfm?id=2697395
DNS的复杂性
保罗使得
http://queue.acm.org/detail.cfm?id=1242499
数字图书馆是由计算机协会出版的。版权所有©2015 ACM, Inc.
根据我的经验,更多的项目失败是因为他们是错误的设计,不能满足用户的需求,而不是因为糟糕的代码。我编写中等规模的业务应用程序,在大多数项目中,我的客户和我都不知道需要什么来满足业务目标。有时,企业只知道他们有一个瓶颈,但不知道什么样的应用程序可以解决这个问题。
在这一点上,我找到的唯一解决方案是进行一轮分析,然后进行原型设计。在那之后,就是创建试探性设计的时候了,要记住,在别人看过你的第一次尝试后,如果没有找到更好的解决问题的方法,项目就不会完成。适当管理的变更可以是一个健康项目的标志。
可能有些项目是预先知道的,但这并不能描述我的实践。
显示1评论