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

一、漏洞描述

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 kernelkernel.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 0grub2-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.mzph.cn/bicheng/36131.shtml

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

相关文章

vue 中html 转word 遇到的坑记录

1.单选框的展示 <span style="font-family: Wingdings;font-size: 12pt;">{{items.cellValue == i ? "" : "¡" }} </span>2.多选框的展示 <span style=" font-family: 宋体">{{items.selRadio.includes(ind…

测试:MyBatisDemo

MyBatis Demo 先创建一个 Maven 项目&#xff0c;名称为 MyBatis01。 之后创建并连接 MySQL 数据库&#xff0c;然后执行 sql 脚本&#xff1a; CREATE DATABASE mybatis;USE mybatis;DROP TABLE IF EXISTS user;CREATE TABLE user ( id int(20) NOT NULL, name varchar(30)…

数据治理新纪元:筛斗数据引领企业信息优化潮流

数据治理新纪元&#xff1a;筛斗数据引领企业信息优化潮流 随着数字化时代的深入发展&#xff0c;数据已成为企业运营和决策的核心驱动力。然而&#xff0c;海量的数据往往伴随着质量参差不齐、格式各异等问题&#xff0c;如何有效地管理和利用这些数据&#xff0c;成为企业面…

等级保护 | 如何完成等保的建设整改

等级保护整改是等保基本建设的一个阶段。为了能成功通过等级测评&#xff0c;企业要根据等级保护建设要求&#xff0c;对信息和信息系统进行网络安全升级&#xff0c;对定级对象当前不满足要求的进行建设整改&#xff0c;包括技术层面的整改&#xff0c;也包括管理方面的整改。…

ABB机器人控制柜各模块指示灯状态说明

ABB机器人控制柜各模块指示灯状态说明 主计算机模块位于控制柜的正前方,负责机器人的各种运算处理,安全模块主要负责安全相关的信号处理,驱动单元模块用于接收上位机指令,驱动机器人运动,轴计算机模块用于接收主计算机的运动指令和串

入门JavaWeb之 Response 验证码和重定向

Response 写验证码&#xff1a; package com.demo.response;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse…

leetcode167:两数之和|| - 输入有序数组

题目链接&#xff1a;167. 两数之和 II - 输入有序数组 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> twoSum(vector<int>& numbers, int target) {int left 0, right numbers.size() - 1;while(left < right){if(numbe…

Qt动态监测USB插拔事件

需要引用头文件 #include <windows.h> #include <dbt.h> Qt4用 bool winEvent(MSG *m, long *result); 或 bool winEventFilter(MSG *m, long *result); 例如&#xff1a; bool USBTest::winEvent(MSG *m, long *result) {int msgType m->message;if (m…

postman接囗测试工具详解

Postman 是一种广泛使用的API开发和测试工具,用于发送HTTP请求、测试API接口、自动化测试、生成API文档等。以下是对Postman的详细介绍及其使用指南: 主要功能 发送请求: 支持GET、POST、PUT、DELETE、PATCH等HTTP方法。允许设置请求头、请求体、查询参数、路径变量等。支持…

Java数据结构算法(最长递增序列动态规划)

前言: 最长递增子序列(Longest Increasing Subsequence, LIS)是指在一个给定的序列中,找到一个最长的子序列,使得这个子序列中的元素是单调递增的。子序列不要求在原序列中连续。 实现原理 一种常见的方法是使用动态规划来解决最长递增子序列问题。以下是具体步骤: 定义…

AT89S52测试脉冲输出

/*AT89S52测试脉冲输出 2012 5 8PCB四入四出板 L270 CODE 771 PAST 测试步进电机伺服电机旋转位置**/ /*****---------------********/ /*****|手动&#xff1a; XXX |******/ /*****| |******/ /***** ---------------*******/ #include &…

浏览器页面打不开(网络连接正常的情况下)

目录 一、代理被打开 二、DNS被篡改 三、网络配置出现问题 四、浏览器配置问题 一、代理被打开 1. 右击Wifi图标 2.点击“打开网络和internet设置” 3. 点击代理&#xff0c;把该窗口所有的东西都关闭&#xff0c;尤其是代理服务器 二、DNS被篡改 如果第一个方法不行&am…

浅谈逻辑控制器之仅一次控制器

浅谈逻辑控制器之仅一次控制器 “仅一次控制器”(Once Only Controller) 是一个非常实用的组件&#xff0c;它允许用户控制测试计划中的某些操作仅执行一次&#xff0c;无论其所在的线程组或父级控制器设置了多少次循环。本指南将详细介绍“仅一次控制器”的功能、使用场景及配…

HarmonyOS ArkUi Tabs+TabContent+List实现tab吸顶功能

Demo效果 Entry Component struct StickyNestedScroll {State message: string Hello WorldState arr: number[] []scroller new Scroller()StyleslistCard() {.backgroundColor(Color.White).height(72).width("100%").borderRadius(12)}build() {Scroll(this.sc…

原生js如何播放m3u8文件的视频,并且实现切换视频源

在网上找了很多方法都不行&#xff0c;最后还得是chatgpt。 首先呢在需要用到的文件中写入一下代码&#xff1a; <script src"https://act.mcake.com/fangli/2018/wap/commonjs/jquery.min.js"></script> <script src"http://res.wx.qq.com/op…

医药研发项目管理系统:适合CRO/CDMO企业使用的项目管理系统有哪些?

近日&#xff0c;北京民康百草医药科技有限公司&#xff08;以下简称“民康百草”&#xff09;与北京瑞杰智能科技有限公司&#xff08;以下简称“瑞杰科技”&#xff09;宣布达成战略合作&#xff0c;双方将共同打造一套符合民康百草企业特色的研发项目管理系统。该系统将基于…

swagger常用注解

最近查看接口文档的时候发现&#xff0c;POST方法中的query没法在swagger中显示&#xff0c;查了才发现这是因为Swagger或OpenAPI规范默认将HTTP POST请求的参数识别为请求体&#xff08;body&#xff09;参数&#xff0c;而不是查询字符串&#xff08;query&#xff09;参数。…

javaScript 计算以过去的时间

1.找到当前的时间的 new Data()//获取现在的时间毫秒数 2.找到过去的一个时间 new Data(time)//获取过去时间点的毫秒数 3.&#xff08;现在的时间(毫秒) - 过去的时间点&#xff08;毫秒&#xff09;&#xff09;/1000 已过去的时间&#xff08;秒&#xff09; var …

postGreSQL关系数据库介绍

什么是postGreSQL关系数据库&#xff1f; PostgreSQL 是一个强大的、开源的对象关系型数据库管理系统&#xff08;ORDBMS&#xff09;。它基于POSTQUEL查询语言的继承&#xff0c;提供了对SQL标准的广泛支持&#xff0c;并扩展了许多高级功能&#xff0c;如事务处理、多版本并…

使用 Webmin 中模块注意事项

一、 Docker中Webmin忘记密码解决方法 Webmin忘记Web登陆时候的密码&#xff0c;无法登陆&#xff0c;可以通过changepass.pl 文件修改密码来进行解决。但在 Docker 中这一方法很难&#xff0c;因为不知道changepass.pl 在那里&#xff1f; 我是通过如下方法来解决的&#xff…