了解编程语言的安全

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
函数计算FC,每月15万CU 3个月
简介: 【7月更文挑战第11天】本文介绍编程语言中的类型的安全与效率:安全不仅关乎防止错误,也影响性能和可预测性。

1 简介

安全通常意味着加密,如下为一个普通的安全通信过程,它将hello加密为另一个无意义的字符串,在最后再进行解密。

image.png

而语言的类型安全性似乎完全式另一个事情。它涉及防止运行时错误,如OCaml的Obj.magic或C的Unsafe.cast,但这些可能导致不安全的逃逸。

安全语言通过静态类型检查提高效率,消除动态检查的需要。类型系统也影响优化,如Fortran早期用于数值效率。

编译器利用类型信息进行优化,如Titanium中指针范围分析提升并行性能。ML Kit Compiler的区域推断甚至能减少垃圾收集,实现基于堆栈的内存管理。

在所有语言的安全这方面,C 语言的漏洞数量最多,占过去 10 年中报告的所有漏洞的 50%。

在我们进一步深入研究之前,在评估这些项目时,我们应该考虑两个因素。虽然从表面上看,有些人可能会错误地认为 C 天生就更容易受到攻击,但事实并非如此。

对于初学者来说,编写的代码比任何其他语言都多,为发现漏洞提供了更多机会。

事实上,C语言的使用时间比大多数其他语言要长得多,并且是我们使用的大多数产品和平台的核心。因此,它必然比其他漏洞具有更多的已知漏洞

2 类型的效率和安全

语言的类型安全很少有绝对的。安全通常为程序员提供“逃生口”,例如对用其他语言编写的代码的外部函数调用,可能是不安全的语言。

事实上,这种逃生口有时会在语言本身内以受控形式提供——OCaml 中的 Obj.magic(Leroy, 2000), Unsafe.cast 在新泽西州执行标准ML 等 Modula-3 (Cardelli et al., 1989; Nelson, 1991) 和 C] (Wille, 2000)。

更进一步,提供一种旨在实施的“不安全的子语言”低级运行时设施,例如垃圾收集器。

特殊功能这种子语言的一部分只能在明确标记为不安全的模块中使用。
Cardelli (1996) 阐述了一种不同的语言安全性观点,区分所谓的捕获和未捕获的运行时错误。

捕获的错误会导致计算立即停止(或引发可以在程序中干净地处理的异常),而未被捕获错误可能允许计算继续(至少一段时间)。

未捕获错误的示例可能是访问超出末尾的数据像 C 这样的语言中的数组。在这种情况下,一种安全的语言可以防止运行时未捕获的错误。

还有一种观点侧重于可移植性。它可以表示为口号,“安全的语言完全由其程序员手册定义。”
让语言的定义成为程序员需要的一组东西理解以预测语言中每个程序的行为。

那么像C这样的语言的手册并不构成定义,由于某些程序的行为(例如,涉及未经检查的数组如果不知道特定 C 编译器如何在内存中布局结构等细节,则无法预测访问或指针算术),并且同一个程序在被不同的编译器执行时可能会有完全不同的行为。

相比之下,用于/和指定的手册(具有不同的严格程度)语言中所有程序的确切行为。一个类型良好的程序在任何正确的实现下都会产生相同的结果这些语言中。

3 效率

计算机科学中的第一类系统,从 1950 年代开始使用 Fortran (Backus, 1981) 等语言,被引入以提高效率。

通过区分整数值来提高数值计算的效率算术表达式和实值表达式;这允许编译器使用不同的表示并生成适当的机器指令原始操作。

在安全语言中,进一步的效率改进是通过消除许多需要的动态检查来获得保证安全(通过静态证明他们将永远得到满足)。

今天,大多数高性能编译器严重依赖收集到的信息在优化和代码生成阶段由类型检查器执行。甚至本身没有类型系统的语言的编译器努力恢复此类型信息的近似值。依赖类型信息的效率改进可能来自于一些令人惊讶的地方。

4 C语言的安全例子

最近已经表明,不仅代码使用类型分析生成的信息可以改进并行科学程序中的生成决策以及指针表示。在Titanium 语言 (Yelick et al., 1998) 使用类型推断技术来分析指针的范围,并能够做出明显更好的决策在此基础上,程序员显式地手动调整他们的程序。

而如下图缓冲区错误(CWE-119)是C语言中最常见的安全漏洞,与C++的漏洞配置文件类似。
这是可以理解的,因为其他语言中常见的大多数 CWE 都与 Web 和 Web 服务问题有关,而这些问题在 C 语言中无关紧要C++。

需要注意的是,这组漏洞(有时称为内存损坏)通常会产生严重后果。

image.png

在ML Kit Compiler中 使用了更强大的区域推断算法(Gifford、Jou velot、Lucassen 和 Sheldon,1987;Jouvelot 和 Gifford,1991;Talpin 和朱维洛,1992;托夫特和塔尔平,1994,1997; Tofte 和 Birkedal,1998 年)到将垃圾收集的大部分(在某些程序中,全部)替换为基于堆栈的内存管理。

下图显式了使用C语言实现的不同项目中的漏洞数量。

image.png

虽然大多数语言都用于构建数百甚至数千个包,但跟踪基于 C 语言构建的开源项目很容易。这使我们能够确切地了解哪些开源库在多年来漏洞增加之后,报告的已知漏洞有所增加。

目录
相关文章
|
11月前
|
缓存 JavaScript 前端开发
优化中文编程语言的基准性能
【7月更文挑战第7天】本文探讨了对中文编程语言OTao的优化,涉及衡量性能、基准测试和剖析等关键步骤。通过分析和优化这些热点,可以提升整体性能。
185 3
优化中文编程语言的基准性能
|
11月前
|
机器学习/深度学习 人工智能 安全
回望现阶段人工智能招聘岗位和条件
【7月更文挑战第4天】AI公司招聘涉及多个机器学习角色:所有职位都强调尖端ML技术和对用户体验的改进。
508 4
回望现阶段人工智能招聘岗位和条件
|
9月前
|
缓存 测试技术 API
API的封装步骤流程
API封装流程是一个系统化的过程,旨在将内部功能转化为可复用的接口供外部调用。流程包括明确需求、设计接口、选择技术和工具、编写代码、测试、文档编写及部署维护。具体步骤为确定业务功能、数据来源;设计URL、请求方式、参数及响应格式;选择开发语言、框架和数据库技术;实现数据连接、业务逻辑、错误处理;进行功能、性能测试;编写详细文档;部署并持续维护。通过这些步骤,确保API稳定可靠,提高性能。
|
11月前
|
XML 安全 程序员
理解不同编程语言类型安全的需求
【7月更文挑战第12天】本文介绍编程语言类型系统与语言设计密不可分,影响编程习惯和语言安全。微服务架构允许跨语言技术栈,每个服务都能用最适合的平台构建,强调代码质量原则,以实现高效解决方案。
140 0
|
11月前
|
人工智能 架构师 程序员
[AI 程序员 Devyan] 终于找到人帮我写代码了
了解 Devyan,这款由人工智能驱动的编程助手,如何通过协调多种角色来简化和优化软件开发过程。
[AI 程序员 Devyan] 终于找到人帮我写代码了
|
7月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
730 6
|
8月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
378 2
动态规划算法学习三:0-1背包问题
|
SQL 关系型数据库 数据库
SQL Server语法基础:入门到精通
SQL Server语法基础:入门到精通
441 9
SQL Server语法基础:入门到精通
|
编译器 Go Swift
【Swift开发专栏】Swift中的错误处理与异常捕获
【4月更文挑战第30天】Swift的错误处理机制通过遵循`Error`协议的类型定义和传播错误,以声明式方式捕获和处理问题。本文分为三部分:1) 错误定义与传播,包括自定义错误类型和使用`throw/try/catch`处理;2) 错误处理语法,如必须和可选捕获,以及错误传播;3) 实际应用中的最佳实践,如清晰定义错误、使用错误码和避免滥用错误处理。理解并熟练运用这些机制能提升代码的可靠性和可维护性。
291 1
|
存储 数据采集 分布式计算
构建MaxCompute数据仓库的流程
【4月更文挑战第1天】构建MaxCompute数据仓库的流程
161 2