CVE-2024-2961:将phpfilter任意文件读取提升为远程代码执行(RCE)

0x00 前言

前几天p牛师傅在星球发了一个帖子:PHP利用glibc iconv()中的一个缓冲区溢出漏洞CVE-2024-2961,实现将文件读取提升为任意命令执行漏洞,当时觉得这个漏洞蛮有意思,就想研究一下。于是web狗开启了一次二进制漏洞的学习之旅。

0x01 漏洞概述

在nvd网站上是这样描述的:

谷歌翻译过来就是:GNU C 库 (也就是glibc)2.39 及更早版本中的 iconv() 函数在将字符串转换为 ISO-2022-CN-EXT 字符集时,可能会使传递给它的输出缓冲区溢出最多 4 个字节,这可能会导致应用程序崩溃或覆盖相邻变量。

缓冲区溢出是二进制安全研究领域里很常见的漏洞。所谓缓冲区溢出是指当一段程序尝试把更多的数据放入一个缓冲区,数据超出了缓冲区本身的容量,导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。攻击者可以利用缓冲区溢出修改计算机的内存,破坏或控制程序的执行,导致数据损坏、程序崩溃,甚至是恶意代码的执行。缓冲区溢出攻击又分为栈溢出、堆溢出、格式字符串溢出、整数溢出、Unicode溢出。(参考:https://info.support.huawei.com/info-finder/encyclopedia/zh/缓冲区溢出.html)

0x02 CVE-2024-2961漏洞原理与复现

iconv()函数是Glibc提供的用于字符编码转换的API,可以将输入转换成另一种指定的编码输出。比如将原本为gbk编码的输入转化为utf-8的编码输出。作者发现当将“劄”、“䂚”、“峛”或“湿”等采用utf-8编码的汉语生僻字(博大精深的汉字)转化为ISO-2022-CN-EXT字符集输出时,会导致输出缓冲区有1-3字节的溢出。具体的代码分析见文末原作者的博客链接。

可以使用原作者提供的POC来(https://raw.githubusercontent.com/ambionics/cnext-exploits/main/poc.c)复现下这个漏洞:

gcc -o poc ./poc.c && ./poc

作者检查了glibc团队的提交历史记录,发现这个漏洞出现在 2000 年,已经有 24 年的历史了!!!

那么,这个缓冲区溢出漏洞又该怎样利用呢?

0x03 PHP堆与PHP filters

作者一番艰辛的寻找谁调用iconv(),始终未能找到合适的目标,最终回到PHP上,却发现这个缓冲区溢出漏洞居然在PHP应用程序中大放异彩~

相信每个搞安全的师傅对php伪协议php://filter一定不陌生,php://filter也叫php过滤器,我们经常使用convert.base64-encode这个过滤器来进行文件读取

php://filter/convert.base64-encode/resource=...

原作者发现在php过滤器中有一个叫convert.iconv.X.Y 的过滤器也是将字符集从 X 转换为 Y,后来证实在linux上其底层就是使用了glibc的iconv()!!!接下来的0x03和0x04是本文最重点也是最难懂的部分,因为涉及到了php底层实现上的东西(当然也省略掉了一些细节)。对利用原理不是那么想了解的师傅可以直接跳到0x05进行RCE复现。下面的内容其实也主要是对原作者博客的翻译以及自己的理解:

1.PHP堆

我们知道,程序要运行就得在内存申请一块空间来存放数据、函数调用栈等。在php中是使用emalloc(N)函数来分配内存的,N是希望分配的字节数,返回的结果是一个指向能够存储至少N字节的内存块(即chunk)的指针。当完成对这块内存的使用后,通过调用efree(ptr)来释放它。PHP中的内存块有多种大小:8(2^3) 0x10(2^4), 0x18(2^5), … 0x200(2^9)…

PHP堆由一个2MB(221)大小的区域组成,被分割成512(29)个页面,每个页面大小为0x1000(2^12)字节。每个页面上可能包含特定大小的chunks。各chunk之间没有元数据信息存在。

PHP为每种大小的块(chunk)都维护了一个空闲列表,其数据结构是一个单链表,且遵循后进先出(LIFO)的原则。空闲列表是这样建立的:每个空闲块的前8个字节内包含指向下一个同样大小空闲块的指针,指针也可理解为下一个同样大小空闲块的地址。

当释放某个大小的块时,该块的前8个字节存放此前空闲列表头部元素的地址,该块变为空闲列表的头部元素;当需要分配N字节的空间时,PHP会查找对应大小的空闲列表,取出头部元素并返回(能够存储至少N字节的内存块的地址)。如果空闲列表是空的(即所有可用的块都已被分配), PHP会查看堆元数据以找到未使用的页面。然后在该页面上创建空白块并将其放入空闲列表中。PHP堆的可视化表示如下图所示:

一个PHP堆包含512个页面,这里第5页存储大小为0x400(2^10)的块。它包含4个块(因为4 × 0x400 = 0x1000,即一页的大小),块#1和#3已被分配,而块#2和#4已被释放。因此,它们处于大小为0x400的块的空闲列表中。块#2中有一个指向0x7ff10201400 的指针,那是大小为0x400 的下一个空闲块(即块#4)的地址。结合CVE-2024-2961假如我们能从 块 #1 溢出到 块 #2, 则会覆盖掉这个指针。即使只有一个字节溢出, 也能改变空闲列表指针, 从而更改空闲列表。

但PHP对每个HTTP请求会创建新堆,我们要怎样才能知道该在内存的什么地方进行溢出呢?这是进行利用的一个难点。原作者将在系列文章的第二部分进行介绍。

2.filters链的处理与bucket队列技术

PHP在处理过滤器时,首先会获取流(读取资源)。流是存储在一系列bucket中的,这些bucket是双向链接的结构,每个bucket包含一定大小的缓冲区。以读取/etc/passwd为例,可能会有3个bucket:第一个可能包含文件的前5个字节,第二个bucket再增加30个字节,第三个bucket则再增加1000个字节。它们连接在一起构成了一个bucket传送带系统。

获取流之后就是应用过滤器对流进行处理了。处理过程是这样的:取第一个过滤器并对第一个bucket进行处理。为此,会分配一个与bucke缓冲区大小相同的输出缓冲区(例子中是5个字节)并进行转换。例如,如果过滤器是string.upper,它会将输入缓冲区中的每个小写字符转换为其在输出缓冲区中的大写等价物并创建一个新的指向这个输出缓冲区的bucket,接着继续处理第二个bucket,第三个bucket,直到最后一个bucket,每个输出bucket又形成了一个新的传送带序列:

最后在这个序列上继续应用第二个过滤器,第三个过滤器,直到处理完最后一个过滤器。

0x04 代码执行实现原理
1.文件读取变为RCE思路

假如有一个网站可以利用php://filter/convert.base64-encode/resource=...来进行任意文件读取,现在知道了可以利用convert.iconv.XXX.ISO-2022-CN-EXT进行缓冲区溢出,那么要怎样才能远程代码执行呢?

利用缓冲区溢出攻击需要先绕过安全机制ASLR(地址空间布局随机化)和PIE(位置无关可执行文件),然而有了任意文件读取这个前提可以通过读取/proc/self/maps来得到内存代码段基址进行绕过。当然,也可以利用任意文件读取来获取libc库版本来检查其是否已打补丁。获得代码执行的思路就是利用单字节缓冲区溢出来修改指向空闲块指针的最低有效位(LSB),以便获得对某些空闲列表的控制权,从而写入命令到内存执行,实现RCE。

这里涉及到pwn的概念了,参考链接:

ASLR和PIE:

https://blog.csdn.net/weixin_62675330/article/details/122907754

http://wiki.allinsec.cn/?p=306

/proc/self/maps:

https://www.jianshu.com/p/3fba2e5b1e17

https://blog.csdn.net/qq_52630607/article/details/128347260

2.单个bucket

前面说到了php处理过滤器时的bucket队列技术,然而实际上无论是读取文件还是请求HTTP URL,亦或是使用ftp://协议,PHP都只生成包含整个响应内容的一个bucket。无法利用单一的bucket来填充堆或操作修改后的空闲列表。

这是为什么呢?因为借助单个bucket,我们可以溢出到一个空闲块并修改空闲列表,但随后我们就用完了所有的bucket,而要利用已修改的空闲列表进行操作至少还需要再分配两个bucket!(为什么至少再需要两个,看到下面空闲列表控制就能明白了)

作者发现可以用一个叫zlib.inflate的过滤器来解决这个问题。该过滤器接收流并对其进行解压缩处理。为此,它会分配一个大小为8页(0x8000字节)的缓冲区并将流填充至其中。如果这个缓冲区不足以容纳全部数据, 它将再新创建一个相同大小的缓冲区来存储剩余部分;若前两个缓冲区仍不够用, 则继续增加更多的缓冲区。然后将每个缓冲区都添加到bucket中。可以使用此过滤器创建任意数量的bucket:

然而,这些bucket的缓冲区大小为0x8000,这个大小并不利于利用;这种大小的缓冲区分配方式与上面描述的不同,并且在释放后不会进入空闲列表。因此需要调整存储bucket的大小。

3.分块

可以利用过滤器dechunk,该过滤器用于解码经过HTTP-chunked编码的字符串。

HTTP-chunked编码通过数据块(非堆内存块)发送数据。它先发送一个以十六进制表示的大小,紧接着是一个换行符,然后是相应大小的数据块,再接一个换行符。接着发送另一个大小、另一个数据块、再一个大小、又一个数据块,并通过发送大小为0(零)来指示数据的结束,如图示:

解块后结果是:This is how the chunked encoding works

那么为了得到任意大小的bucket,我们应在每个bucket的前面先填充成千上万个零,然后提供一个大小和数据块,如下所示:

4.空闲列表控制

目标是通过将某些指针的最低有效位(LSB)覆盖为值0x48(ASCII中的H)来修改某个空闲列表。为了能无条件地达到相同效果,针对大小为0x100的块,因为这些块地址的最低有效位总是零。这意味着我们的溢出效果始终相同:给一个块指针增加0x48。

通过下面六个步骤来修改指针达到控制空闲列表的目的:

为了便于描述将大小为0x100的块的空闲列表命名为FL[0x100],假设已经通过分配大量0x100大小的块成功填充了堆。因此,在内存中的某个位置,必有三个连续的空闲块A、B和C,其中A是FL[100]的头。A指向B,B指向C(步骤1)。我们可以分配这三个块(步骤2),然后再次释放它们(步骤3)。此时,空闲列表被反转:我们得到的是C→B→A。接着我们再次进行分配,但这次我们在C的偏移量0x48处放置了一个任意指针0x1122334455(步骤4)。再次释放它们(步骤5)后,状态与步骤1完全相同,但有一个小差异:在C+0x48处存在一个任意指针。现在我们可以从块A执行溢出操作,这将改变B中包含的指针的位置。它现在指向了C+0x48的位置,结果使得空闲列表变为 B→ C+0x48 → 0x1122334455。再进行 3 次分配,就可以让 PHP 分配在我们的任意地址。于是拥有了一个“写入任意位置”的功能。

回到漏洞利用的实现上来,在此处描述的各个步骤中,分配块然后释放块。但我们无法真正摆脱bucket:我们只能改变它们的大小。然而,我们只关心大小为0x100的块—好像其他块不存在一样!因此将每个bucket构建为如下HTTP 分块:

对于漏洞利用的每个步骤,都会调用 dechunk 过滤器:因此每个 bucket 的大小都会发生变化。有些 bucket 的大小变为 0x100,因此在漏洞利用中“出现”,而有些 bucket 则变小,因此消失。这为我们提供了一种完美的方法,可以让 bucket 在特定时刻实现,并在不再需要它们时将其丢弃。

5.代码执行

虽然可以通过读取 /proc/self/maps 来查看内存区域,但我们并不清楚自己在堆中的确切位置。可以通过定位PHP的堆来完全忽略这个问题。由于它的对齐方式(~0x1fffff)和大小(2MB),它很容易识别。它的顶部有一个 zend_mm_heap 结构,其中包含非常有用的字段:

struct _zend_mm_heap {`    `...`    `int                use_custom_heap;`    `...`    `zend_mm_free_slot *free_slot[ZEND_MM_BINS]; /* free lists for small sizes */`    `...`    `union {`        `struct {`            `void      *(*_malloc)(size_t);`            `void       (*_free)(void*);`            `void      *(*_realloc)(void*, size_t);`        `} std;`    `} custom_heap;``};

首先,它包含每个空闲列表。通过覆盖空闲列表,可以获得任意数量、任意大小的写入内容来覆盖最后一个字段 custom_heap,其中包含 emalloc()、efree() 和 erealloc() 的替代函数(类似于 glibc 中的 _malloc_hook 及其同类函数)。然后将 use_custom_heap 设置为 1,并在 bucket 上调用 free(),从而获得带有受控参数的任意函数调用。由于可以使用文件读取来访问二进制文件,因此可以构建花哨的 ROP 链,但为了尽可能通用,故将 custom_heap.free 设置为system(),允许我们以 CTF 方式运行任意 bash 命令。

6.漏洞利用脚本

利用脚本执行了三个请求:首先下载/proc/self/maps文件,并从中提取PHP堆的地址和libc库的文件名。接着下载libc二进制文件来提取system()函数的地址。最后执行一次最终请求来触发溢出并执行预设的任意命令。漏洞利用脚本地址:

https://raw.githubusercontent.com/ambionics/cnext-exploits/main/cnext-exploit.py

0x05 文件读取提升为RCE复现

首先在我的ubuntu虚拟机上安装docker:

1、配置国内源``sudo vim /etc/apt/sources.list``   ``deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse``deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse``   ``deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse``deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse``   ``deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse``deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse``   ``# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse``# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse``   ``deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse``deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse``   ``2.Add Docker's official GPG key``udo apt-get update``sudo apt-get install ca-certificates curl``sudo install -m 0755 -d /etc/apt/keyrings``sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc``sudo chmod a+r /etc/apt/keyrings/docker.asc``   ``3.Add the repository to Apt sources``echo \`  `"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \`  `$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \`  `sudo tee /etc/apt/sources.list.d/docker.list > /dev/null``sudo apt-get update``   ``4.安装新版docker``sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin``   ``5.查看docker状态,设置开机自启动``sudo systemctl status docker``sudo systemctl enable docker

然后,下载vulhub运行环境,p牛师傅已经做好了环境:

git clone https://github.com/vulhub/vulhub.git``cd vulhub/php/CVE-2024-2961/``sudo docker compose up -d

访问http://ip:8080,通过post传参file就可以任意文件读取:

下载原作者的exp并安装相关依赖(需要Linux和Python 3.10解释器)

wget https://raw.githubusercontent.com/ambionics/cnext-exploits/main/cnext-exploit.py``pip3 install pwntools``pip3 install https://github.com/cfreal/ten/archive/refs/heads/main.zip

运行exp反弹shell:

0x06 总结

1.据原作者描述该漏洞影响PHP 7.0.0 (2015) 到 8.3.7 (2024)近十年php版本的任何php应用程序(Wordpress、Laravel 等)。PHP的所有标准文件读取操作都受到了影响:file_get_contents()、file()、readfile()、fgets()、getimagesize()、SplFileObject->read()等。文件写入操作同样受到影响(如file_put_contents()及其同类函数)。

2.关于该漏洞的其他利用场景:原作者提出了PHP-MySQL注入到RCE,XXE到RCE,phar的替代品,new $_GET['cls']($_GET['argument']);,文件读取反序列化(unserialize())也可以利用CVE-2024-2961这个漏洞将其升级为远程代码执行。总之,只要能控制文件读取或写入端点的前缀,就可能实现远程代码执行(RCE),具体可以看原作者博客。国内师傅还提出了可以用来绕过disable_functions。

3.一个存在24年的缓冲区漏洞,稳定影响了近十年的PHP版本,任何PHP程序,可以说是通杀了。

4.原作者的研究成果会分为三部分来讲述,目前只发表了第一部分内容。第二部分将更深入地研究PHP引擎,在非常流行的PHP Webmail中找到iconv()调用;第三部分将讨论盲文件读取的利用方法。让人期待,不得不佩服国外安全研究员的钻研精神,为一个二进制中常见的缓冲区溢出漏洞如此去寻找利用场景。

5.这是一个二进制漏洞的web利用,涉及到较深的二进制和pwn了,这块完全是我的盲区了,所以其实对于将文件读取提升为RCE这个过程的原理和整套流程我还只是一知半解,相信随着自己日复一日对各种漏洞原理的学习与钻研,终有一天会豁然开朗。

关于黑客&网络安全学习指南

学好 网络安全不论是就业还是做副业赚钱都不错,但要学会 网络安全 还是要有一个学习规划。最后给大家分享一份全套的 网络安全学习资料,给那些想学习网络安全的小伙伴们一点帮助!

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础等教程,带你从零基础系统性的学好网络安全。

1.学习路线图
在这里插入图片描述

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.网络安全视频教程600集和配套电子书
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
在这里插入图片描述

4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
在这里插入图片描述

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取:CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取:CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

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

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

相关文章

python 字符串(str)、列表(list)、元组(tuple)、字典(dict)

学习目标: 1:能够知道如何定义一个字符串; [重点] 使用双引号引起来: 变量名 "xxxx" 2:能够知道切片的语法格式; [重点] [起始: 结束] 3:掌握如何定义一个列表; [重点] 使用[ ]引起来: 变量名 [xx,xx,...] 4:能够说出4个列表相关的方法; [了解] ap…

图神经网络(GNN)在生产过程优化中的应用介绍

目录 一、说明 二、图神经网络和应用 2.1 什么是图神经网络? 2.2 将生产系统建模为图形 2.3 过程模拟和假设分析 2.4 优化生产计划 三、生产系统中的图形数据表示 3.1 生产图中的节点表示 3.2 生产图中的边缘表示 3.3 图形表示的好处 3.4 将 GNN 与图形表示集成 3.5…

博睿数据应邀出席双态IT用户大会,分享《构建云原生时代的一体化智能可观测性》

5月31日-6月2日,第十二届双态IT用户大会于成都成功举行,此次大会由DCMG和双态IT论坛联合主办,聚焦“信创时代的组织级云原生能力建设”和“组织级云原生运维能力建设”两大会议主题,旨在推动双态IT落地与创新,为企业数…

(学习笔记)数据基建-数据质量

数据基建-数据质量 数据质量数据质量保障措施如何推动上下游开展数据质量活动数据质量保障如何量化产出数据质量思考全链路数据质量保障项目 数据质量 概念:数据质量,意如其名,就是数据的准确性,他是数据仓库的基石,控…

容器(Docker)安装

centos安装Docker sudo yum remove docker* sudo yum install -y yum-utils#配置docker的yum地址 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装指定版本 - 可以根据实际安装版本 sudo yum install -y docke…

easyexcel动态表头导出

动态表头导出excel 红框固定&#xff0c;绿框动态 引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>工具类 import com.alibaba.excel.util…

【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重载

目录 一、 日期类的实现 Date.h 1.1 GetMonthDay函数&#xff08;获取某年某月的天数&#xff09; 问&#xff1a;这个函数为什么不和其他的函数一样放在Date.cpp文件中实现呢&#xff1f; 1.2 CheckDate函数&#xff08;检查日期有效性&#xff09;、Print函数&#xff08;…

【WP】猿人学13_入门级cookie

https://match.yuanrenxue.cn/match/13 抓包分析 抓包分析发现加密参数是cookie中有一个yuanrenxue_cookie 当cookie过期的时候&#xff0c;就会重新给match/13发包&#xff0c;这个包返回一段js代码&#xff0c;应该是生成cookie的 <script>document.cookie(y)(u)(a…

【初阶数据结构】栈和队列(附题目)

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 1.2.2实现结构的选择 a.数组 b.链表 c.更优的选择 1.2.3实现结构 a.栈的结构体 b.栈的初始化 c.栈的销毁 d.入栈 e.出栈 f.获取栈顶元素 g.获取栈中有效元素个数 h.检测队列是否为空&#xff0c;如果为空返回非零结…

m1系列芯片aarch64架构使用docker-compose安装seata

之前看到 DockerHub 上发布了 m1 芯片 aarch64 架构的 seata 镜像, 所以就尝试的安装了下, 亲测可用: 使用该命令查看正在运行的 seata 容器 docker ps | grep seata 一. docker-compose.yml 命令编写 volumes 命令所指定的宿主机映射地址, 需要根据自己的电脑环境更换 环…

MySQL条件查询

018条件查询之或者or or表示或者&#xff0c;还有另一种写法&#xff1a;|| 案例&#xff1a;找出工作岗位是MANAGER和SALESMAN的员工姓名、工作岗位 注意字符串一定要带单引号 select ename, job from emp where jobmanager or jobsalesman;任务&#xff1a;查询20和30部门的…

西湖大学最新AI工具:识别虚假新闻和辨别AI生成内容,准确率达99%

你好&#xff0c;我是郭震 随着人工智能技术的发展&#xff0c;生成式AI在文本生成领域展示了惊人的潜力。然而&#xff0c;随之而来的虚假新闻和AI生成的文章让人们难以分辨。 近日&#xff0c;西湖大学团队发布了一款名为Fast-DetectGPT的新工具&#xff0c;为识别虚假新闻和…

Linuxftp服务001匿名登入

在Linux系统中搭建FTP&#xff08;File Transfer Protocol&#xff09;服务&#xff0c;可以让用户通过网络在服务器与其他客户端之间传输文件。它有几种登入模式&#xff0c;今天我们讲一下匿名登入。 操作系统 CentOS Stream9 操作步骤 首先我们先下载ftp [rootlocalhost…

数字智能数字人直播带货软件系统 实现真人形象的1:1克隆 前后端分离 带完整的安装代码包以及搭建教程

系统概述 数字智能数字人直播带货小程序源码系统是一套集人工智能、3D建模、云计算等技术于一体的综合性解决方案。该系统通过深度学习算法&#xff0c;能够实现对真人形象的精准捕捉和1:1克隆&#xff0c;使数字人在直播过程中呈现出与真人无异的表现力。同时&#xff0c;系统…

OpenCv之简单的人脸识别项目(动态处理页面)

人脸识别 准备九、动态处理页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义视频处理脚本4.定义相机抓取脚本5.定义关闭窗口的函数6.按钮设计6.1视频处理按钮6.2相机抓取按钮6.3返回按钮 7.定义关键函数8.动态处理…

el-input添加clearable属性 输入内容时会直接撑开

<el-inputclearablev-if"item.type number || item.type text":type"item.type":placeholder"item.placeholder":prefix-icon"item.icon || "v-model.trim"searchform[item.prop]"></el-input>解决方案 添加c…

安全专业的硬件远控方案 设备无网也能远程运维

在很多行业中&#xff0c;企业的运维工作不仅仅局限在可以联网的IT设备&#xff0c;不能连接外网的特种设备也需要专业的远程运维手段。 这种特种设备在能源、医疗等行业尤其常见&#xff0c;那么我们究竟如何通过远程控制&#xff0c;对这些无网设备实施远程运维&#xff0c;…

【简报】VITA 74 (VNX)C

VNX 模块标准 12.5 mm Module • 母板 MiniPCIe • 200 针连接器 • 75mm &#xff08;长&#xff09; X 89mm &#xff08;宽&#xff09; X 12.5mm &#xff08;高&#xff09; •应用 1 个 SBC 2 I/O 载波 3 个 GPS / IMU / SAASM 4 存储和内存 19 mm Module • 母板 …

鸿蒙轻内核M核源码分析系列九 互斥锁Mutex

多任务环境下会存在多个任务访问同一公共资源的场景&#xff0c;而有些公共资源是非共享的临界资源&#xff0c;只能被独占使用。鸿蒙轻内核使用互斥锁来避免这种冲突&#xff0c;互斥锁是一种特殊的二值性信号量&#xff0c;用于实现对临界资源的独占式处理。另外&#xff0c;…

60V降压12V0.3A稳压芯片 48V降压5V0.3A电源IC-惠海H6246

惠海H6246降压开关控制器芯片是一款降压恒压的电源管理芯片&#xff0c;适用于高压输入、低压输出的应用。以下是对该产品的详细分析&#xff1a; 首先&#xff0c;H6246降压恒压芯片它内置60V耐压MOS&#xff0c;能够在48V的输入电压下稳定工作&#xff0c;并且具有宽压8V-48V…