写点什么

Facebook 如何在一亿行代码中迅速找到缺陷?

  • 2019 年 8 月 28 日
  • 本文字数:1745 字

    阅读完需:约 6 分钟

Facebook如何在一亿行代码中迅速找到缺陷?

尽管 Facebook 近期被不重视用户隐私保护等话题缠身,特别是其原本可以避免很多不必要的错误。但是,就其数十亿用户和支持其用户的庞大数据平台来说,想要在一亿行巨量代码库中发现每一个缺陷并不容易。



为了在巨量代码库中准确定位问题,Facebook 的工程师四年前开始构建定制评估工具。这个工具不仅可以检查已知类型的错误,还可以在 30 分钟内扫描完整个代码库,帮助工程师在变更、修改或增加主要功能之前发现缺陷,将缺陷扼杀在摇篮中。


该工具名为 Zoncolan,是一个“静态分析”工具,可以映射代码库的行为和功能,并通过不同路径中相互作用查找隐藏在各个分支中的潜在问题。在如此大规模代码库中使用人工手动审查无穷无尽的代码变更,并做代码审核是不切实际的。静态级别分析非常合适,因为它对不良架构和缺陷代码行为设定了“规则”,并自动扫描系统中这些类别的错误。一旦出现,马上抓住。理想情况下,该系统不仅可以标注潜在问题,还可以为工程师提供实时反馈帮助他们学会如何避免踏入陷阱。


“每当工程师要对我们的代码库进行改动时,Zoncolan 就会开始在后台运行,(对疑似缺陷)标记之后,并同时直接报告给软件工程师本人,也同时报告给当值的安全工程师,”Facebook 安全工程经理 Pieter Hooimeijer 说道, “因此,它每天运行数千次,在 2018 年中就发现了 1,500 个问题。”


静态分析工具本身并不会发现新的漏洞,只是根据被设定的规则来捕捉事物。 但是,这些工具不仅可以不厌其烦的一次又一次捕获相同的错误,还可以根据这些缺陷深入挖掘出一个新的规则。


静态代码分析工具对于 Facebook 来说是独一无二的,这个工具被广泛应用于安全组以及应用开发中。但是 Hooimeijer 指出,因为它是为了全面映射 Facebook 的特定代码库而量身定制的,因此 Zoncolan 特别有效。Hooimeijer 表示之前 Facebook 在 3 月份被披露以明文形式存储数亿用户密码后,公司就对该漏洞设置了规则,让 Zoncolan 根据规则扫描潜在问题。


Hooimeijer 表示:“四年前,我们不得不争抢一群安全工程师,并开始手动梳理代码寻找问题。现在,我们使用 Zoncolan 来确保代码库中没有其他类似性质的问题。在这种情况下,我们创建了新的规则,在实践中发现了类似问题。”扩展 Zoncolan 检测能力的新规则的灵感来自 Facebook 内部代码库,也包括该公司的 Bug 赏金计划。


Zoncolan 采用了一种特别定制的方法来寻找安全漏洞,而不是更常用的寻找各种设计和性能缺陷的静态分析方法,关注可识别的数据流及设计模式,作为减少静态分析误报的一种方法。不过,Facebook 并不是唯一一家有自己定制开发的代码检查工具的公司,谷歌也有自己的定制静态分析工具,评估该公司庞大的 20 亿行代码库。


“任何拥有良好软件开发生命周期的公司都有源代码分析器,以确保他们的产品在投入前扫清一切缺陷”企业危机响应咨询服务公司 TrustedSec 的首席执行官 David Kennedy 说, “大多数成熟的组织都使用静态代码分析器,因为它最有价值的地方就是可以识别缺陷,当然它并不涵盖所有内容。”


Kennedy 指出,像 Zoncolan 这样的工具不会发现权限泄露,这导致 Facebook 在 9 月份遭遇 3000 万账户数据泄露问题 ,源代码分析器不会发现这一点。Facebook 过去几年中最严重的问题是包括与意外代码错误无关的基于用户隐私权的问题。


Hooimeijer 回应 Zoncolan 不是完美的解决方案。但他表示,鉴于 Facebook 在该工具上所做的投资,他希望该工具的某个版本有朝一日可以开源,供其他组织使用。不过,Zoncolan 在 Facebook 代码中如此有效地捕获 bug 是基于 Facebook 内部开发的,如果要在 Facebook 之外的环境中运行,还需要增强灵活性,适配更多环境。


实现这一目标的第一步是 Facebook 在 2018 年发布了一个名为 Pyre 的代码检查器,是为编程语言 Python 发布的开源代码检查工具。该工具没有 Zoncolan 的范围广、功能强,但是 Facebook 准备开源的一个类型范例。


“我们已经投入了大量精力来构建这个,这个工具就是 Python 的 Zoncolan。”Hooimeijer 表示, “我们也希望在 Facebook 以外分享精彩的好工具。”安全社区将永远欢迎高质量的开源工具。但是,Facebook 需要不断磨练每一个防守,以便在安全问题滚雪球之前抓住,进而保障用户安全。


原文链接:


《HOW FACEBOOK CATCHES BUGS IN ITS 100 MILLION LINES OF CODE》


2019 年 8 月 28 日 09:3010164

评论

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

Java 并发系列(一):多线程三大特性

TroyLiu

Java 多线程 原子性 可见性 有序性

架构师进阶之《Your Mouse is a Database》

陈皓07

MySQL连接超时关闭问题解决

flyer0126

MySQL MySQL优化

秒杀系统的难点在哪?如何突破?

跳蚤

翻译:《实用的Python编程》03_01_Script

codists

Python

递归的人生哲学

Nick

数据结构 算法 递归

微服务架构设计与最佳实践

万俊峰Kevin

微服务 go-zero Go 语言

《函数式编程精粹》(2) 热身:A STACK BASED CALCULATOR

陈皓07

不写代码可以写爬虫程序吗?老师说可以,无编码学爬虫之一。

梦想橡皮擦

Python 28天写作 2月春节不断更

优化JAVA代码总结

跳蚤

第十三周作业&总结

胡益

网络故障的排错思路指南

架构师训练营课程纲要

陈皓07

浅谈JVM 垃圾回收原理

跳蚤

为何要构建团队契约

Bruce Talk

敏捷 Agile

并发与并行

ES_her0

28天写作

译文 | 深度剖析 Pulsar Functions

Apache Pulsar

大数据 kafka 开源 pulsar Apache Pulsar

《函数式编程精粹》(3) Functional Design

陈皓07

「架构师训练营 4 期」 第八周 - 001&2

凯迪

架构师训练营 4 期

架构师训练营第八周作业 - 命题作业

阿德儿

区块链一文知

秋呈

区块链+

博文推荐 | Apache Pulsar 延迟消息投递解析

Apache Pulsar

kafka 开源 RocketMQ pulsar Apache Pulsar

【管理笔记16】行销的获利性分析

俊毅

28天写作

《函数式编程精粹》(1) 函数式思考

陈皓07

【答疑点评必看】如何从「数据范围」中找到解题「突破口」...

宫水三叶的刷题日记

面试 LeetCode 数据结构与算法

Elasticsearch Query Phase

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

第8周课后练习-性能优化二

潘涛

架构师训练营 4 期

架构师进阶之《做踏实的架构》

陈皓07

数据库规范设计说明书 整理

edd

APP启动流程图

林亚超

join为啥会阻塞主线程?

叫练

join

React Native 核心原理及跨端选型思路

React Native 核心原理及跨端选型思路

Facebook如何在一亿行代码中迅速找到缺陷?-InfoQ