麻省理工学院的课程“计算机系统安全”。 第11课:Ur / Web编程语言,第1部分

麻省理工学院。 讲座课程#6.858。 “计算机系统的安全性。” Nikolai Zeldovich,James Mickens。 2014年


计算机系统安全是一门有关开发和实施安全计算机系统的课程。 讲座涵盖了威胁模型,危害安全性的攻击以及基于最新科学研究的安全技术。 主题包括操作系统(OS)安全性,功能,信息流管理,语言安全性,网络协议,硬件安全性和Web应用程序安全性。

第1课:“简介:威胁模型” 第1 部分 / 第2 部分 / 第3部分
第2课:“控制黑客攻击”, 第1 部分 / 第2 部分 / 第3部分
第3讲:“缓冲区溢出:漏洞利用和保护” 第1 部分 / 第2 部分 / 第3部分
讲座4:“共享特权” 第1 部分 / 第2 部分 / 第3部分
讲座5:“安全系统从何而来?” 第1 部分 / 第2部分
讲座6:“机会” 第1 部分 / 第2 部分 / 第3部分
讲座7:“本地客户端沙箱” 第1 部分 / 第2 部分 / 第3部分
讲座8:“网络安全模型” 第1 部分 / 第2 部分 / 第3部分
讲座9:“ Web应用程序安全性” 第1 部分 / 第2 部分 / 第3部分
讲座10:“符号执行” 第1 部分 / 第2 部分 / 第3部分
第11课:“ Ur / Web编程语言” 第1 部分 / 第2 部分 / 第3部分

Nikolai Zeldovich:让我们开始吧! 因此,今天我们将讨论一种创建安全的Web应用程序的完全不同的基本方法。 这是关于一个名为Ur / Web的系统的。 现在,该系统的作者,麻省理工学院的一位教授亚当·奇帕拉(Adam Chipala)将向您介绍他创建的系统。



亚当·奇帕拉(Adam Chipala):我想尽快参加游行。 但在此之前,我将展示一些幻灯片来解释该系统的内容。 从今天的讲义中,您可能已经对此有了一些想法。

那么什么是Ur / Web? 从主题标题含义的解释开始总是有帮助的。 Ur / Web主要是用于构建Web应用程序的编程语言。 这就是Web的名称。 这是一种成熟的堆栈系统,可完成创建Web应用程序所需的一切。 Ur表示用于实现这些Web功能的新通用编程语言。

Ur / Web的全部重点在于,所有这些都已集成到自定义Ur / Web编程语言中,而不是使用通用编程语言,库和传统框架来创建Web应用程序。 这是一种在运行时涉及编译而不是解释的语言。 从某种意义上说,编译器了解Web应用程序应该做什么。 与常规的Java编译器不同,它会指出您正在犯的错误,而Java编译器不了解您在哪里出错。

开发该语言时,我尝试使用了三个主要原则:编程效率,安全性和性能,尤其是在服务器端进行扩展。 在这种情况下,第二个最相关。

在大多数情况下,应用程序的用户不会注意到客户端性能上的小问题,但是即使是服务器端的小问题也可以使您购买比必要数量更多的服务器。



目前,Ur / Web的用户已经很多,但是使用其他编程语言的用户并不多。 但是至少它是唯一的商业Web应用程序,它是RSS阅读器,并且支持诸如显示注释之类的奇特功能。 还有一个由非英语母语者发明的URL,他现在对此名称感到遗憾。 它被称为BazQux Reader,它是黑客社区的战术技能的结合。 该应用程序已经有数千名付费用户。 而且看起来与CSS相比,处理起来要好得多。 这证明可以使用Ur / Web完成此操作。

随时可以打扰我,尽管我可能仍然没有弄清楚是什么原因引起的。 因此,Ur / Web销售的主要成功之处在于,它具有与Django截然不同的非常高级的编程模型,您可以从以前的讲座中了解到。 而且他有一个很好的安全故事。

为了安全起见,您希望具有的某些功能已集成到系统中,因此您无需费劲即可确保程序安全。 我将在不久的将来告诉您更多信息。

此外,即使与更流行的Web应用程序创建工具相比,该语言也可以提供很高的服务器端性能,我想您已经听说过它。 需要注意的是,在使用Ur / Web之前,我们可能需要从功能编程语言(例如Haskell)中学习更多的想法。

我查看了本课的问题和答案,大约有五分之一的学生抱怨编程的功能部分难以完成。 我很抱歉,但是函数式编程领域有很多好主意,要从那一刻开始就很难,要逐渐添加一些更复杂的东西。 但是,我将尽量不要求对我今天要谈论的材料有严格的了解。

因此,这种编程模型实际上与静态类型密切相关。 而且,这不仅是像Java语言中那样具有相对缺乏表现力的笨拙类型系统的静态类型,而且还类似于Haskell或Apache Camel中使用的静态类型。 这种键入是编译器了解您在做什么并捕获程序错误的一种方式。



事实证明,构建Ur / Web的主要Ur语言具有非常有表现力的静态类型系统。 实际上,库没有提供Ur / Web所做的许多事情,而没有特殊的编译器支持。 例如,我们教编译器如何检查SQL查询的类型,而无需创建将SQL输入到编译器的规则。 它们可以被编码为库,并使用标准的验证类型来确保您的SQL查询遵循SQL规则。

在这种情况下,最相关的是确保高级别的安全性-在Ur / Web上编程时,大多数最常见的安全漏洞是不可能的。 您可以永远告别恶意代码注入攻击和跨站点脚本攻击。 您可以允许看上去恐怖的标志名执行Web应用程序中可以完成的最可怕的事情,即使您确实使用其他人的界面功能导致某种“黑魔法”。

我还将在以后讨论其他几个特定于安全性的属性。 性能也很好。 编译器主要针对创建域源代码进行了优化,并且比C语言中的手写代码要高效得多。

因此,他了解Web应用程序在做什么,并且可以优化传统通用类型编译器无法“捕获”的某些功能。 因此,在服务器上运行的该编译器生成的源代码可以与C代码成功竞争,如果将确保性能的成本与使用其他语言进行编程的人工成本进行比较,我们会发现Ur / Web大大简化了程序员的寿命。

以下幻灯片显示了此第三方Web基础结构框架性能的快速基准。

这是最后一次测试的结果的屏幕快照,其中不同的框架执行了各种Web编程任务。



您可以看到,Ur / Web在参与性能测试的60个框架中排名第四。 截取此屏幕快照后,对该编译器进行了一些其他改进。 因此,我希望在下一轮中,根据他的成绩,他会稍微进步。 基本上,这是使用SQL生成HTML页面的简单示例。 您每秒从Ur / Web服务器接收大约100,000个请求,这对于大多数应用程序来说已经足够了。 重要的是,此幻灯片指示您可以使用高级模型,该模型可以通过稍微降低较常见框架的性能来提供更高的安全性。

因此,让我从反映我对当今程序员对使用最常见框架编写Web应用程序的想法的印象开始。 然后,我将向您展示Ur / Web提供的另一种观点,根据这种观点,在该框架上,很多可能出错的地方都没有出错。

主要图片是一个Web服务器,您的应用程序的整个过程都取决于它。 并且有大量浏览器要与此服务器进行交互。 服务器将保持某种状态,以确保与所有这些浏览器的交互。

通常的情况是浏览器通过向HTTP服务器发送HTTP请求开始与Web服务器进行交互,该HTTP请求包括内置的URL。 之后,Web服务器将HTTP和HTML页面发送回浏览器。 但是,有些内置URL可用于确定Web服务器将来应发出的请求。



该Web服务器还可以与数据库通信,该数据库提供应用程序所有用户共有的永久性存储。 在这种情况下,一种流行的SQL协议用于服务器网络和数据库之间的对话。 这正是我在讨论Ur / Web的可能性时要谈论的内容。



现代Web应用程序不只是一个即时页面。 每当页面上的任何内容发生变化时,您都会向服务器发出新请求,然后替换模块的整个页面。 有一种AJAX样式,根据该样式,浏览器有时会在一个页面视图期间向Web服务器发送其他HTTP请求,并接收由用户程序处理的响应。 在这种情况下,通常使用数据表示形式(例如XML和JSON)以及其他简单格式在客户端和服务器之间交换数据。



然后,当浏览器返回该答案时,将显示一些JavaScript代码,这些JavaScript代码实现了用于控制用户界面的任意逻辑,并显示给用户。



此JavaScript代码可以读取服务器对各种AJAX调用的响应。 然后,他可以修改页面,主要是通过更改为页面设置的全局DOM变量来显示该页面。 程序的任何部分都可以任意影响此全局变量,即页面。 通常,页面的一部分是通过字符串ID(由描述文档的树的节点注释)来查看的。

最后,另一个麻烦是有时我们希望Web服务器无需请求即可与浏览器进行通信。 假设出现新的电子邮件,并且Web服务器希望将此新消息通知浏览器。



有很多方法可以做到这一点,例如,Comet(一种Web应用程序操作模型),其中恒定的HTTP连接允许Web服务器将数据发送到浏览器而无需来自浏览器的任何其他请求,或者WebSockets双工协议(在浏览器和服务器之间进行通信)实时地。 原则上,这些是相同的东西,但是在概念上是不同的。

因此,我想返回所有这些协议和语言的屏幕,之前选择了黄色的某些部分。 阅读讲义后,是否有人猜测所有这些突出显示的部分在安全性方面有什么共同之处?



学生:它们都是可以放置任何内容的行。

教授:正确,在普遍接受的Web应用程序编程方法中,所有这些都是字符串。 而且编程语言无法理解您的用法,因此无法帮助您避免错误。 因此,例如,将这些内容显示为字符串,就会受到代码注入攻击。 据我所知,代码注入攻击主要是由于在您的编程语言或框架中包含了一些功能,而这些功能以相当表达的语言以文本形式启动程序的结果。

Ur / Web没有内置的解释器,可以将字符串作为程序执行。 这使得许多最常见的Web应用程序错误在结构上是不可能的。 因此,所有这些选择的对象将是不可见的或由特殊类型表示,从而使您清楚要处理的代码。 但是,您没有任何自动转换为任何这些特殊类型的字符串。

现在,幻灯片显示了Ur / Web提供的替代模型,并将其编译为传统模型。 因此,它可以在所有流行的浏览器中使用。 但是程序员可以在更高层次上考虑它,并避免上图中可能出现的潜在错误。



因此,我们仍然有一个响应请求的Web服务器。 而且,我们仍有大量尝试使用Web服务器的浏览器。 但是第一个重要的区别是,当浏览器要开始使用Web应用程序时,它不仅发送带有URL的HTTP请求字符串。

它在不涉及客户端的情况下在服务器上运行一流的功能。 然后,服务器不仅使用HTTP协议文本字符串进行响应,而且还使用严格类型的文档树进行响应。 因此,用一种编程语言代替第一类的对象,而不是HTML字符串。 程序将处理此特定树,而不是字符串。

这些树中的每一个都包含链接,链接本身只是可以在服务器上调用的其他功能的脚注。 当用户单击这些链接时,浏览器会选择该函数并在概念上在服务器上对其进行调用,这是我们为此而调用的原始函数。

我们还具有一个数据库接口,供发送请求到数据库的Web服务器访问。 在Ur / Web模型中,这不仅是文本,而且是强类型的SQL语法树。 然后,数据库将不响应文本,而是响应与我们一起工作的Ur编程语言的特征值记录列表。



因此,我们不必担心将字符串错误地转换为“本地”表示形式,也不必担心将“本地”表示形式转换为数据库传统上可以为我们提供的任何其他格式。

这是Ur / Web语义如何使程序员更轻松地处理许多在应用程序运行时实际发生的脚本的关键要素。
关系数据库世界中有一个标准的事务思想,您可以在其中执行一系列操作,而不会被其他并行线程中断。 Ur / Web修改了该模型并将其嵌入到语言的语义中。 因此,当代表客户端在服务器上执行一项功能时,其对数据库的所有访问均以原子块的形式发生,而不会因对同一服务器的所有其他同时请求而引起任何中断。 即使您愿意,也无法避免这种行为,因为这些事务已内置在编程语言中。

而且,它们确实使运行并发查询变得更加容易,并且可能有助于避免某些查询组合发生某些替换时出现的安全问题。

我想对本次演讲摘要中提出的一个问题做出回答,这使我很感兴趣。 因此,Ur / Web会检测到事务何时由于并行执行问题(例如死胡同)而失败,并自动重新启动事务。 有人在回答问题时写道,这可以促进安全性攻击的发起,这取决于并发问题导致的事务失败。 我只是想问全班,有人可以像您想象的那样举一个这样的攻击的例子吗? 如果您有一个系统可以自动重新启动死锁中的事务,这怎么会引起安全问题? 我对这个问题没有答案,这就是为什么我要问。 这个问题的答案可能不太明显,显然值得讨论。



学生:这可能会导致DoS服务出现某种故障? 如果他要重新启动您要发送的事务,并且知道它不会成功,则可以继续重新启动此过程,然后重试...

教授:好的,继续...

学生:如果您强迫系统执行您知道的事情,它将永远不会成功,您可以一次又一次地尝试,最后导致服务失败。

教授:是的,但是为了做到这一点,您需要至少两个线程同时工作。 尽管这可能会起作用,但是您可能能够发起拒绝服务攻击。 在这种情况下,您可以利用这样的事实,即请求处理程序会一次又一次重新启动并有意引起冲突,并使用这种方法来增强DoS攻击的能力,以及借助这种类型的传统攻击模型所能获得的能力。 好吧,我可以相信。

学生:这是导致交易失败的唯一方法吗?

教授:是的,这是导致崩溃和自动重启的唯一方法。

学生:也许会有第三方有条件地失败。 然后,您可以使用它来监视其他用户的行为。

教授:您还需要一种观察某人已失败的方法,但是您只能在一段时间后才能执行此操作。 但是,这也可能是一个问题。 , , , . , . , , , . .



: , , , . , ?

: , , , .

: , , , ? , .

: , , . , .

: , , , , , ?

: , , , , , ? , – , . . , , .

: , , ?

: , , . , , , . , – .

, -. AJAX, .



, . , . , - .



, . , .

, Ur/Web , . — , . , , . — , , .

— , , , . , , , .

. Ur/Web- Ur/Web-. JavaScript, . , . .

, , . , . , , , . , , , .



. , , , , , . . , , JavaScript.

JavaScript , , , JavaScript .

, , Ur/Web- — . , , , . JSON. .



, , . , . . - .

, , , , . : «, », . «» .



, . , ?

: , ?

: RPC , . , .

— , . , , .

: ?

: HTTP-. , - , , , HTTP .
, , . . , Ur/Web. , .



, . , , URL- URL-. . , URL.

URL . - , URL. , HTML . HTML. , XML-, , .

- , . HTML- , .



, , . , , UTF-8. , .

, UTF-8, . - , Tangled Web ( ), Ur/Web, , .

顺便说一句,在演示过程中的任何时候,请提出您想起的实验建议,以便我们可以尝试在我的系统上发现哪些错误。

我认为这是展示Ur / Web功能的最有效的方式。

27:45分钟

麻省理工学院的课程“计算机系统安全”。 第11课:Ur / Web编程语言,第2部分


该课程的完整版本可在此处获得

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们, 为我们为您发明的入门级服务器的独特模拟,为Habr用户提供30%的折扣: 关于VPS(KVM)E5-2650 v4(6核)的全部真相10GB DDR4 240GB SSD 1Gbps从$ 20还是如何划分服务器? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

VPS(KVM)E5-2650 v4(6核)10GB DDR4 240GB SSD 1Gbps至12月免费,在六个月内付款,您可以在此处订购。

戴尔R730xd便宜2倍?在荷兰和美国,我们有2台Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100电视(249美元起) 阅读有关如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?

Source: https://habr.com/ru/post/zh-CN425997/


All Articles