迈向更安全代码的主动方法
自2004年以来,微软安全响应中心(MSRC)处理了每一个报告的微软安全漏洞。从所有这些处理中,一个惊人的事实脱颖而出:正如Matt Miller在2019年BlueHat IL上的演讲中所讨论的,大多数已修复并分配了CVE的漏洞是由开发人员无意中在其C和C++代码中插入内存损坏错误引起的。随着微软代码库的增加和在代码中使用更多开源软件,这个问题并没有好转,反而变得更糟。而且,微软并不是唯一面临内存损坏错误的公司——这些只是MSRC处理的漏洞。
工具众多,时间有限
并不是没有工具可以帮助开发人员编写安全代码。开发人员有大量工具可供使用:极其复杂的静态分析工具(需要一两个月来学习)、大规模模糊测试(提供大量崩溃信息供处理)、污点分析和约束求解器。还有指导帮助开发人员采用安全实践:需要钻研的安全开发生命周期、编码指南百科全书、数小时的代码审查、大量培训以及威胁建模指导。我们改变了编译器并创建了缓解措施来帮助开发人员摆脱错误。Visual Studio甚至还有红色波浪线来突出潜在缺陷!
这还不是全部。当内部或外部报告者发现安全缺陷时,我们会为开发人员提供支持,指出问题,并帮助他们进行事后分析。我们说服他们暂停功能开发来修复问题,然后推动发布更新星期二。开发人员还能从安全工程中得到什么?
首先,他们可能希望花费更少的精力来学习工具和流程,以构建没有安全缺陷的功能。
内存安全语言的理由
开发人员的核心工作不是担心安全,而是完成功能工作。与其投资于越来越多的工具、培训和漏洞修复,不如使用一种开发语言,从一开始就不能在功能工作中引入内存安全问题?这将有助于功能开发人员、安全工程师以及客户。
一种被认为免受内存损坏漏洞影响的语言将软件安全的责任从功能开发人员转移到语言开发人员身上。幸运的是,有几种语言被认为是“安全”的,免受内存损坏漏洞的影响,例如C#。微软的许多开发团队已经接受了使用这些安全语言来编写新的客户相关功能。
C++确实有其优点,使其具有吸引力,在某些情况下甚至是必不可少的:速度极快、内存和磁盘占用小、成熟、执行可预测、平台适用性几乎无与伦比,并且无需安装额外组件即可使用。如果开发人员能够拥有像.NET C#这样的语言的所有内存安全保证,同时具备C++的所有效率,那该多好。也许我们可以:满足这些要求的最有前途的新系统编程语言之一是Rust编程语言,最初由Mozilla发明。
如果作为一个行业,我们真正关心安全,我们应该关注开发人员的工具,而不是被所有安全配件、炒作、非数据驱动的意识形态以及过时的方法和途径所蒙蔽。与其提供解决缺陷的指导和工具,我们应该努力防止开发人员一开始就引入缺陷。
提高安全性,一次一只松鼠
今天开车上班时,一只松鼠从我面前跑过马路。我迅速刹车并不得不转向以避免撞到它。但我没有撞到松鼠,自己也没有受伤。不是因为我采取了复杂的行动,而是因为防抱死制动系统防止我滑入其他车道,而且我的安全带保护我坐在座位上。松鼠和我都因为内置在我车中的安全功能而受益,这些功能帮助我避免了撞到它并引发另一起事故。
我们可以从汽车行业不断演进技术以保护驾驶员和道路使用者的方式中学习。软件安全行业有责任以类似的方式保护开发人员。也许是时候抛弃不安全的传统语言,转向更现代的、更安全的系统编程语言了?
你可能习惯于将微软安全响应中心视为一个响应事件和漏洞的团队。我们是一个响应组织,但我们也有主动的角色,在一个新的博客系列中,我们将重点介绍微软对更安全的系统编程语言的探索,从Rust开始。请加入我们的旅程。
Gavin Thomas,首席安全工程经理,MSRC