优先考虑内存安全迁移

2021-04-13 01:13:05

4月11日更新:请看看长时间的Live Sandboxing!尽管你可能已经听到了什么,但沙盒不死。

随着使用RUDE的所有讨论减少内存不安的错误,Suchas Android在Android开源项目中使用RUST,有很多关于“重写锈病”(或任何其他更安全的语言)的高成本令人担忧的疑虑因为它经常是措辞。操作系统,WebBrowsers,Complex在线服务等,可以用数百万的C / C ++代码实现。 (有时候更多。)重写所有似乎过于昂贵的所有似乎昂贵,加剧了Whaterex Gaynor Aptly称之为悲伤 - 人们在记忆不确定问题的巨大时停留在拒绝阶段。

值得庆幸的是,用更安全的语言替换C / C ++的CODE不是全无任务。我们可以迭光地做到这一点;我们可能永远不需要更换的一些部分。最安全的语言可以在与C和/或C ++相同的地址空间中的语言,并调用并调用Byc / C ++。您还可以规范化数据结构,使得安全代码手柄的输入,以及C / C ++代码可以专注于单个更简单的语法。例如:

但是如何通过更安全的代码开始更换C / C ++的位置,以及Whereto停止?

虽然安全肯定不是安全语言的唯一好处 - Theandroid团队的帖子开始强调正确性 - 我的观点发布。从那个起点,我们可以使用我认为优先考虑我们努力的不清楚方法。

即使你有了2000万行的C ++代码,也不是isdirectly或间接地暴露于攻击者。您可以首先开始硬化最大的代码,并且您可以通过对码的路径多长时间排列曝光。考虑Ianbeer的Epic Radio PytoTechnics,其中他通过通过收音机发送卑鄙的分组来损害iPhone。我们可以模拟攻击表面曝光,如下所示:

这是一个过度的过度简化,但它让我们看看攻击者的顾客的图形不是很深刻 - 也就是说,该驱动程序非常暴露。

此外,由于IAN的帖子的标题指出,攻击者的成本TOTRAVERSE这是前几个边缘是0.我们可以通过将“重量”或'闭环分配给图形中的边缘来模拟。成本越高,攻击者将成功的可能性越小。假设收音机相当简单,并且在通过它到内核之前的内容之前相当简单,并且可以归一成或过滤,Wemight绘制这样的东西:

从0→低→中→高的等级,我们可能慷慨地估计要利用易受攻击的驱动程序尽可能高的媒介。如果Deedefender幸运,也许Aslr正在工作,或者某事。

伊恩在他的帖子中详细解释了一切,但总的来说我们不应该将C / C ++代码视为可辩护。如果攻击者能够获得C / C ++攻击面,我们必须认为他们可以赢得。

作为另一个例子,请考虑您的Web服务器或浏览器的TLSimplation。我们应该认为它暴露吗?我们可以模拟它的东西:

在这种情况下,攻击者仅感兴趣于应用程序的TLSimplation,并且只是使用内核作为到达那里的方法 - 它们攻击设备驱动程序或TCP实现。 (尽管那些Arealso公开的攻击曲面当然是。)内核通常不会与应用层流量进行流行,使其逐字传递给usllandApplication。因此,在这种情况下,内核未创建安全边界。

攻击者对您的应用程序的TLSimmentation非常直接射击;唯一的攻击前提条件是攻击者是否可以向应用程序发送TLS流量。显然,服务器倾听Internet并处理他们得到的任何东西;这是0成本。如果攻击客户端,AnAttacker可能必须让目标联系他们的服务器,或者可能必须与目标相同的网络。我们可能会说这是中等成本。

因此,像设备驱动程序和HTTP,TCP和TLS实现一样的东西是(RE)以更安全的语言实现的Allfine候选。他们是顽皮的暴露。

在此示例中,我们有一个要解析的HTTP客户端,并评估内容SecurityPolicy(CSP)标题。每个网络接口,设备驱动程序,TCPimplingation,TLS客户端实现,HTTP客户端实现和CSPParser都是相当暴露的攻击表面。例如,如果攻击者想要CSP解析器中的一些错误,则可能依赖于所有上一个组件,以通过逐字传递给CSP解析器来传递标题值。因此,它们可能不会创建安全边界。

但是如果攻击者想要利用可能的错误类,错误评估,他们必须首先超过CSP解析器。虽然它是漏洞的表面,但它也提供了一些安全边界:策略必须按照解析器接受的语法蜂蜜形成。另一个错误类是解析器的语法不一定与thepec中的语法相同。

因此,我们会谈谈CSP解析器和/或评估器中的逻辑错误。这是一种可以用任何语言丢弃的代码;这不是MODORUNAWETY,可以以更安全的语言在比例下解决。

这些例子表明您必须相当深入地调用GraphBefore内存确实变得越来越少。这与Mement Antave帐户从⅔到¾的任何地方进行了一致。问题是那么糟糕。

像上面的模型可以是修复分类过程中的步骤1。 youmight在过滤通过哪些代码重写,应用缓解或测试时进行一组约束,甚至先摆脱:

哪种方法是合适的取决于您的系统。例如,如果您完全在内核中致力于,您的代码在ovivilege的同一级别运行,因此您不能将其用作过滤器。或者如果您在Userland,但您的应用程序没有利用流程沙箱,请考虑在开始重写工作之前探讨这一事件。

无论如何,我们不必“重写锈病中的一切”以改善内存,我们不会丢失在未分化的攻击表面的海洋中。我们的方式我们可以以某种系统化方式优先考虑 - 我们不必固定临时的东西。

感谢Jacob Hoffman-Andrews,Andrew Dunham,以及Dev Akhawe为这篇文章的读书,并建议有用的改进! 克里斯帕尔默的Noncombatent.org在归因于归属 - 非商业 - Sharealike4.0国际许可下的Creative Commons中。