过渡到内存安全语言:挑战和注意事项


开放源代码安全基金会 ( 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)来使用条件信息,而是采用一种基于投影的方式,这种方式更加尊重条件信息在底层概率模…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
