谷歌安全2规则:三个选择中只能取两个


当您编写代码来解析、评估或以其他方式处理来自互联网的不可信输入时,我们希望遵循一个简单的规则,以确保这样做足够安全!

我们喜欢遵循一条简单的规则,以确保这样做足够安全。

2规则是从以下选项中选择不超过 2 个,如果三种选择都发生,则不安全,安全漏洞发生!

  1. 不可信的输入;(坏人来了)
  2. 不安全的执行语言;(坏保安)
  3. 高权限。(所有房间都没有门,让进来的人立即获得畅通无阻的高权限)

1、不可信的输入
不可信的输入是指以下输入

  • 具有 non-trivial语法;and/or
  • 来源不可信。

如果有一种输入类型非常简单,可以直接为它编写内存安全的处理程序,那么我们就不需要为了内存安全而担心它的来源,因为我们确信我们可以处理它。当然,我们仍然需要在解析后将输入视为不可信的。

不幸的是,我们很少能找到足够琐碎的语法,让我们相信自己能成功或安全地解析它。

互联网上的任何任意对等点都是不可信的来源,除非我们能获得一些证明其可信性的证据(其中至少包括对来源身份的有力断言)。

如果我们能确定输入来自与应用程序本身相同的来源(例如 Chrome 浏览器的来源是 Google,火狐浏览器的来源是 Mozilla),并且传输是受完整性保护的(例如 HTTPS),那么即使是来自该来源的复杂输入,我们也可以接受解析。

在可行的情况下,理想的做法仍然是降低我们对来源的信任度,例如在沙箱中解析输入。

2、不安全的实现语言
不安全的实现语言是指缺乏内存安全性的语言,至少包括 C、C++ 和汇编语言。

内存安全语言包括 Go、Rust、Python、Java、JavaScript、Kotlin 和 Swift。

由于不安全代码超出了内存安全语言的正常预期,因此它必须遵循严格的规则,以避免未定义的行为和违反内存安全的行为,而这些规则并不总是容易验证的。需要由一位或多位不安全语言子集方面的专家进行仔细审查。在高权限环境中使用内存安全语言的任何代码都应该是安全的。因此,对内存安全语言实现的要求更高:内存安全语言中的所有代码(包括任何不安全代码)都必须能够在高权限上下文中满足第 2 条规则,才能在项目的任何地方使用或允许使用。

3、高度特权
高权限是一个相对术语。权限最高的程序包括计算机固件、引导加载程序、内核、任何管理程序或虚拟机监控程序等。其次是以操作系统级账户代表个人运行的进程,包括 Chrome 浏览器进程和 Gpu 进程。我们认为此类进程具有很高的权限。(毕竟,它们可以做任何个人可以做的事情,使用个人的所有宝贵数据和账户)。

权限略微降低的进程将(希望很快)包括网络进程。这些仍然是相当高权限的流程。我们一直在寻找既能降低它们的权限,又不会破坏它们的方法。

低权限进程包括沙箱实用程序和具有站点隔离(非常好)或起源隔离(更好)功能的渲染器进程。