写点什么

Google 也要放弃 C/C++?Chrome 代码库中 70% 的安全漏洞是内存问题

  • 2020-05-25
  • 本文字数:1588 字

    阅读完需:约 5 分钟

Google也要放弃C/C++?Chrome 代码库中70%的安全漏洞是内存问题

Google 工程师表示:目前 Chrome 代码库中所有严重的安全漏洞,70% 是内存管理的安全漏洞,其中 50% 的内存漏洞是 use-after-free 漏洞,因为对内存指针的错误管理,给予了攻击者攻击 Chrome 内部组件的机会。


近日,Google 工程师统计了 2015 年以来,Chrome 稳定分支中修复级别为"high" 或"critical" 的 912 个安全错误,结果发现约 70% 是内存安全漏洞。



事实上,不只是 Google,内存安全漏洞是很多科技公司都头疼的问题,微软工程师也曾公开表示:在过去 12 年中,微软产品的安全更新中,约有 70% 也是在解决内存安全漏洞。


为什么微软和 Google 的情况如此相似呢?因为它们代码库中使用的主要编程语言是 C 和 C++,由于 C 和 C++ 出现的时间较早,当时网络攻击还不是利用相关的威胁模型,大多数早期软件开发人员也没有考虑到相关的安全问题,所以 C 和 C++ 允许程序员完全控制管理应用程序的内存指针,出现基本的内存管理错误时,也没有相关的提示或者警告。

Chrome 的内存安全问题如何解决?

据了解,自 2019 年 3 月以来,在 130 个级别为 critical 的 Chrome 漏洞中,有 125 个是与内存相关的。这个数据也表明了,内存管理错误仍然是 Google 的一个大问题。



为了解决内存安全问题,Google 内部提出了一个 The Rule Of 2 原则,即为了保证安全性,程序员不能破坏两个以上的条件:


  • 不可靠的输入:主要来自两个方面,一是 non-trivial 的语法,例如常用的 and 和 or,二是不安全的来源;

  • 不安全的实现语言:即在编写程序时选择了缺乏内存安全性的语言,例如 C、C++、汇编语言等。目前内存安全的语言包括 Go、Rust、Python、Java、JavaScript、Kotlin 和 Swift 等。

  • 高特权:特权最高的程序是计算机固件,引导加载程序、内核、系统管理程序或虚拟机监视器等;其次是操作系统级别的账户运行进程;特权较低的进程包括 GPU 进程和网络进程等。


“沙箱”也是 Google 用来解决安全问题的常用方法,Google 工程师会将数十个流程隔离到自己的沙箱中,并利用刚推出的“Site Isolation”功能,将每个站点的资源也放到沙箱中。同时,考虑到性能问题,Google 采用了沙箱化 Chrome 组件的方法,并在积极探索新的方法。


Google 表示将开发自定义 C++ 库,与 Chrome 代码库配合使用,以便更好地处理与内存相关的错误。并且有计划,在可能的情况下探索使用“内存安全”的编程语言,目前的候选对象包括 Rust、Swift、JavaScript、Kotlin 和 Java。

放弃 C 和 C++ 可行吗?

无论是 Google 还是微软,出现内存问题的根源是使用了诸如 C 和 C++ 这类的“不安全”编程语言,那么放弃 C 和 C++ 可行吗?


对企业来说,重新选择一种编程语言不是一件容易的事情,因为这意味着需要重写大量的代码,需要重新培训员工,需要招聘拥有新技能的员工。所以,放弃 C 和 C++ 不是一件容易的事情。


如果是全新的项目,我们完全可以选择一个内存安全的编程语言,无需考虑重写代码的风险。不过,还是需要改进测试或部署基础架构来支持新的编程语言。ChromeOS 的 CrosVM 就是采用的这种方法。


如果是现有项目的新组件,我们也可以选择内存安全的编程,例如 Rust、Swift 等编程语言都可以与 C、C++ 代码库互操作。不过,刚开始的投入可能会比较大,因为需要集成到构建系统中,所以需要使用一种新的语言在两种语言之间传递对象和数据构建抽象。Firefox 的新组件 WebAuthn 就是使用的这种方法。


以上两种情况的特点都是新代码与原有代码有明显的界限,无需重写代码,我们可以在构建新项目或新组件之后,再逐步处理现有代码。那如果是界限不明显、无法放弃 C 和 C++ 的情况,我们又该怎么办呢?


  • 使用一些现代 C++ 习惯用法来生产更安全可靠的代码;

  • 使用 fuzzers 和 sanitizers 提前发现错误;

  • 使用 exploit mitigations 增加利用漏洞的难度;

  • 特权分离,这样即使利用了漏洞,受影响的半径也较小。


相关阅读:


https://www.chromium.org/Home/chromium-security/memory-safety


2020-05-25 17:019135
用户头像

发布了 497 篇内容, 共 297.9 次阅读, 收获喜欢 1883 次。

关注

评论

发布
暂无评论
发现更多内容

一位 sealer maintainer 的心路历程

阿里巴巴云原生

阿里云 开源 云原生 sealer

「阿里云 RocketMQ 系列公开课」重磅来袭!

阿里巴巴云原生

Apache 阿里云 RocketMQ 云原生 直播

hive on spark 和 spark on hive

飞哥

大数据 spark hive

动态广播发送流程

北洋

android 7月月更

什么是hpaPaaS平台?低代码和hpaPaaS是什么关系?

优秀

低代码

阿里云架构师马继雨:云超算解决方案全面助力生命科学行业普惠增效

阿里云弹性计算

高性能计算 生命科学 EHPC

6. 对象存储

MASA技术团队

C# .net 对象存储 框架 Framework

【刷题记录】8. 字符串转换整数 (atoi)

WangNing

7月月更

mac 本地安装spark

飞哥

大数据 spark 数据仓库

深度揭秘阿里云函数计算异步任务能力

阿里巴巴云原生

阿里云 Serverless 云原生 异步 函数计算

微服务与Kubernetes容器云的边界

穿过生命散发芬芳

微服务 7月月更

小程序遇上Flutter 3.0

Geek_99967b

flutter 小程序

避坑:@Around与@Transactional混用导致事务不回滚

Paul

Spring Boot 2 事务失效 spring aop Java’

普通二本院校如何从所谓的从寒冬破冰?

KEY.L

7月月更

使用 doscify 将文章写成文档一般丝滑

宁在春

GitHub Pages docsify 7月月更

编译器优化那些事儿(4):归纳变量

openEuler

openEuler 毕昇 JDK 开源操作系统 编译器 加速器 编程语言

深入浅出 eBPF|你要了解的 7 个核心问题

阿里巴巴云原生

阿里云 云原生 k8s ebpf

Flutter 实现小姐姐渐现动画效果

岛上码农

flutter ios 前端 安卓开发 7月月更

基于ResNet50实现宫颈细胞病变分类

逝缘~

分类神经网络 7月月更

小程序容器对工业互联网平台建设的加速的体现

Geek_99967b

小程序

3DCAT投屏功能升级,助力企业营销与培训

3DCAT实时渲染

虚拟仿真 实时云渲染 3DCAT 企业营销 实时渲染云

长安链研究笔记-证书生成工具

长安链

设计稳定的微服务系统时不得不考虑的场景

阿里巴巴云原生

阿里云 微服务 云原生 OpenSergo

几种跨平台方案的对比

Geek_99967b

小程序 跨平台

Istio整体架构解析

阿泽🧸

istio 7月月更

WebRTC 音频抗弱网技术(下)

融云 RongCloud

瑞云与宜宾职院开展校企合作,同深圳VR联合会共建元宇宙产业学院

3DCAT实时渲染

职业教育 虚拟现实 虚拟仿真 元宇宙

机器学习-西瓜书小记

AIWeker

机器学习 7月月更

一款代替Typora的软件---MarkText

IT蜗壳-Tango

7月月更

mac 本地hive2 安装

飞哥

大数据 hadoop hive

新星计划Day5【数据结构与算法】 链表

京与旧铺

7月月更

  • 扫码添加小助手
    领取最新资料包
Google也要放弃C/C++?Chrome 代码库中70%的安全漏洞是内存问题_语言 & 开发_田晓旭_InfoQ精选文章