Linux通用系统高危漏洞(CVE-2024-1086)修复案例

news2024/11/22 15:13:28

一、漏洞描述

2024年3月28日, Linux kernel权限提升漏洞(CVE-2024-1086)的PoC/EXP在互联网上公开,该漏洞的CVSS评分为7.8,目前漏洞细节已经公开披露,美国网络安全与基础设施安全局(CISA)6月1日也更新了其已知漏洞(KEV)目录,要求联邦机构在 2024 年 6 月 20 日之前打上补丁,修复追踪编号为 CVE-2024-1086 的 Linux 内核权限提升漏洞。CVE-2024-1086 是一个高危 use-after-free 漏洞,于 2024 年 1 月 31 日首次披露,存在于 netfilter: nf_tables 组件中,相关漏洞代码于 2014 年 2 月的一项提交并入。攻击者可利用该漏洞可在本地进行提权操作,最高可获取目标服务器的root管理权限。该漏洞于2024年3月28日被公开披露,并在互联网上出现了相关的概念验证(PoC)和攻击工具。由于该漏洞的公开性,攻击者可能会利用这个漏洞进行恶意攻击,因此建议尽快采取修复措施。

漏洞原理:Linux内核版本v5.14 – v6.6的netfilter 子系统nf_tables组件中存在释放后使用漏洞,由于在nft_verdict_init()函数中,允许正值作为hook判决中的丢弃错误,因此当 “nf_hook_slow ()” 函数在NF_DROP一起发出类似于NF_ACCEPT的丢弃错误时,nf_hook_slow()函数可能会导致双重释放漏洞,本地低权限威胁者可利用该漏洞将权限提升为root。Netfilter 是 Linux 内核提供的一个框架,允许进行各种与网络有关的操作,如数据包过滤、网络地址转换(NAT)和数据包混淆。

影响范围: 该漏洞影响了使用Linux内核版本v5.14 – v6.6 版本(不包括分支修补版本 v5.15.149、v6.1.76和v6.6.15)的大多数Linux系统/内核:

3.15<= Linux kernel < 6.1.76
5.2<= Linux kernel < 6.6.15
6.7<= Linux kernel < 6.7.3
6.8:rc1 = Linux kernel

修复建议:

  • 升级Linux内核版本修复漏洞。Linux 多个稳定版目前已经修复,参考如下:
    v5.4.269 及更高版本;v5.10.210 及更高版本;v6.6.15 及更高版本;v4.19.307 及更高版本;v6.1.76 及更高版本;v5.15.149 及更高版本;v6.7.3 及更高版本
  • 若相关用户暂时无法进行更新,如果业务不需要,可以通过阻止加载受影响的 netfilter (nf_tables) 内核模块来缓解。
  • 如果无法禁用该模块,可在非容器化部署中,对用户命名空间进行限制。

在这里插入图片描述
关联资源:Notselwyn公告、nftables、How do I prevent a kernel module from loading automatically?、How to modify the kernel command-line in Red Hat Enterprise Linux 9、内核官网、openeuler安全中心、统信公告、麒麟公告、龙蜥公告及修复、华为欧拉、src-openEuler、nvd.nist

二、复现验证及修复

1、漏洞复现过程(来源Github)

在这里插入图片描述

2、复现脚本

复现脚本exploit可检测内核v5.14 到(including) v6.6版,完成权限提升复现,但不包括v5.15.149>, v6.1.76>, v6.6.15>这些分支,它们已经完成补丁修复;

git clone https://github.com/Notselwyn/CVE-2024-1086 

Cloning into 'CVE-2024-1086'...
remote: Enumerating objects: 2196, done.
remote: Counting objects: 100% (169/169), done.
remote: Compressing objects: 100% (88/88), done.
remote: Total 2196 (delta 87), reused 158 (delta 77), pack-reused 2027
Receiving objects: 100% (2196/2196), 2.10 MiB | 4.42 MiB/s, done.
Resolving deltas: 100% (762/762), done.
#安装
cd CVE-2024-1086
make  #报错
musl-gcc -I./include -I./include/linux-lts-6.1.72 -Wall -Wno-deprecated-declarations src/main.c src/env.c src/net.c src/nftnl.c src/file.c -o ./exploit -static ./lib/libnftnl.a ./lib/libmnl.a
make: musl-gcc: No such file or directory
make: *** [Makefile:25: _compile_static] Error 127
#安装
yum install musl-gcc musl-devel -y
CVE-2024-1086/exploit  #完成后会生成二进制文件

./exploit  #输出如下
[ygcg@zq-fdfs-25 CVE-2024-1086]$ ./exploit 
[*] creating user namespace (CLONE_NEWUSER)...
[*] creating network namespace (CLONE_NEWNET)...
[*] setting up UID namespace...
[*] configuring localhost in namespace...
[*] setting up nftables...
[+] running normal privesc
[*] waiting for the calm before the storm...
[*] sending double free buffer packet...
[*] spraying 16000 pte's...
[*] checking 16000 sprayed pte's for overlap...
[+] confirmed double alloc PMD/PTE
[+] found possible physical kernel base: 00000006f1600000
[+] verified modprobe_path/usermodehelper_path: 00000006f2e56580 ('/sanitycheck')...
[*] overwriting path with PIDs in range 0->4194304...  
[!] verified modprobe_path address does not work... CONFIG_STATIC_USERMODEHELPER enabled? #执行完就跳出了,并未继续越权成功,可能对于内核:Linux 5.10.0-60.70.0.94.oe2203 并不管用


#对于内核版本 > 6.4,还需要检查内核配置 CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y时,用该漏洞不影响
zcat /proc/config.gz|grep CONFIG_INIT_ON_ALLOC  #检查发现输出如下
\# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
#检查LInux是否启用了CONFIG_USER_NS和CONFIG_NF_TABLES
zcat /proc/config.gz|grep CONFIG_USER_NS  #输出如下
CONFIG_USER_NS=y
zcat /proc/config.gz|grep CONFIG_NF_TABLES #输出如下
#=y:表示该功能被编译进内核中,始终可用。
#=m:表示该功能被编译为模块,可以根据需要加载或卸载。
#=n:表示该功能被禁用,不会编译进内核或作为模块。
CONFIG_NF_TABLES=m
CONFIG_NF_TABLES_INET=y
CONFIG_NF_TABLES_NETDEV=y
CONFIG_NF_TABLES_IPV4=y
CONFIG_NF_TABLES_ARP=y
CONFIG_NF_TABLES_IPV6=y
CONFIG_NF_TABLES_BRIDGE=m
#启用nf_tables模块
modprobe nf_tables
#永久加载这个模块,可以将其添加到 /etc/modules-load.d/ 目录下的某个文件中:
echo nf_tables | sudo tee /etc/modules-load.d/nf_tables.conf #或写入modules.conf
#查看
lsmod|grep -i nf_tables
nf_tables             274432  25  #其中,274432:这是模块的大小,单位是字节。表示 nf_tables 模块占用了大约 274432 字节的内存空间。25表示有25个其他模块依赖于 nf_tables 模块。该行表示nf_tables 模块已加载
nfnetlink              20480  3 nf_conntrack_netlink,nf_tables
libcrc32c              16384  3 nf_conntrack,nf_nat,nf_tables
#查看模块是否属于LInux启动初始化映像文件系统加载的一部分。一般不是
lsinitrd /boot/initramfs-$(uname -r).img|grep nf_tables.ko

3、现场处理

现场使用的是云能的Euler V22.10 U2版 ,它基于**openEuler 22.03 LTS SP2**版本发布,内核版本:Linux 5.10.0-60.70.0.94.oe2203;现场用poc脚本测试并未越权成功,但是据网络相关经验表明,openEuler 22.03 LTS的内核5.10.0-60.18.0.50.oe2203.x86_64版本是可以越权成功的,案例中内核升级到了5.10.0-60.139.0.166.oe2203.x86_64,比现场版本高;现场内核验证结果如下所示:

在这里插入图片描述

#可用内核版本
yum check-update |grep kernel-*  #或yum check-update kernel,yum list available kernel

kernel.x86_64                         5.10.0-136.49.0.127.10.oe2203.bclinux update    
kernel-devel.x86_64                   5.10.0-136.49.0.127.10.oe2203.bclinux update    
kernel-headers.x86_64                 5.10.0-136.49.0.127.10.oe2203.bclinux update    
kernel-tools.x86_64                   5.10.0-136.49.0.127.10.oe2203.bclinux update   
#或
yum list kernel --showduplicates
#查看可用补丁
yum search linux-kernel

#非容器化部署中,可以通过将 user.max_user_namespaces 设置为 0 来禁用用户命名空间
echo "user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf
sysctl -w kernel.unprivileged_userns_clone=0  #禁用非特权用户创建命名空间的能力
sysctl -p /etc/sysctl.d/userns.conf
#禁止nf_tables模块
vi /etc/modprobe.d/nf_tables-blacklist.conf  #新增如下内容:
blacklist nf_tables
#验证
insmod nf_tables.ko.xz   #加载/usr/lib/modules/5.10.0-60.70.0.94.oe2203.bclinux.x86_64/kernel/net/netfilter/nf_tables.ko.xz
#卸载已加载的目标模块
modprobe -r module_name
echo "blacklist nf_tables" >> /etc/modprobe.d/nf_tables-blacklist.conf  ##同上,将模块加入blacklist,避免自动再次载入
echo "install nf_tables /bin/false" >> /etc/modprobe.d/nf_tables-blacklist.conf  #这样,当OS下次尝试加载模块时,将执行/bin/false;这将防止模块按需加载
cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.$(date +%m-%d-%H%M%S).bak #备份 initramfs(Initial RAM Filesystem),如果目标模块属于initramfs的一部分,需rebuild initramfs,执行如下
dracut --omit-drivers module_name -f  #重建
#持久化配置
MODNAME="module_name"; echo "omit_dracutmodules+=\" $MODNAME \"" >> /etc/dracut.conf.d/omit-$MODNAME.conf  #不需要的时候,删除该文件即可
grubby --info ALL (To view changes in all available kernels) 

内核升级方式:内核的更换主要有三重方式,第一种是下载源码进行编译;第二种是通过添加内核源,然后使用yum进行安装;第三种是通过下载rpm包,然后通过rpm来进行安装。推荐第三中方式。

#查看内核启动顺序
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg  #启动顺序默认降序排列,从0开始
grub2-set-default 0  #设置最新的内核为默认启动

现场欧拉系统,通过POC测试脚本暂无法确定,官网查看,详情如下:
在这里插入图片描述
在这里插入图片描述
受影响版本:

1.openEuler-20.03-LTS-SP1(4.19.90):受影响
2.openEuler-20.03-LTS-SP3(4.19.90):受影响
3.openEuler-20.03-LTS-SP4(4.19.90):受影响
4.openEuler-22.03-LTS(5.10.0):受影响
5.openEuler-22.03-LTS-SP1(5.10.0):受影响
6.openEuler-22.03-LTS-SP2(5.10.0):受影响
7.openEuler-22.03-LTS-SP3(5.10.0):受影响
8.openEuler-22.03-LTS-Next(5.10.0):受影响
9.master(6.1.0):不受影响

漏洞修复:penEuler-HotPatchSA-2024-1008、官方补丁
在这里插入图片描述
补丁说明:

//net/netfilter/nf_tables_api.c	
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 0d0b76a5ddfaa9..f586e8b3c6cfac 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -9340,16 +9340,10 @@ static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,
 	data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE]));
 
 	switch (data->verdict.code) {
-	default:
-		switch (data->verdict.code & NF_VERDICT_MASK) {
-		case NF_ACCEPT:  
-		case NF_DROP:     
-		case NF_QUEUE:    
-			break;
-		default:
-			return -EINVAL;
-		}
-		fallthrough;
+	case NF_ACCEPT:
+	case NF_DROP:
+	case NF_QUEUE:
+		break;
 	case NFT_CONTINUE:
 	case NFT_BREAK:
 	case NFT_RETURN:
@@ -9384,6 +9378,8 @@ static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,
 
 		data->verdict.chain = chain;
 		break;
+	default:
+		return -EINVAL;
 	}
 
 	desc->len = sizeof(data->verdict);

现场处理:

# 新增openEuler-22.03-LTS-SP2 repo源
vi /etc/yum.repos.d/openEuler-22.03-LTS-SP2.repo
[SP2_OS]
name=SP2_OS
baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/OS/$basearch/
metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/OS&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler

[SP2_everything]
name=SP2_everything
baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/everything/$basearch/
metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/everything&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/everything/$basearch/RPM-GPG-KEY-openEuler

[SP2_EPOL]
name=EPOL
baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/EPOL/main/$basearch/
metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/EPOL/main&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler

[SP2_debuginfo]
name=debuginfo
baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/debuginfo/$basearch/
metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/debuginfo&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/debuginfo/$basearch/RPM-GPG-KEY-openEuler

[SP2_source]
name=source
baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/source/
metalink=https://mirrors.openeuler.org/metalink?repo=$releasever&arch=source
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/source/RPM-GPG-KEY-openEuler

[SP2_update]
name=SP2_update
baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/update/$basearch/
metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/update&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/OS/$basearch/RPM-GPG-KEY-openEuler

[SP2_update-source]
name=SP2_update-source
baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/update/source/
metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/update&arch=source
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP2/source/RPM-GPG-KEY-openEuler

#参考上问yum升级内核到:kernel-5.10.0-153.43.0.121.oe2203sp2.x86_64
yum  --disablerepo=\* --enablerepo=SP2_update list kernel --showduplicate|grep 5.10.0-153.43.0.121  #输出
kernel.x86_64            5.10.0-153.43.0.121.oe2203sp2                SP2_update
#升级
yum  --disablerepo=\* --enablerepo=SP2_update  --nogpgcheck update kernel-5.10.0-153.43.0.121.oe2203sp2.x86_64
#验证
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg  #输出如下
BigCloud Enterprise Linux (5.10.0-153.43.0.121.oe2203sp2.x86_64) 22.10 LTS
BigCloud Enterprise Linux (5.10.0-60.70.0.94.oe2203.bclinux.x86_64) 22.10 LTS
#设置第一个为默认,实际不设置也是优先第一个
grub2-set-default 0

grub2-editenv list  #输出,这里也证明默认的启动一变成新的内核版本,与cat /etc/default/grub的GRUB_DEFAULT对应
saved_entry=BigCloud Enterprise Linux (5.10.0-153.43.0.121.oe2203sp2.x86_64) 22.10 LTS
boot_success=0
#备份旧镜像,之后就会找到新镜像来启动
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak  #备份呢当前启动镜像
reboot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1868936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

npm install报错Maximum call stack size exceeded

npm 报错 方案&#xff1a; npm cache clean --force npm install

【专业性强】地球科学SCI期刊,中科院2区,学术影响力大

一、期刊名称 GIScience & Remote Sensing 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;地球科学 影响因子&#xff1a;6.7 中科院分区&#xff1a;2区 三、期刊征稿范围 GIScience & Remote Sensing是一本完全开放获取的期刊&#xff0c;发表…

Java基础知识整理笔记

目录 1.关于Java概念 1.1 谈谈对Java的理解&#xff1f; 1.2 Java的基础数据类型&#xff1f; 1.3 关于面向对象的设计理解 1.3.1 面向对象的特性有哪些&#xff1f; 1.3.2 重写和重载的区别&#xff1f; 1.3.3 面向对象的设计原则是什么&#xff1f; 1.4 关于变量与方…

约课健身管理系统小程序源码

健身达人的智能助手 一款基于FastAdminThinkPHPUniapp开发的米扬约课健身管理系统&#xff0c;应用于健身房&#xff0c;健身工作室&#xff0c;运动会所&#xff0c;运动场馆&#xff0c;瑜伽馆&#xff0c;拳馆等泛健身行业的场馆中。米扬约课健身致力于为各种健身场馆打造真…

数学类-课程资料推荐-中科大教师首页

http://staff.ustc.edu.cn/~rui/cn/rui-course.html 数学分析讲义&#xff08;第一册&#xff09; (ustc.edu.cn)

C# 入门—基本语法

一、数据类型 C# 语言中内置了一些基本的数据类型&#xff0c;数据类型用来指定程序中变量可以存储的数据的类型&#xff0c;C# 中的数据类型可以大致分为三类&#xff1a; 值类型&#xff08;Value types&#xff09;&#xff1b;引用类型&#xff08;References types&…

Windows 电脑类别怎么区分?不同类别区分总结

电脑类别 Windows 电脑的类别有哪些&#xff1f;我们可以大致分为这三类&#xff1a;CopilotPC、AI PC、普通 PC。下面就来看看这些电脑类别的区别。 普通 PC 普通 PC 就是指那些标准的台式电脑或者笔记本电脑&#xff0c;它们是由中央处理器&#xff08;CPU&#xff09;以及…

期货日内交易口诀

1、向下差价法 前提&#xff1a;要判断准确后市是向下行情走势。被套后&#xff0c;等反弹到一定的高度&#xff0c;估计见短线高点了&#xff0c;先卖出&#xff0c;待其下跌一段后再买回。通过这样不断地高卖低买来降低成本&#xff0c;最后等总资金补回了亏损&#xff0c;完…

前端写代码真的有必要封装太好么?

前言 封装、代码复用、设计模式…… 这些都是方法&#xff0c;业务才是目的。技术始终是为业务服务的。能够满足业务需求&#xff0c;并且用起来舒服的&#xff0c;都是好方法。 不存在一套适用于所有项目的最佳代码组织方法&#xff0c;你需要结合业务&#xff0c;去不断地…

基于PHP+MySQL组合开发家政预约服务小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;家政服务行业也逐渐融入了科技的力量。为了满足市场需求&#xff0c;我们开发了一款基于 PHPMySQL 组合的家政预约服务小程序源码系统。该系统不仅提供了便捷的家政服务预约功能&#xff0c;还具备完整的安装代码包和详细的搭建教程&…

海南云亿商务咨询有限公司怎么样?

在数字化浪潮汹涌的当下&#xff0c;电商行业正以前所未有的速度发展&#xff0c;而抖音作为新兴的电商平台&#xff0c;凭借其独特的短视频直播形式&#xff0c;吸引了无数商家和消费者的目光。海南云亿商务咨询有限公司&#xff0c;作为抖音电商服务的佼佼者&#xff0c;凭借…

苹果相册视频怎么提取音频,一个小工具就能轻松搞定

苹果相册视频怎么提取音频&#xff1f;我们时常捕捉到那些转瞬即逝的美好瞬间&#xff0c;无论是家人欢聚的温馨画面&#xff0c;还是朋友间开怀大笑的片段&#xff0c;每一帧都承载着满满的回忆。而藏匿于这些珍贵视频背后的&#xff0c;往往还有那首触动心弦的背景音乐&#…

[leetcode]squares-of-a-sorted-array. 有序数组的平方

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int n nums.size();vector<int> ans(n);for (int i 0, j n - 1, pos n - 1; i < j;) {if (nums[i] * nums[i] > nums[j] *…

Java的lambda表达式使用方式,lambda表达式到底为了做什么

感觉从狭义的使用目的来说&#xff0c;lambda表达式就是为了简化某些匿名内部类&#xff0c;当然不是所有的匿名内部类都能被简写。也就是你想要某些返回值作为参数不用去显示的写调用方法或者传参&#xff0c;具体来看看下面的例子。 // Java7及以前假设想要排序List的方式&a…

吴恩达LangChain教程:Embedding与文档解析

当前有很多应用想要实现根据文档或者文本内容实现用户问答&#xff0c;或者实现多轮会话能力&#xff0c;这时候就会使用到Embedding的能力。 01 | 使用类介绍 想要依据Embedding实现文本检索&#xff0c;需要引入如下的依赖。 其中&#xff0c;RetrievalQA的作用是对一些文档…

开发、测试、产品、运营绩效考核表(Excel原件)

1、产品&运营绩效考核表 2、开发绩效考核表 3、测试绩效考核表 4、CPI指标库 软件资料清单列表部分文档&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调…

鸿蒙开发Ability Kit(程序框架服务):【FA模型切换Stage模型指导】 module的切换

module的切换 从FA模型切换到Stage模型时&#xff0c;开发者需要将config.json文件module标签下的配置迁移到module.json5配置文件module标签下&#xff0c;具体差异见下列表格。 表1 FA模型module标签与Stage模型module标签差异对比 FA标签标签说明对应的Stage标签差异说明…

博尔捷业绩双降:近2000万赔偿80宗案件未了,旗下公司多次沦为被执行人

《港湾商业观察》廖紫雯 日前&#xff0c;BridgeHR Tech Group Inc.&#xff08;博尔捷&#xff09;递表港交所&#xff0c;保荐机构为华泰国际。博尔捷国内运营主体为上海博尔捷数字科技集团有限公司、上海杰而博科技&#xff08;集团&#xff09;有限公司、博尔捷管理咨询&a…

自媒体入门:利用ChatGPT快速制作高点击率的文章和视频

前言 在当今信息爆炸的时代&#xff0c;自媒体已经成为许多人展示自己、分享知识以及赚取收入的重要渠道。对于刚入门的自媒体新人来说&#xff0c;内容创作往往是最大的挑战之一。然而&#xff0c;随着人工智能技术的迅猛发展&#xff0c;ChatGPT 这样的工具为我们提供了高效…

AI在落地企业应用时的“数据幻觉”缘何这么难解决一谈LORA微调与数据质量处理之争

开篇 近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;越来越多的企业开始将AI落地应用于业务中。然而&#xff0c;不可忽视的是&#xff0c;企业在落地LLM RAG系统时&#xff0c;常常面临一个令人头痛的问题——数据幻觉。 就像透过雾霭的眼睛,看到了一片迷人的景…