过渡到内存安全语言:挑战和注意事项
开放源代码安全基金会 ( OpenSSF )总经理 Omkhar Arasaratnam 讨论了内存安全编程语言的演变及其为应对 C 和 C++ 等语言的局限性而出现的现象。
内存安全问题已存在五十多年,它要求程序员从内存管理任务中抽离出来。
Java、Rust、Python 和 JavaScript 等现代语言通过代替程序员处理内存管理来缓解这些问题,从而允许程序员专注于代码质量,而不必担心与低级内存管理相关的风险。
您能谈谈内存安全编程语言的演变吗?它们是如何应对 C 和 C++ 等语言在内存安全方面的限制的?
对内存安全的担忧已持续了50 多年。内存安全涉及将程序员从复杂的内存管理功能中抽象出来,而这些功能很难安全地执行。
例如,在 C 或 C++ 中,程序员必须分配和释放内存,这可能很难管理。
他们必须跟踪分配的内存量并确保仅使用适当分配的内存。
一旦不再需要该内存,程序员必须安全地处理它。Java、Rust、Python和 JavaScript 等语言可以防止程序员“内存不安全”,因为它们代表程序员处理内存管理的细微差别。
在软件开发中使用内存安全语言的主要优势是什么,特别是在系统编程或内核开发等高风险环境中?
操作系统内核对整个系统具有绝对的权限。这意味着诸如不安全的内存处理等安全问题可能会损害整个系统的安全。
虽然开发人员可以精确使用内存不安全的语言(如 C 或 C++)而不会导致内存安全问题,但历史告诉我们事实并非如此。
微软估计,其产品中 70% 的 CVE 都源于内存安全问题。谷歌进行了类似的研究,发现90% 的 Android CVE可能与内存安全有关。
Go、Python、Rust 和 Java 都是内存安全语言的优秀示例。
不幸的是,并非所有这些语言都可以用于内核开发。
Rust 即将成为 Linux 内核支持的第二种官方语言。
一旦完成,它将允许 Linux 内核开发人员用完全内存安全的语言重写内核的敏感部分。
开发人员和组织在过渡到内存安全语言时面临哪些挑战,特别是在遗留系统中?
当过渡到内存安全语言时,必须考虑几个问题:
1. 开发人员— 在过渡到新语言时,您需要培训现有的开发人员或找到熟悉该语言的开发人员。您可能还需要更改调试和构建系统以支持它。
2. 硬件支持— 像 C 和 C++ 这样的老语言在各种不同的平台上都受到支持,而像 Rust 这样的新语言则受到的支持比较有限。缺乏硬件支持可能会阻碍您过渡到这种新语言。
3. 监管要求——一些安全关键系统具有非常严格的技术或安全要求,由于缺乏保证或认证,可能会阻止切换到新的内存安全语言。
4. 错误— 将旧代码重构为新语言可能会引入错误。在某些情况下,虽然熟练的程序员可能会避免引入新的逻辑错误,但用新语言重写的旧代码可能会无意中表现出不同的行为,从而导致生产中出现意外错误。
从实际角度来看,如何逐步调整或重写 C/C++ 等语言的现有代码库,以利用内存安全语言的优势?
用 Rust 重写代码是一项艰巨的任务。去年 OpenSSF 回应ONCD 信息请求时,我们就意识到了这一挑战。我们认为答案并不是用 Rust 重写所有内容。
我们鼓励社区在开始新项目时考虑使用 Rust 编写代码。
我们还建议将 Rust 用于关键代码路径,例如通常被滥用或被破坏的区域或那些拥有“王冠上的宝石”的区域。
身份验证、授权、加密以及任何需要从网络或用户输入的内容都是不错的起点。
虽然采用内存安全并不能在一夜之间解决所有安全问题,但这是必不可少的第一步。
但即使是最好的程序员在使用并非天生内存安全的语言时也会犯内存安全错误。
通过使用内存安全的语言,程序员可以专注于编写更高质量的代码,而不是危险地与低级内存管理作斗争。
然而,我们必须认识到,不可能一夜之间重写所有内容。
OpenSSF 创建了一个C/C++ 强化指南,以帮助程序员在不显著影响现有代码库的情况下使遗留代码更安全。
根据您的风险承受能力,这是一条短期内风险较小的途径。
重写或重建完成后,还必须考虑部署。
许多关键基础设施工业控制系统不易被企业网络访问,因此重新部署重写的代码可能比重写本身花费的时间更长。
您对内存安全编程语言的未来有何看法?您是否预见到它们会成为特定领域的标准,还是传统语言将永远有一席之地?
在考虑特定行业或领域时,存在一个有趣的矛盾。
您不想急于将关键系统过渡到新语言,但具有讽刺意味的是,这正是其中一些安全属性最有价值的地方。
我们不知道内存安全语言是否会成为特定行业的标准,有些行业采用它们的速度会比较慢,因为它们出于安全或可靠性原因对过渡的要求更为保守。系
统稳定性与变化率之间存在反比关系。
使用内存安全语言开始新项目具有多种好处。
例如,Alpha-Omega 资助了 Rustls 的开发,这是 Prossimo 的一个项目,旨在在 Rust 中实现 TLS 和 QUIC。
通过用内存安全语言实现这些协议,我们可以避免 OpenSSL Heartbleed 漏洞等问题。
教育和社区支持在推动内存安全语言的采用方面发挥了多大作用?您会向寻求转型的开发人员推荐哪些举措或资源?
教育是我们拥有的最佳网络安全防御。许多小学已经开始教授 Python 作为第一门编程语言。
未来,我们希望看到其他内存安全语言(如 Rust)也能在早期引入。
此外,Rust 基金会还提供了一些工具和材料,包括《Rust 编程语言》——一本概述 Rust 的权威书籍。它还在开发培训和认证计划。
相关文章:
过渡到内存安全语言:挑战和注意事项
开放源代码安全基金会 ( OpenSSF )总经理 Omkhar Arasaratnam 讨论了内存安全编程语言的演变及其为应对 C 和 C 等语言的局限性而出现的现象。 内存安全问题已存在五十多年,它要求程序员从内存管理任务中抽离出来。 Java、Rust、Python 和 JavaScript 等现代语言通…...
在Pycharm中安装Cv2
安装OpenCV: 在Terminal中,输入以下pip命令来安装OpenCV: pip install opencv-python pip install opencv-contrib-python 如果下载速度较慢,可以考虑使用国内的pip镜像源,如清华大学源: pip install openc…...
减少重复的请求之promise缓存池(构造器版) —— 缓存promise,多次promise等待并返回第一个promise的结果
减少重复的请求之promise缓存池 —— 缓存promise,多次promise等待并返回第一个promise的结果 背景简介 当一个业务组件初始化调用了接口,统一个页面多吃使用同一个组件,将会请求大量重复的接口 如果将promise当作一个普通的对象࿰…...
cdq+bitset处理高维偏序
高维偏序 CDQ分治 假设处理的区间为 [ l , r ] [l,r] [l,r] ,CDQ分治的过程: 如果 l ≥ r l\geq r l≥r ,返回。设区间中点为 m i d mid mid ,递归处理 [ l , m i d ] [l,mid] [l,mid] 和 [ m i d 1 , r ] [mid1,r] [mid…...
敏捷开发和传统开发,你更适合哪种?
时间:2024年 10月 03日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 音频:喜马拉雅 大家好,欢迎来到“小蒋聊技术”,我是小蒋!今天我们来聊聊两个开发模式的“对决”…...
python之with
with上下文管理是什么呢? 一般都是使用系统提供的一些with语句,列如我要去读取一些数据进行分析,就可以使用with open去读取某些数据,或者我要把一些图片给他保存到某些地方,可以用with给他写入。 上下午管理器with是…...
vue3 升级实战笔记
最近要将公司项目的移动端进行 vue3 的升级工作,就顺便记录下升级过程。 项目迁移的思路 我的想法是最小改动原则。 从 vue2.x 升级到 vue3,且使用 vue3 的 选项式 API。构建工具要从 vue-cli(webpack)升级到 vite。路由需要升级到…...
利用函数模块化代码实操 ← Python
【知识点】 ● 模块化可以使代码易于维护和调试,并且提高代码的重用性。 ● 函数可以用来减少冗余的代码并提高代码的可重用性。函数也可以用来模块化代码并提高程序的质量。 ● 在 Python 中,可以将函数的定义放在一个被称为模块的文件中,这种文件的后缀…...
Java高效编程(12):重写toString方法
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 尽管 Object 类提供了 toString 方法的默认实现,但它返回的字符串通常不是类的使用者想要看到的。默认返回的字符串格式是类名加上“”符号和哈希码的十六进制表示,例如 PhoneNu…...
谷歌给到的185个使用生成式AI的案例
很多公司从利用AI回答问题,进而使用AI进行预测,向使用生成式AI Agent转变。AI Agent的独特之处在于它们可以采取行动以实现特定目标,比如引导购物者找到合适的鞋子,帮助员工寻找合适的健康福利,或在护理人员交接班期间…...
程序员如何通过专业与软技能提升核心竞争力
一、引言 随着AIGC的兴起,AI辅助编程工具如chatgpt、midjourney、claude等接二连三地涌现,编程领域的变革正逐步深化。面对这一变革,程序员们对于未来工作的前景有着种种不同的担忧和期待。他们担心AI可能取代部分编程工作,同时…...
基于YOLOv8的智能植物监测机器人
摘要:针对传统的植物病害检测方法依赖专家的经验,耗时耗力,并且准确性受限于个人的水平等问题。文中提出无线通信模块采用HTTP协议来传输数据图片,采用SoC核心处理器实现了便携化,采用对射式红外避障传感器实现自动避障功能。以YOLOv8算法为控制核心,并添加注意力机制以提…...
2024年OpenAI DevDay发布实时 API、提示缓存等新功能
就在几天前,一些重要人物如前 CTO Mira Murati 离开了 OpenAI。因此,看到 Sam Altman 在 DevDay 上登台,讨论开发者的新产品,感觉有点奇怪。 随着公司内部的这些变化,你不禁会想:我们还应该信任他吗&#…...
Raspberry Pi3B+之安装bookworm+Rpanion系统
Raspberry Pi3B之安装bookwormRpanion系统 1. 源由2. 系统安装3. 系统安装3.1 烧录系统3.2 设备接线3.3 配置无线3.4 更新系统3.5 安装git3.6 克隆Rpanion3.7 安装Rpanion 4. 系统管理5. 附录问题1:error: externally-managed-environment问题2:bookworm…...
无人机专业除理论外,飞手执照、组装、调试实操技术详解
无人机专业的学习除了丰富的理论知识外,飞手执照的获取、无人机的组装与调试等实操技术也是至关重要的。以下是对这些方面的详细解析: 一、无人机飞手执照 1. 必要性 法规要求:根据《民用无人驾驶航空器系统驾驶员管理暂行规定》等相关法规…...
【网路通信基础与实践番外二】TCP协议的流量控制和拥塞控制以及二者区别和例题
TCP协议是端对端的协议,因此在数据进行传输的过程受发送方,数据通道,接收方三方状态的影响。我们用水龙头来比喻数据发送方,水管来比喻数据通道,水桶来表示数据接收方。 图(a)表示水桶太小,来不及接受注入…...
SpringBoot3+Vue3开发后台管理系统脚手架
后台管理系统脚手架 介绍 在快速迭代的软件开发世界里,时间就是生产力,效率决定成败。对于构建复杂而庞大的后台系统而言,一个高效、可定制的后台脚手架(Backend Scaffold)无疑是开发者的得力助手。 脚手架 后台脚…...
OpenFeign微服务部署
一.开启nacos 和redis 1.查看nacos和redis是否启动 docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps 二.使用SpringSession共享例子 这里的两个例子在我的一个博客有创建过程,…...
【C语言】数组(下)
【C语言】数组(下) 6、二维数组的创建6.1二维数组的概念6.2二维数组的创建 7、二维数组的初始化7.1不完全初始化7.2完全初始化7.3按照行初始化7.4初始化时可以省略行,但是不能省略列 8、二维数组的使用8.1 二维数组的下标8.2二维数组的输入和…...
cGANs with Projection Discriminator
基于映射鉴别器的CGAN 模型中,判别器(Discriminator)不是通过将条件信息简单地与特征向量拼接(concatenate)来使用条件信息,而是采用一种基于投影的方式,这种方式更加尊重条件信息在底层概率模…...
mysql学习教程,从入门到精通,SQL HAVING 子句(32)
1、SQL HAVING 子句 当然!HAVING 子句在 SQL 中用于对分组后的结果进行过滤。它通常与 GROUP BY 子句一起使用,以便对聚合函数(如 SUM(), COUNT(), AVG(), MAX(), MIN() 等)的结果进行条件筛选。 以下是一个示例,假设…...
JavaScript while循环语句
While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。 while(条件){语句;} var i0;while(i<100){console.log(i);i1;} 注意:所有的for循环都可以改写为while循环...
49天精通Java(Day 2):Java的基本语法
上期内容回顾 在上一期的内容中,我们介绍了Java的基本概念、历史背景,并完成了JDK 1.8的安装与环境配置。你还编写并运行了第一个简单的Java程序“Hello, World!”。今天,我们将深入探讨Java的基本语法,包括变量、数据类型、运算…...
uni-app之旅-day01-home页
首页 3.0 创建 home 分支 🍕🍕🍕运行如下的命令,基于 master 分支在本地创建 home 子分支,用来开发和 home 首页相关的功能git branch(查看分支)git checkout -b home(创建home分支) 3.1 配置网络请求 ἲ…...
Vue3轻松实现导出Excel文件功能
文章目录 1.前言2.安装插件3.案例3.1 定义表格数据,设置 id 选择器3.2 据所选 dom 对象生成 sheetbook3.3 写入文件3.4 生成 xlsx文件4.完整代码1.前言 前端常用的导出 Excel的 js 库是 xlsx,但是 xlsx不能设置样式。要想设置样式,必要要结合 xlsx-style 插件一起使用,但是…...
在Kali Linux中使用VNC和iptables配置xrdp以实现远程连接
在Kali Linux中,使用VNC和iptables配置xrdp以实现远程连接涉及几个步骤。不过,值得注意的是,VNC和xrdp是两种不同的远程桌面协议,它们通常不会在同一配置中同时使用(除非有特殊的网络架构需求)。然而&#…...
小徐影院:Spring Boot技术下的影院革新
第四章 系统设计 4.1 系统的功能结构图 通过系统需求分析,本小徐影城管理系统的功能结构设计如图4-1所示: 图4-1 系统功能图 4.2 系统数据库设计 4.2.1 数据库E-R图 在该系统的信息中,由于数据库的支持,我们可以对数据库进行收集…...
命名空间
在 C 中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace 关键字的…...
使用 Elastic 将 AI 摘要添加到你的网站
作者:来自 Elastic Gustavo Llermaly 我们目前所知道的搜索(搜索栏、结果、过滤器、页面等)已经取得了长足的进步,并实现了多种不同的功能。当我们知道找到所需内容所需的关键字或知道哪些文档包含我们想要的信息时,尤…...
dOOv:Java 数据验证与映射库(简化业务逻辑)
dOOv 是一个为 Java 开发人员设计的轻量化库,专注于数据验证和对象间的映射。与传统的验证框架不同,dOOv 通过提供简洁、声明式的 API,使得开发者可以轻松地编写、扩展和维护验证和映射规则。其设计灵感源自领域驱动设计(DDD&…...
制作什么网站好/seo站外优化平台
1. 概论每一个链接过程都由链接脚本(linkerscript, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情.连接器有个默认的内置连接脚本, 可用…...
武汉开发网站建设/推广策略有哪些方法
2020款联想系推荐创作立场声明:文章为原创购买理由小新 Air14 2020锐龙版14.0英寸高性能轻薄笔记本如果你是普通学生或上班族,预算有限,又想电脑续航能力强,做PPT观感好,选它!配置CPU:第三代AMD…...
郑州做网站 熊掌号/互联网营销平台
本文实例讲述了python获取一组汉字拼音首字母的方法。分享给大家供大家参考。具体实现方法如下: #!/usr/bin/env python # -*- coding: utf-8 -*- def multi_get_letter(str_input): if isinstance(str_input, unicode): unicode_str str_input else: try: unicode…...
nh网站建设/谷歌推广网站
交换式服务 第2层的交换机和网桥在工作时要比路由器快许多,因为它们没有对数据包进行任何修改,不会花费时间去查看网络层头部的信息。 它们只是在决定转发、泛洪或是丢弃数据帧之前查看帧的硬件地址。与集线器不同,交换机能够创建私有的、专用…...
wordpress不同page/重庆疫情最新情况
启动Visual Studio 2019并创建一个新项目启动Visual Studio 2019,然后单击Create new project。选择“ASP.NET Core Web Application.”。选择Web应用程序模板,并保留默认项目名称和位置。在带有ASP.NET Core版本的下拉列表中,选择ASP.NET Co…...
网站开发web前端工程师/百度推广查询
方法一:参数:(1)add 增加路由 del 删除路由(2)-net 设置到某个网段的路由 gw 出口网关IP地址-host 设置到某台主机的路由 dev 出口网关物理设备名(3)route -n 查看路由表例子:添加路由route add -net 192.168.0.0/24 gw 192.168.0.1ro…...