当前位置: 首页 > article >正文

不可控的内存分配(CWE-789)

漏洞描述:内存分配的大小受外部控制的输入数据影响,且程序没有指定内存分配大小的上限

漏洞风险:攻击者可以使程序分配大量的内存,程序可能会因为内存资源不足而奔溃。

修复或规避建议:

  1. 设定合理的内存分配上限:在程序设计时,明确规定允许分配的最大内存,并拒绝超过该限制的请求。
  2. 输入验证与边界检查:在执行动态内存分配前,对用户输入或相关参数进行严格验证,防止异常值导致超大内存申请。
  3. 异常处理机制:确保在内存分配失败时,程序能够正确处理异常,避免直接崩溃。

public class Example{

       public int exampleFun(int length) {   //length为用户的输入数据

           String[]  buffer;

              if(length < 0 ) {   //没有验证length是否超过内存分配的上限

                 return 0;

              }

              buffer = new String[length];

              //其它语句

    }

}

示例1:不规范用法

示例2:不规范用法

以下 Java 代码示例在 new 一个字符串数组时,未限制申请的大小,可能导致内存溢出:

public class MemoryIssue {

    public static void main(String[] args) {

        int size = Integer.parseInt(args[0]); // 从外部输入获取数组大小

        String[] data = new String[size]; // 直接使用外部输入值分配数组

    }

}

问题分析:

  • 该代码从外部参数 args[0] 获取数组大小,并直接用于 new 数组。
  • 如果 size 过大,可能导致 堆内存不足,抛出 OutOfMemoryError 异常。
  • 在大内存环境(如服务器)下,虽然 -Xmx 选项可以调整 JVM 最大堆内存,但这 无法防止不受控的分配,仍可能导致服务异常中断。

Java语言中new 一个字符串对象,由于没有设定长度上限,可能会早造成分配堆内存不足。

现在主流的电脑或服务器内存都很大,可以设定更大的堆内存可以使用。通过java JVM中的-Xmx参数设定。虽然上述案例通过方法传入参数设定申请堆内存大小,一般开发人员是不太可能如此使用,但是由于可能被其他人调用该方法,传入超过可用堆内存的大小而造成创建对象失败,所以还是需要注意内存使用上要控制上限。

public class Example{

       static int MAX_LENGTH = 1000;  //指定内存分配的上限或动态判断剩余内存大小自动分配

       public int exampleFun(int length) {   //length为用户的输入数据

           if(length >  MAX_LENGTH || length < 0 ) {   //对length进行验证

                return 0;

              }

              String buffer = new String[length];

              //其它语句

    }

}

示例3:规范用法之一

增加一个合理的限制上限判断,这样不会导致对内存申请失败。

示例4:规范用法

public class SafeMemoryAllocation {

    private static final int MAX_SIZE = 100_000; // 设定合理的内存上限

    public static void main(String[] args) {

        int size = Integer.parseInt(args[0]);

       

        if (size > MAX_SIZE) {

            throw new IllegalArgumentException("内存申请超出最大限制");

        }

       

        String[] data = new String[size]; // 安全的内存分配

    }

}

通过限制最大内存分配,避免异常情况:

优化点:

  • 增加最大限制 (MAX_SIZE),避免无限制申请内存。
  • 在分配前进行检查,若 size 超出范围,则抛出 IllegalArgumentException,防止程序异常崩溃。
  • 更好的错误处理,确保在分配失败时,系统能够优雅降级,而非直接崩溃。

安全标准与检测工具支持

  • 该问题可通过 GB/T 34944 标准支持的安全检测工具进行自动检测,发现潜在的过量内存分配风险。
  • 尽管 JVM 在 new 数组时会抛出 OutOfMemoryError,但 依赖异常处理并不能彻底解决问题,仍需在代码层面进行预防。

在代码审计中,需要在代码层面查找未经验证的用户输入直接影响内存分配的情况。也就是查找内存分配代码是否涉及外部输入,并检查是否有上限约束。

关键检查点:

  • 动态数组或集合的创建
    • new 关键字直接使用外部输入参数,例如:
    • int size = Integer.parseInt(userInput);
    • int[] data = new int[size];  // 未限制 size
    • 使用 ArrayList, HashMap, ByteBuffer 等动态结构时,初始大小受输入控制:
    • int size = Integer.parseInt(request.getParameter("size"));
    • List<String> list = new ArrayList<>(size);  // 可能引发内存溢出
  • 对象的批量创建
    • 例如 Java StringBuilder, byte[], char[] 分配:
    • int length = Integer.parseInt(input);
    • StringBuilder sb = new StringBuilder(length);
  • 递归或循环中的过度分配
    • 递归创建大量对象,可能导致内存溢出:
    • public void recursiveAllocation(int depth) {
    •     if (depth > 0) {
    •         int[] data = new int[1000000];  // 递归导致大量内存分配
    •         recursiveAllocation(depth - 1);
    •     }
    • }

总结:
不可控的内存分配是潜在的安全风险,合理的限制与验证机制是避免漏洞的关键。另外,该类缺陷涉及到的CVE安全漏洞有CVE-2023-30837CVE-2024-32035CVE-2013-0640CVE-2022-4741CVE-2022-31804CVE-2021-34867CVE-2021-34868CVE-2021-34869CVE-2021-1568CVE-2021-27906CVE-2021-1283CVE-2024-37168

相关文章:

不可控的内存分配(CWE-789)

漏洞描述&#xff1a;内存分配的大小受外部控制的输入数据影响&#xff0c;且程序没有指定内存分配大小的上限 漏洞风险&#xff1a;攻击者可以使程序分配大量的内存&#xff0c;程序可能会因为内存资源不足而奔溃。 修复或规避建议&#xff1a; 设定合理的内存分配上限&…...

大型三甲医院算力网络架构的深度剖析与关键技术探索

一、引言 1.1 研究背景与意义 1.1.1 医疗信息化发展趋势 随着信息技术的迅猛发展&#xff0c;全球医疗行业正经历着深刻的数智化转型。数字化转型已成为医疗行业提升服务质量、优化运营效率、推动医学科研创新的关键驱动力。从电子病历系统的普及到远程医疗的广泛应用&#…...

获取要素类或表中的字段列表

要素类和表中往往包含一个或多个属性信息,可以通过ListFields()函数获取要素类中的字段列表. 操作方法: 1.打开IDLE,新建一个脚本窗口 2.导入arcpy模块 3.设置工作空间 arcpy.env.workspace "" 4.在try语句中对<>要素调用ListFields()方法 try:fieldlis…...

Android原生开发入门

1. 资源地址 Android官方教程Android参考手册 2. 必看基础模块 应用基础知识View 绑定 &#xff1a;绑定相当于Qt中的ui文件生成界面代码的机制&#xff0c;Qt中的ucc会自动将ui文件编译成ui_xxxx.h文件&#xff0c;Android开发中也一样。 Android中自动生成的代码在&#x…...

网络设备的安全加固

设备的安全始终是信息网络安全的一个重要方面&#xff0c;攻击者往往通过控制网络中设备来破坏系统和信息&#xff0c;或扩大已有的破坏。网络设备包括主机&#xff08;服务器、工作站、PC&#xff09;和网络设施&#xff08;交换机、路由器等&#xff09;。 一般说来&#xff…...

验证工具:VCS与Verdi介绍

VCS和Verdi都是Synopsys公司旗下的工具,在集成电路设计和验证领域发挥着重要作用。 VCS VCS,全称Verilog Compile Simulator,是Synopsys公司的一款Verilog仿真工具。它具有以下主要功能: 编译和仿真:VCS能够对Verilog设计代码和testbench进行编译,生成simv二进制可执行…...

CSV数据分析智能工具(基于OpenAI API和streamlit)

utils.py&#xff1a; from langchain_openai import ChatOpenAI from langchain_experimental.agents.agent_toolkits import create_csv_agent import jsonPROMPT_TEMPLATE """你是一位数据分析助手&#xff0c;你的回应内容取决于用户的请求内容。1. 对于文…...

【Day31 LeetCode】动态规划DP Ⅳ

一、动态规划DP Ⅳ 1、最后一块石头的重量II 1049 这题有点像脑筋急转弯&#xff0c;尽量让石头分成重量相同的两堆&#xff08;尽可能相同&#xff09;&#xff0c;相撞之后剩下的石头就是最小的。明白这一点&#xff0c;就与上一篇博客里的划分等和数组很相似。划分等和数组…...

产品经理的人工智能课 02 - 自然语言处理

产品经理的人工智能课 02 - 自然语言处理 1 自然语言处理是什么2 一个 NLP 算法的例子——n-gram 模型3 预处理与重要概念3.1 分词 Token3.2 词向量化表示与 Word2Vec 4 与大语言模型的交互过程参考链接 大语言模型&#xff08;Large Language Models, LLMs&#xff09;是自然语…...

华为手机nova9,鸿蒙系统版本4.2.0.159,智慧助手.今天版本是14.x,如何卸载智慧助手.今天?

手欠&#xff0c;将手机鸿蒙系统升级到4.2.0.159后&#xff0c;出现了负一屏&#xff0c;负一屏就是主页向左滑&#xff0c;出现了&#xff0c;如图的界面&#xff1a; 华为鸿蒙系统负一屏的界面 通过在手机中我的华为-搜索“开启或关闭智慧助手.今天&#xff08;负一屏&#…...

C#面试常考随笔13: 泛型的主要约束和次要约束是什么?

在 C# 泛型中&#xff0c;主要约束和次要约束用于限制泛型类型参数的使用&#xff0c;确保类型参数满足一定的条件&#xff0c;从而提高代码的可靠性和可维护性。以下是主要约束和次要约束的详细介绍&#xff1a; 主要约束 引用类型约束&#xff08;class&#xff09;&#x…...

win32汇编环境,窗口程序中自定义工具栏的使用示例

;运行效果 ;win32汇编环境,窗口程序中自定义工具栏的使用示例 ;工具栏一般放在菜单下面&#xff0c;相当于一个个小的对话框&#xff0c;当然你放在其它地方也可以。 ;原理是&#xff0c;创建一张BMP位图&#xff0c;比如下例用一张168*24的图&#xff0c;平均分成7部分&#x…...

【PyQt】pyqt小案例实现简易文本编辑器

pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器&#xff0c;使用PyQt5框架构建。以下是代码的主要功能和特点&#xff1a; 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…...

2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)

一&#xff1a;Node.js安装 浏览器中搜索Nodejs&#xff0c;或直接用网址:Node.js — 在任何地方运行 JavaScript 建议此处下载长期支持版本&#xff08;红框内&#xff09;: 开始下载&#xff0c;完成后打开文件: 进入安装界面&#xff0c;在此处勾选&#xff0c;再点击n…...

DeepSeek R1的隐藏提问技巧?

deepseek属于推理模型&#xff0c;而不是指令模型&#xff0c;R1对提示词非常敏感。 1、需要更加真诚地与deepseek进行对话。 在用r1时&#xff0c;需要将此前的问答方式改变。 例如&#xff1a; 你现在是一个新能源汽车的市场研究分析师&#xff0c;这里有一份调研报告总结…...

【HTML入门】Sublime Text 4与 Phpstorm

文章目录 前言一、环境基础1.Sublime Text 42.Phpstorm(1)安装(2)启动Phpstorm(3)“启动”码 二、HTML1.HTML简介(1)什么是HTML(2)HTML版本及历史(3)HTML基本结构 2.HTML简单语法(1)HTML标签语法(2)HTML常用标签(3)表格(4)特殊字符 总结 前言 在当今的软件开发领域&#xff0c…...

JVS低代码逻辑引擎多种业务场景触发案例配置:涵盖列表页按钮、表单数据、流程审批、外部API接口调用等

逻辑引擎作为JVS低代码开发套件的核心组件&#xff0c;专注于业务逻辑的快速构建与实现&#xff0c;它扮演着程序配置与执行的核心角色&#xff0c;适用于多样化的应用场景。该逻辑引擎设计灵活&#xff0c;能够通过多种配置方式被触发&#xff0c;以精准响应各类业务需求并实现…...

开发人员笔记本

为开发人员推荐大容量且性能稳定的电脑时&#xff0c;需考虑处理器、内存、存储、显卡和散热等因素。以下是几款适合开发的高性能电脑推荐&#xff1a; 1. Apple MacBook Pro 16英寸 (M2 Max/M2 Pro) 处理器: Apple M2 Max 或 M2 Pro内存: 32GB 或 64GB 统一内存存储: 1TB 或…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者&#xff1a;闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式&#xff08;Simple Queue&#xff09;工作队列模式&#xff08;Work Queue&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff…...

计算机网络笔记再战——理解几个经典的协议4

目录 IP——网际协议 IP地址 1. A类地址 2. B类地址 3. C类地址 4. D类地址&#xff08;组播地址&#xff09; 5. E类地址&#xff08;保留地址&#xff09; 特殊地址与私有地址 广播地址 IP多播 子网掩码 传统分类与CIDR/VLSM的对比 路由控制 默认路由 主机路由…...

Java CountDownLatch 用法和源码解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

深度学习在文本情感分析中的应用

引言 情感分析是自然语言处理&#xff08;NLP&#xff09;中的一个重要任务&#xff0c;旨在识别和提取文本中的主观信息。随着深度学习技术的发展&#xff0c;我们可以使用深度学习模型来提高情感分析的准确性和效率。本文将介绍如何使用深度学习进行文本情感分析&#xff0c…...

C++编码规范(六)关于C++标准库STL在使用中的一些规范和建议

C 标准库STL是 C 编程语言的重要组成部分&#xff0c;为开发者提供了丰富的功能和工具&#xff0c;极大地提高了开发效率和代码的可移植性。 其主要包括&#xff1a;标准容器库&#xff0c;输入 / 输出流库&#xff0c;算法库&#xff0c;迭代器库&#xff0c;字符串库&#xf…...

两种文件类型(pdf/图片)打印A4半张纸方法

环境:windows10、Adobe Reader XI v11.0.23 Pdf: 1.把内容由横排变为纵排&#xff1a; 2.点击打印按钮&#xff1a; 3.选择打印页范围和多页&#xff1a; 4.内容打印在纸张上部 图片&#xff1a; 1.右键图片点击打印&#xff1a; 2.选择打印类型&#xff1a; 3.打印配置&am…...

Vue3状态管理: Pinia使用技巧与最佳实践

Vue3状态管理: Pinia使用技巧与最佳实践 随着Web应用复杂度的提升&#xff0c;前端状态管理变得愈发重要。而在Vue3中&#xff0c;Pinia作为一种全新的状态管理工具&#xff0c;为我们提供了更加灵活和强大的状态管理解决方案。本文将从Pinia的基本概念入手&#xff0c;深入探讨…...

stm32点灯 GPIO的输出模式

目录 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09;HSI 高速内部时钟8Mhz 5.项目配置 6.代码 延时1s循环LED亮灭 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09…...

​K8S运行时切换-从Docker到Containerd的切换实战

1. 切换的原因 性能提升&#xff1a;Containerd通过减少抽象层提升了整体性能。 安全性增强&#xff1a;它提供了更直接的系统调用&#xff0c;减少了潜在的安全风险。 简化架构&#xff1a;Containerd拥有更简洁的设计&#xff0c;使得维护和故障排除更为容易。 官方支持趋…...

腾讯会议win7二维码展示不出来

问题&#xff1a;win64更新后二维码展示不出来&#xff0c;手机等登陆都不行 安装所在位置创建文档命名TBSDEBUG并去掉后缀...

swift 专题三 swift 规范一

一、Swift编码命名规范 对类、结构体、枚举和协议等类型的命名应该采用大驼峰法&#xff0c;如 SplitViewController。 文件名采用大驼峰法&#xff0c;如BlockOperation.swift。 对于扩展文件&#xff0c;有时扩展定义在一个独立的文件中&#xff0c;用“原始类型名 扩展名…...

WPS计算机二级•幻灯片放映与会议

听说这是目录哦 放映PPT时常用的快捷技巧&#x1f96c;设置放映模式&#x1f955;演讲备注的添加和隐藏&#x1fada;在PPT中插入附件并放映时打开&#x1fadb;隐藏幻灯片 不被放映和打印&#x1f344;‍&#x1f7eb;演讲计时模式&#x1f966;能量站&#x1f61a; 放映PPT时…...