WEB安全 第一课 信息安全速览 |
我们首先解释清楚安全领域涵盖哪些方面,以及为什么在这个早已被研究得很透彻的领域里,Web应用的安全仍然值得引起额外的关注。
1.信息安全速览 🧠🚘🫖❓🐂 表面上看来,信息安全领域属于计算机科学里很成熟、明确且硕果累累的一个分支,自以为无所不知的专家们通过展现他们那分类清晰、数量庞大的安全漏洞集来标榜这一领域的重要性。至于那些漏洞的责任嘛,就全都归到那些“安全文盲”的程序员们头上好了,而理论家们则会从旁指点,说只要遵从今年最热门的某某安全方法学,早就能把这些问题都防患于未然了云云。 安全问题更是带动了一个产业的繁荣,但对用户来讲,从普通计算机用户到庞大的国际公司等,其实并没有带来什么有效的安全保障。 从根本上来说,过去几十年,我们甚至没能构建出一个哪怕原始但至少还算可用的框架来理解和评估现代软件的安全性。除了几篇出色的论文和一些小范围内取得的经验,甚至无法拿出什么有说服力的真实的成功案例。现在的侧重点几乎都放在一些响应性质的、次要的安全方法上(如漏洞管理、恶意软件和攻击的检测、沙盒技术以及其他),要不就是常常对别人代码里的漏洞指指点点。 🙏🌧🍌❌🐉 一个令人不安而又秘而不宣的实情是:如果安全系统是由别人开发的,那我们贡献的价值实际上往往乏善可陈;在现代Web这件事情上则更是如此。 ✌🗼🍪🚷🐡 让我们来看看以下几种最瞩目的信息安全之道,并尝试分析一下为什么到目前为止,它们也没能走出这一困境。 #f466: 1.1正统之道的尴尬 👨⚕️🕶🪓😳👍 也许开发一个安全程序最直接的途径就是从算法上证明该程序的运行是正确的。从直觉来说,这个简单的假设听起来还蛮有道理的——那为什么此路不通呢? 首先让我们讨论一下作为形容词时“安全”这两字的含义。准确来说,它到底是什么意思呢?安全(Security)听起来很直观,但在计算机领域,就愣是没法给它下一个确切的定义。没错,我们可以用一些很眩目但基本没啥意义的方式来描述安全,例如,在业界经常被引用的一个关于安全的定义如下,但实际上它也是有问题的: 🧑💻🧢🪦😚👄 引用 这个定义很简洁,也大致描述了一个抽象的目标,但它几乎没提到要怎么做才能达成这个目标。虽然这句话的主题是关于计算机科学的,但其笼统程度,和维克多•雨果的一句诗倒有异曲同工之妙: 引用 也许有人会反对说,这个棘手的定义不应该求诸于商业界,那好,我们只管把这个问题抛给学术界吧,但他们也只会给出一个差不多的答案。例如,下面这个常见的学术界对安全的定义,它出自20世纪60年代出版的贝尔-拉帕杜拉安全模型(Bell-La Padula security model,这套规范是企图规范化安全系统需求的诸多努力之一,这是一套针对国家机器的规范;当然也是最知名的一套规范。)👦🩴🪓🤔🤳 引用 当然,像这些定义安全的文字从根本上来说都是正确的,用于论文的基调甚至政府规范都毫无问题。但实际上,对真实世界里的软件工程而言,由于以下三个原因,以这些理论为基础建立的模型几乎是没用的。 👩👓🗑🤑👍 ◆对一个足够复杂的计算机系统来说,没有办法定义什么是正确的行为。对一个操作系统或者Web浏览器来说,没有一个权威机构能定义什么是“应该的方式”或者“安全的状态”。最终用户、系统所有者、数据提供者、业务流程所有者和软件硬件开发商之间的利益是南辕北辙,并且说变就变——如果公司的股东们可以为所欲为,能够不加掩饰地优先考虑自己的利益,就更是如此了。 雪上加霜的是,社会学和博弈论的研究表明,把各方利益做简单的叠加运算,实际上并不能产生互赢的结果。这种两难的困局就叫“公地悲剧”,在日后的互联网发展里它将一直是争论的焦点。 👩💍🔭😡🙌 ◆美好的想法无法自动转换成规范的约束条件。即使通过给出系统应包含哪些具体用例,我们能就系统该有的行为达成完美的、高级别的共识,但这些用例几乎不可能与可允许的输人数据、程序的状态和这些状态的转换一一对应起来,而要做正式的系统分析却需要这种对应关系。 很简单,譬如,一个很常识性的概念“我不希望别人越权读到我的电子邮件”,却没有办法很好地翻译成数据模型。也许有些剑走偏锋的方法的确能把这种模糊的需求部分地转换成规范化的表达,但对软件开发过程带来严重的限制,并产生比验证算法(Validated Algorithm)更复杂的许多规则集和模型。并且,这些方法自身的正确性也还需要进一步验证……这样就走进了一个死循环。 👃🗼🍓🆎🦌 ◆很难令人信服地分析软件的行为。在复杂的真实世界的场景里,完全没有办法令人信服地通过对计算机程序的静态分析,证明程序的运行是符合详细设计规范的(当然,在高度受限的环境下或针对一个非常狭义的目标还是有可能办到的)。很多案例在实际环境中是无解的(因为计算的复杂程度),甚至有可能由于停机问题(halting problem)而完全无法确定其状态。 👄⛄🦀♊🐡 对安全的这些早期定义既模糊又没用,但令人抓狂的是,尽管几十年过去了,事实上我们取得的进展却非常有限。2001年由Naval Research Laboratory发布的一份学术报告回顾了软件安全领域的早期工作,结果也不过是给软件安全提供了一个更随意的枚举式的定义——而且这个定义还明确否认其自身并不完善和不完整。 这篇论文也回顾和评估了那些早期的安全定义,并指出BLP模型为了保持理论上的纯洁性而做出了无谓的牺牲。 经验显示,一方面,作为公理的Bell-LaPadula模型的限制太多:它禁止了在实际应用中一定会出现的用户操作。另一方面,为了克服某些限制条件,它提供的可信对象机制又变得不够严格……导致的结果是,开发人员不得不为每个系统里受信任过程的合理行为,都要设定一个专门的规范。🧓👓🪓😭🤌 最后,不论引入多少这种优雅的彼此竞争的安全模型,它们都期望基于也许注定失败的算法,来理解和评估现实世界里的软件安全性。这让开发人员和安全专家没办法对产品代码的质量进行权威的有预见性的判断。那么,我们还有什么选择呢? #f466: ✌🧳🍭❌🐝 1.2进入风险管理 由于缺乏正式的保障,也没有什么实证可用的方法,而商业社会极度依赖的关键性软件又让人心惊肉跳地存在着大量的安全问题,所以业界开始争先恐后地引人另一个抓人眼球的概念:风险管理。 风险管理的理念在保险界大获成功(金融界里的风险管理好像就要逊色那么一点点了),它只是告诉系统所有者应该学会在考虑性价比的情况下,必须接受漏洞必然存在这一现实。一般来说,可以用以下公式计算出为此风险该付出多少代价:🧑🚀🧥🖥😃🙌 引用 例如,根据这一公式,假设某台不太重要的工作站每年受到的攻击对生产效率的影响少于1000美金,那么该机构对修复这类损失就应该谨慎投入,不用太费神,无需为此花上譬如10多万美金,来引入额外的安全措施应对意外情况,并制订监控计划以避免这些损失。根据风险管理的精神,主要投资应该花在运行关键性任务的主要设备上,进行隔离、加固和监控,因为这些关键性设备处理着客户所有的付账记录呢。 根据目标安排优先级自是理所当然的。但问题是,风险管理主要是和数字打交道,它对帮助我们理解、覆盖和管理真实世界里的问题并无多大裨益。它反而带来一种错误的危险观念:不到位的措施只要被条理化了就能变得合理了,不足的金钱投入再加上风险管理,就能和充足的安全投入达到相似的安全成效。 👩✈️💍📬😉🧠 想碰运气吗?没门呐。#y432: ◆在互联的系统里,损失是没有上限的,范围也不会只固定在单个设备上。严格意义上的风险管理是评估某个资源被攻破时会遭受到多少常规损失和最大损失。遗憾的是,这么做其实忽略了很多重大的安全攻击事件——如针对TJX和微软的攻击——它们在最开始时都是针对一些相对不重要和被忽略的入口点。 👨⚕️🥾📐🤩🦴 但这些开始不起眼的攻击会迅速升级,绕过任何表面的网络隔离,最后几乎完全攻破关键性运营设备。典型的风险管理只关注数字,而和其他节点比起来,初始的事故点往往权重都比较低。同样,因为被利用的可能性较低,能逐步接入敏感资源的内部攻击途径也往往会被忽视了。然而,这两种被忽视的组合会导致代价高昂的损失。 ◆健康系统的贡献实际上弥补不了系统被入侵后的非经济损失。系统被入侵会导致客户信心的受损,业务的中断,甚至可能惹上官司,以及受到监管部门严厉调查等风险,在这些方面很难有什么可靠的保障。至少在理论上,被入侵的后果有可能拖垮一个公司甚至整个行业,浅层地评估它们会带来什么影响,那几乎都只是瞎猜而已。\ ✍🛑🦀➡🐴 ◆现有的数据对日后的风险也许完全没意义。与轻微交通事故里的涉事者完全两样,攻击者可不会挺身而出拱手道出事情的原委,更不会事无巨细地记录下事故的损失。除非人侵的程度严重到令人瞠目(因为攻击者的疏怠或攻击的原意就是要搞破坏),通常人侵行动压根就不会被发现。 🧠🧳🍇🔞🪶 即使行业自身也会报告这类入侵数据,但并没什么方法证实报道的数据是否完整,也搞不清楚会给现在的业务再带来多少风险。 ◆基于统计数据的预测对独立事件来说并不靠谱。尽管普通人在城市里遭到雷击的可能性应该大于被熊袭击,那也不等于我们就该在帽子上戴根避雷针,然后天天泡在蜜糖水里洗澡吧。从单一事件来说,其实无法确定特定的模块会否受到攻击:安全事件几乎是一定存在的,有无数暴露在外的资源,任何服务都有可能受到攻击——所以在企业内部,不太可能说因为哪个特定的服务受到的攻击量特别多,就可以在统计学上预测出有意义的入侵。 💅🛩🍪🆘🐡 #f466: 1.3分类学的启发 以上讨论的两种思想学派有一个相通之处:都认为可以把安全分解成若干可计算的目标,由此就能优雅地得到一套统一的安全体系理论或一套能接受的风险管理模型,进而抽象出一些经过优化的底层行为,然后就能借此设计出完美的应用来。 👊🚠🫑♊🐕 而某些从业者则鼓吹相反的做法,他们不太考虑理论体系,更偏向自然科学的做法。这些从业者就像信息时代的达尔文,他们通过收集足够多的实验数据进行底层抽象,对这些日益复杂的规律进行观察、重组和记录,以期获得某种安全运算的统一模型。 由美国国土安全局资助的CWE(Common Weakness Enumeration,常见漏洞列表)项目就反映了这种理念。该项目的目标,用它自己的话来说,就是创建一套统一的“漏洞理论”,“以改进对软件缺陷的研究、建模和分类”;并“提供一套通用对话语言,以便于讨论、挖掘和处理软件安全漏洞的成因。”这套体系里的漏洞分类复杂得令人眼花缭乱,它的某些例子可能类似如下这样: 👆🏦🍓🚭🐻 引用 到今时今日,CWE的词典列表里收录了800多条,其中大多数条目在促进交流方面的效果都和上述引用的例子相差无几,并不容易理解。 另一个受自然主义思想影响,但略有差异的学派支持的是CVSS(Common Vulnerability Scoring System)项目,这个项目由商业机构资助,目标是用一套只有机器能读懂的基本参数,精确量化已知的安全问题。一个真实的漏洞描述可能如下表示: 👦🧥🪦🤔👌 引用 机构和研究者期望通过这14项评估因子,根据不同的用例场景,严谨地对潜在漏洞的重要程度打分,达成一个客观、可验证的数字分值(如“42”),这样就完全无需根据主观因素来判断安全漏洞的严重程度。 🤳🌦🥚📳🐉 没错,我是有点儿嘲笑这些项目,但我也完全无意贬低它们的贡献。CWE、CVSS及其相关项目都胸怀远大目标,如为大型机构的安全事务处理提供更可管理的维度。然而,它们都未能在软件安全这个问题上,诞生出一套真正雄伟的理论体系。而我怀疑在可见的未来也不可能出现这样的理论体系了。 #f466: 1.4实际的解决之道 🧓🧦🛏😇👃 现在所有的迹象都表明安全问题与算法无关。可以理解,业界是心不甘情不愿地接受这一结论的,因为这意味着没法到处去吹嘘我们拥有一劳永逸的解决方案(当然,如果在商业上能获得成功就更称心了);然后一旦被逼急了,安全圈内的人们又只能回退到诸多最基础的老路子上去。这些方法和诸多新的业务管理模式并不是很兼容,但到目前为止,这些招数是唯一还算管用的法子。这些老方法包括: ◆从失败(最好是别人的失败)中学习。系统设计应尽量避免出现已知的缺陷。尽管没有自动的解决方案(甚至可能连优雅的方案也欠奉),但最好能不断修正程序的设计指引,确保开发人员知道什么地方有可能出现问题,为他们提供一些工具,尽量以最简单的方式来避免任务出错。 🧑🎤🧢📱☠ ◆开发一些工具来检查和纠正问题。一般而言,安全上有欠缺不会产生明显的副作用,除非它们被恶意的入侵者利用:但这种反馈成本实在太昂贵了。为解决这个问题,我们可以创建各种安全质量保障(QA)工具,以验证程序的实现是否正确,执行定期的审核以检测是否有一些无意中出现的错误(或者系统工程上的缺陷) ◆先做最坏的打算。尽管我们已经尽了最大的努力来避免出现问题,但历史也一再教育我们,还是有可能会出现严重的安全事故。所以要引人恰当的组件隔离、访问控制、数据冗余、监控和响应流程,使服务的相关人员可以在事件还未从小事故演变成大灾难前做出及时的响应。 👳🥼⌨😆🤙 无论如何,信息安全人员都需要具备足够的耐心、创造力和深厚的技术积累。 当然,即使这些最简单和常识性的规则一一差不多也就是安全工程的基本要求吧——也会经常被包装成一堆由缩写拼就的闪壳词语以抓人眼球(如CIA:代表“Confidentiality、Integrity、Availability”,意即“保密、完整、可用”),还有各种所谓的“方法学”。一般而言,这些方法学不过是把安全业界里那些叫人无比沮丧的失败涂脂抹粉一番,摇身变为另一个成功故事而已,最后再把一堆号称包治百病的产品或认证卖给那些好骗的冤大头客户。尽管这些产品号称无所不能,但它们实际上还是没法取代技术人员对实际环境的把握和对技术的精通——至少现在办不到。 🧑🚀🧦🪣😫✊ 无论如何,在以后,我会尽量避免建立或重复前面提到过的任何一种宏伟框架,相反,我会采用不那么理论化的做法。在后文中我们会先回顾现代浏览器的方方面面,讨论如何安全地使用相关工具,Web在哪些方面会被广泛误解,以及出了问题的时候需要怎样控制连带的损失。 我认为这些才是谈论安全工程时的要点。#y439: WEB安全第二课:
帖子热度 1.3万 ℃
|
|
对于作为社会主义的打好男人,我你这样做对得起社会,对得起人民吗?我只想说4个字:请带上我!#379:
|