前言

1. 技术背景 —— 这个技术在攻防体系中的位置

在现代网络安全的攻防体系中,模糊测试(Fuzzing) 是一种历史悠久但至今仍极其高效的漏洞挖掘技术。它位于软件开发生命周期(SDLC)的安全测试阶段和渗透测试的攻击面探测阶段,扮演着“自动化攻击者”的角色。传统模糊测试通过向目标程序注入大量随机或半随机数据(“Fuzz”)来触发意外崩溃,从而发现内存损坏、资源耗尽等漏洞。然而,随着协议和API的逻辑日益复杂,传统“盲目”的模糊测试在面对需要特定顺序、认证和逻辑依赖的API时,效率低下,难以触及深层漏洞。

AI驱动的模糊测试正是为了解决这一痛点而生。它将人工智能(特别是机器学习和大型语言模型LLM)与模糊测试相结合,从“盲目碰撞”进化为“智能探索”。 AI模型能够学习API的规范(如OpenAPI/Swagger)、分析请求之间的逻辑关系、并根据服务端的反馈动态调整测试策略,从而生成更可能触发深层业务逻辑漏洞和复杂状态错误的测试序列。 在攻防体系中,它代表了漏洞挖掘自动化和智能化的最前沿,是防御方进行深度、持续性安全验证和攻击方进行高效漏洞发现的利器。

2. 学习价值 —— 学会后能解决什么问题

掌握AI驱动的模糊测试技术,您将能够:

  • 自动化发现高价值漏洞:解决手动测试无法覆盖的广度和深度问题,自动挖掘出传统Fuzzer难以发现的认证绕过、越权访问、业务逻辑缺陷等高危API漏洞。
  • 提升测试效率与覆盖率:相比传统模糊测试,AI能智能地构造有状态的、符合逻辑的测试序列,显著提升代码覆盖率和漏洞发现效率,将安全工程师从繁琐的手工构造测试用例中解放出来。
  • 模拟高级攻击者行为:AI驱动的Fuzzer能模仿攻击者在理解API后进行的多步、有逻辑的攻击路径,从而在产品上线前发现更贴近真实世界威胁的漏洞。
  • 构建持续安全测试能力:可将其集成到CI/CD流水线中,对快速迭代的API进行持续、自动化的安全回归测试,实现真正的“安全左移”。

3. 使用场景 —— 实际应用在哪些地方

AI驱动的模糊测试广泛应用于以下场景:

  • 云服务与微服务API安全测试:对公有云、私有云及企业内部庞大的微服务API集群进行深度安全测试,是微软、谷歌等云厂商保障其服务安全的核心技术之一。
  • 物联网(IoT)与车联网(IoV)设备:测试智能设备、车载T-BOX等暴露的私有协议和API接口,发现可能导致设备被远程控制的严重漏洞。
  • 金融科技(FinTech)与电子商务:对涉及支付、交易、用户账户等核心功能的API进行严格的业务逻辑和安全性测试,防止资金损失和数据泄露。
  • 开源组件安全审计:Google的OSS-Fuzz项目利用AI增强的模糊测试,已为上千个关键开源项目(如OpenSSL)自动发现了数万个漏洞,极大地提升了全球软件供应链的安全性。

一、AI驱动的模糊测试是什么

精确定义

AI驱动的模糊测试是一种先进的自动化软件测试技术,它利用人工智能模型(如机器学习、LLM)分析目标应用的接口规范、代码结构或历史交互数据,以智能地生成、变异和调度测试用例,旨在高效地探索复杂的状态空间,发现传统模糊测试难以触及的深层次安全漏洞和逻辑缺陷。

一个通俗类比

如果说传统模糊测试像一个蒙着眼睛的猴子,在键盘上胡乱敲打,期望碰巧触发电脑死机。那么,AI驱动的模糊测试就像一个聪明的侦探

这位侦探首先会阅读目标的“说明书”(API文档),了解每个按键(API端点)的功能以及它们之间的关系(比如必须先“登录”才能“查询余额”)。然后,他会有策略地设计一系列操作步骤(测试序列),专门去试探那些说明书里没写清楚或者可能存在矛盾的地方。在测试过程中,他还会观察目标的反应(HTTP响应),如果发现某个操作序列让目标表现异常,他会重点围绕这个序列进行更深入、更细致的测试。

实际用途

AI驱动的模糊测试主要用于自动化地解决传统Fuzzer的“天花板”问题:

  1. 状态依赖问题:自动处理需要前置操作的API。例如,要测试“删除用户”接口,AI Fuzzer能自动推断出需要先“创建用户”并获取其ID,再将此ID用于删除操作。
  2. 认证与授权:自动学习并维护认证令牌(Token),在后续请求中携带有效的认证信息,从而测试需要登录后才能访问的接口。
  3. 参数值生成:根据API规范和上下文,生成有意义的参数值。例如,如果一个参数需要uuid格式,AI能生成符合格式的随机值,而不是完全无效的乱码。
  4. 反馈驱动的优化:通过分析服务器的响应码(如500 Internal Server Error)和响应内容,智能地判断哪些测试序列更有可能发现漏洞,并优先探索这些路径。

技术本质说明

AI驱动模糊测试的技术本质是将领域知识(通过AI模型学习)应用于测试用例生成过程,以优化模糊测试的搜索策略。其核心在于构建一个能够理解目标系统(特别是API)“语法”和“语义”的智能引擎。

  • 语法层面:AI通过解析OpenAPI/Swagger等规范文件,理解API的端点、方法、参数类型和数据结构。
  • 语义层面:AI通过分析规范中的依赖关系(如一个API的输出是另一个API的输入)和动态测试中的反馈,推断出API之间的逻辑顺序和状态转换关系。

这个过程可以用下面的Mermaid流程图来概括,它展示了AI如何从规范分析到智能执行的完整闭环。

智能探索与测试阶段 (Online)

准备阶段 (Offline)

1. 生成请求序列
2. 返回HTTP响应
3. 分析响应 (学习依赖/发现Bug)
4. 更新状态/参数值
5. 记录发现

OpenAPI/Swagger 规范文件

RESTler 编译器

生成Fuzzing语法树

自定义Payload字典

Fuzzing引擎

目标API服务

智能状态管理器

漏洞/错误报告

图解:上图展示了以微软RESTler为例的AI驱动模糊测试核心机制。首先,在准备阶段,RESTler编译器解析API规范,生成一个包含请求依赖关系的Fuzzing语法树。在智能探索与测试阶段,Fuzzing引擎根据这个语法树生成请求序列发送给目标API。引擎会分析响应,从中学习动态的生产者-消费者关系(例如,从创建用户的响应中提取userId),并由智能状态管理器维护。这些学习到的知识会指导后续测试用例的生成,形成一个反馈驱动的闭环,最终将发现的漏洞记录下来。


二、环境准备

我们将使用微软开源的 RESTler 工具进行实战。RESTler是第一个实现状态模糊测试 (Stateful REST API Fuzzing) 的工具,非常适合演示AI驱动的理念。

工具版本

  • RESTler: 最新版本 (推荐)
  • Python: 3.8 或更高版本
  • .NET SDK: 6.0 或更高版本
  • Docker: 最新版本 (推荐,用于隔离环境)

下载方式

最简单、最推荐的方式是使用官方提供的Docker镜像,它预装了所有依赖。

  1. 拉取Docker镜像

    # 拉取包含RESTler及其所有依赖的官方Docker镜像
    docker pull mcr.microsoft.com/restler/restler
    
  2. 源码编译(备选)
    如果希望在本地直接运行,可以从GitHub克隆源码并编译。

    
    # 警告:仅限高级用户,推荐使用Docker
    # 克隆RESTler仓库
    git clone https://github.com/microsoft/restler-fuzzer.git
    cd restler-fuzzer
    
    # 创建并进入Python虚拟环境
    python -m venv venv
    source venv/bin/activate  # Linux/macOS
    # venv\Scripts\activate  # Windows
    
    # 安装Python依赖
    pip install -r ./requirements.txt
    
    # 构建RESTler
    mkdir restler_bin
    python ./build-restler.py --dest_dir ./restler_bin
    

核心配置命令

RESTler的工作流程主要分为三步:编译 (Compile)测试 (Test)模糊测试 (Fuzz)

  1. 编译 (Compile)
    此步骤解析API规范,生成RESTler的fuzzing语法。

    # 语法: restler compile --api_spec <path_to_swagger.json>
    # 示例 (在Docker中运行)
    docker run -it -v /path/to/your/api_spec:/spec mcr.microsoft.com/restler/restler \
           compile --api_spec /spec/swagger.json
    
    • --api_spec: 指定OpenAPI/Swagger规范文件的路径。
  2. 测试 (Test)
    也称为“冒烟测试”,用于验证RESTler能否成功调用API,并检查规范的覆盖情况。这是Fuzzing前的必要调试步骤。

    # 语法: restler test --grammar_file <path_to_grammar.py> --dictionary_file <path_to_dict.json> --settings <path_to_engine_settings.json>
    # 示例 (在Docker中运行, 假设已在Compile步骤的输出目录中)
    docker run -it -v $(pwd)/Compile:/app/Compile mcr.microsoft.com/restler/restler \
           test --grammar_file /app/Compile/grammar.py --dictionary_file /app/Compile/dict.json --settings /app/Compile/engine_settings.json
    
  3. 模糊测试 (Fuzz)
    在Test模式成功后,开始真正的模糊测试,对API进行深度探索和攻击。

    # 语法与Test模式类似,只是将 'test' 替换为 'fuzz'
    docker run -it -v $(pwd)/Fuzz:/app/Fuzz mcr.microsoft.com/restler/restler \
           fuzz --grammar_file /app/Fuzz/grammar.py --dictionary_file /app/Fuzz/dict.json --settings /app/Fuzz/engine_settings.json
    

可运行环境命令或 Docker

为了方便实战,我们将使用RESTler官方提供的一个演示服务。

  1. 启动演示服务
    该服务是一个简单的博客API,包含创建、读取、更新、删除文章等操作。

    # 在一个终端中运行此命令,它会在8888端口启动一个API服务
    docker run -it -p 8888:8888 mcr.microsoft.com/restler/blog
    
  2. 获取API规范
    在浏览器或使用curl访问 http://localhost:8888/swagger/v1/swagger.json,将其内容保存为 swagger.json 文件。

现在,您的环境已经准备就绪,可以开始核心实战了。


三、核心实战

本节将引导您使用RESTler对刚才启动的博客API服务进行一次完整的AI驱动模糊测试。

编号步骤与目的说明

步骤 1:编译API规范

  • 目的:让RESTler学习API的“蓝图”,理解有哪些接口、需要什么参数,以及接口之间的潜在联系。

  • 操作
    在一个新的终端中,确保 swagger.json 文件在当前目录。然后执行以下命令:

    # 创建一个工作目录,并将swagger.json放进去
    mkdir restler_working_dir
    mv swagger.json restler_working_dir/
    
    # 使用Docker运行RESTler的compile命令
    # 我们将本地的restler_working_dir挂载到容器的/app目录
    docker run -it --rm -v $(pwd)/restler_working_dir:/app --network=host mcr.microsoft.com/restler/restler \
           compile --api_spec /app/swagger.json
    
    • --network=host: 允许Docker容器直接访问宿主机的网络,这样它才能访问到运行在 localhost:8888 的API服务。
  • 输出结果
    命令执行后,restler_working_dir 目录下会生成一个 Compile 文件夹。其中包含 grammar.py (Fuzzing语法)、dict.json (数据字典) 和 engine_settings.json (引擎配置) 等文件。这标志着RESTler已经完成了对API的初步“学习”。

步骤 2:执行冒烟测试 (Test Mode)

  • 目的:在正式Fuzzing前,进行一次快速的功能性演练。RESTler会尝试调用它能访问的所有API,以确保网络通畅、配置正确,并找出哪些API序列可以成功执行。这是AI“智能”的体现,它在为后续的攻击做准备。

  • 操作

    # 进入Compile目录,为下一步做准备
    cd restler_working_dir
    
    # 使用Docker运行RESTler的test命令
    # 注意:目标API地址是在engine_settings.json中配置的,默认为swagger中的地址
    docker run -it --rm -v $(pwd):/app --network=host mcr.microsoft.com/restler/restler \
           test --grammar_file /app/Compile/grammar.py --dictionary_file /app/Compile/dict.json --settings /app/Compile/engine_settings.json
    
  • 输出结果
    终端会实时显示RESTler发送的请求和收到的响应。你会看到它首先尝试 POST /api/blog/posts 来创建一个新帖子,然后从响应中自动提取新帖子的 id,并用这个 id 去调用 GET /api/blog/posts/{id}

    ...
    Sent request: POST http://localhost:8888/api/blog/posts with body: {"title":"...","body":"..."}
    Received response: 201 Created
    ...
    Learned value for 'id': 1
    ...
    Sent request: GET http://localhost:8888/api/blog/posts/1
    Received response: 200 OK
    ...
    

    测试结束后,会生成一个 Test 目录,里面包含了详细的日志和网络流量记录。

步骤 3:开始模糊测试 (Fuzz Mode)

  • 目的:在Test模式验证了基本路径后,开始真正的攻击。RESTler会系统性地对每个请求的参数、头部和body进行变异,并探索各种非预期的请求序列,寻找能引发服务器错误(如5xx错误)、安全漏洞(如认证绕过)或崩溃的输入。

  • 操作

    # 使用Docker运行RESTler的fuzz命令
    docker run -it --rm -v $(pwd):/app --network=host mcr.microsoft.com/restler/restler \
           fuzz --grammar_file /app/Compile/grammar.py --dictionary_file /app/Compile/dict.json --settings /app/Compile/engine_settings.json --time_budget 10
    
    • --time_budget 10: 为了演示,我们设置Fuzzing运行10分钟。在实际项目中,这个时间应该更长(数小时甚至数天)。
  • 输出结果
    你会看到大量的请求被发送出去,其中包含了各种畸形数据。RESTler会报告它发现的每一个“Bug”。例如,它可能会发现向一个需要整数ID的路径发送字符串会导致一个 500 Internal Server Error

    ...
    Sent request: GET http://localhost:8888/api/blog/posts/fuzzstring
    Received response: 500 Internal Server Error
    ...
    BUG DETECTED: 500_internal_server_error. Request: GET /api/blog/posts/{id}
    ...
    

    Fuzzing结束后,会生成一个 Fuzz 目录,其中 Bugs 子目录里包含了所有发现的漏洞详情,每个漏洞都有一个可复现的请求序列。

完整可运行自动化脚本

为了将上述流程自动化,我们可以编写一个简单的shell脚本。

#!/bin/bash

# --- AI驱动的API模糊测试自动化脚本 ---
# 警告:本脚本仅限于在授权测试环境中使用。
# 未经授权的测试是非法行为。

# --- 参数定义 ---
# 目标API的Swagger/OpenAPI规范URL
SWAGGER_URL="http://localhost:8888/swagger/v1/swagger.json"
# Fuzzing的工作目录
WORKDIR="restler_fuzz_session"
# Fuzzing的总时长(分钟)
FUZZ_TIME_BUDGET=30
# Docker镜像名称
DOCKER_IMAGE="mcr.microsoft.com/restler/restler"

# --- 错误处理函数 ---
handle_error() {
    echo "错误:$1" >&2
    exit 1
}

# --- 主逻辑 ---
main() {
    echo "--- 步骤0: 环境准备 ---"
    # 检查Docker是否运行
    if ! docker info > /dev/null 2>&1; then
        handle_error "Docker守护进程未运行。请启动Docker。"
    fi

    # 创建并进入工作目录
    mkdir -p "$WORKDIR" || handle_error "无法创建工作目录 $WORKDIR"
    cd "$WORKDIR"

    # 下载Swagger文件
    echo "正在从 $SWAGGER_URL 下载API规范..."
    curl -k -L "$SWAGGER_URL" -o swagger.json || handle_error "下载Swagger文件失败。"
    if [ ! -s swagger.json ]; then
        handle_error "下载的Swagger文件为空,请检查URL和网络连接。"
    fi
    echo "API规范下载成功。"

    echo -e "\n--- 步骤1: 编译API规范 ---"
    docker run -it --rm -v "$(pwd)":/app --network=host "$DOCKER_IMAGE" \
           compile --api_spec /app/swagger.json || handle_error "RESTler编译失败。"
    echo "编译成功,Fuzzing语法已生成在Compile目录。"

    echo -e "\n--- 步骤2: 执行冒烟测试 ---"
    docker run -it --rm -v "$(pwd)":/app --network=host "$DOCKER_IMAGE" \
           test --grammar_file /app/Compile/grammar.py \
                --dictionary_file /app/Compile/dict.json \
                --settings /app/Compile/engine_settings.json || handle_error "RESTler冒烟测试失败。"
    echo "冒烟测试成功,基本API调用链已验证。"

    echo -e "\n--- 步骤3: 开始模糊测试 ---"
    echo "Fuzzing将持续 $FUZZ_TIME_BUDGET 分钟..."
    docker run -it --rm -v "$(pwd)":/app --network=host "$DOCKER_IMAGE" \
           fuzz --grammar_file /app/Compile/grammar.py \
                --dictionary_file /app/Compile/dict.json \
                --settings /app/Compile/engine_settings.json \
                --time_budget "$FUZZ_TIME_BUDGET" || echo "Fuzzing完成,可能检测到Bug。"

    echo -e "\n--- 测试完成 ---"
    echo "Fuzzing会话已结束。请检查 '$WORKDIR/Fuzz/Bugs' 目录下的漏洞报告。"
    echo "详细日志位于 '$WORKDIR/Fuzz/logs' 目录。"
}

# --- 脚本入口 ---
main "$@"

使用方法

  1. 将以上代码保存为 run_fuzzing.sh
  2. 确保目标API服务正在运行。
  3. 赋予脚本执行权限:chmod +x run_fuzzing.sh
  4. 运行脚本:./run_fuzzing.sh

这个脚本会自动完成从下载规范到执行Fuzzing的全过程,并将结果整理到指定目录中。


四、进阶技巧

常见错误

  1. 401/403 未授权错误

    • 原因:API需要认证,但RESTler没有提供有效的认证令牌。
    • 解决:在Compile阶段,通过配置文件告诉RESTler如何获取和使用Token。创建一个config.json文件:
      {
        "authentication": {
          "token": {
            "name": "Authorization",
            "value": "Bearer <YOUR_STATIC_TOKEN>"
          }
        }
      }
      
      然后在compile命令中加入 --settings config.json。如果Token是动态获取的,需要使用更高级的token_provider配置。
  2. 生产者-消费者依赖推断失败

    • 原因:API规范不标准,或者依赖关系过于复杂,RESTler无法自动推断。
    • 解决:手动编辑Compile目录下生成的grammar.py文件,明确指定依赖关系。这是RESTler的强大之处,允许人工干预AI的决策。
  3. Fuzzing覆盖率低

    • 原因:默认的Payload字典过于通用,无法触发特定业务逻辑。
    • 解决:自定义Payload字典。在Compile阶段,通过--custom_dictionary参数指定一个包含业务特定值的JSON文件,例如,包含有效的用户名、产品ID等。

性能 / 成功率优化

  • 调整Fuzzing策略:编辑engine_settings.json文件,可以改变Fuzzing策略。例如,"fuzzing_mode": "bfs"(广度优先)适合全面覆盖,而"fuzzing_mode": "dfs"(深度优先)可能更快地找到深层逻辑漏洞。
  • 并行测试:对于大型API,可以将规范拆分成多个小文件,并行运行多个RESTler实例,每个实例负责一部分API。
  • 利用缓存:RESTler会自动缓存成功的生产者请求结果,避免重复执行。确保--no_state_fuzzing没有被错误地设置。

实战经验总结

  • 规范质量决定一切:一个高质量、详细的OpenAPI/Swagger规范是AI驱动Fuzzing成功率的基石。投入时间完善规范,远比事后调试Fuzzing工具更高效。
  • 先Test,再Fuzz:永远不要直接开始Fuzzing。Test模式是你的调试器,能帮你解决90%的配置和环境问题。
  • 把RESTler当成框架:不要把它看作一个黑盒按钮。它最强大的地方在于其可扩展性。学会阅读和修改grammar.pyengine_settings.json,你就能驾驭AI,而不是被AI驾驭。

对抗 / 绕过思路(中高级主题)

当防御方使用API网关或WAF来阻止Fuzzing时,我们可以采取以下策略:

  • 请求速率控制:在engine_settings.json中设置"max_async_requests"为一个较低的值,并增加"sleep_time",模拟正常用户的访问频率,绕过基于速率的防护。
  • User-Agent伪装:修改RESTler的默认User-Agent,伪装成常见的浏览器或移动应用,避免被基于User-Agent的规则拦截。
  • Payload编码:自定义grammar.py,在发送Payload前对其进行多层编码(如Base64、URL编码组合),尝试绕过WAF的解码和检测逻辑。
  • 利用逻辑绕过:AI驱动的Fuzzer本身就是一种高级绕过技术。通过构造合法的、有状态的API调用序列,在WAF看来这些都是正常业务操作,但最终的某个步骤可能因为状态的累积而触发漏洞。这是传统无状态扫描器难以企及的。

五、注意事项与防御

错误写法 vs 正确写法 (开发侧)

错误写法 (Insecure) 正确写法 (Secure) 说明
GET /api/users/{id}
直接使用客户端传入的ID查询数据库。
GET /api/users/me
从认证令牌中获取用户ID,而不是从URL。
最小化信任:永远不要信任客户端传入的ID来标识当前用户。
对错误返回详细的堆栈信息,如"Exception: java.sql.SQLIntegrityConstraintViolationException..." 对错误返回统一、通用的错误信息,如{"error": "Invalid input provided"},并在后台记录详细日志。 信息泄露:详细的错误信息会暴露后端技术栈、数据库结构等,为攻击者提供便利。
if (user.role == "admin") { ... }
在多个地方重复进行权限检查。
使用集中的中间件或装饰器进行权限检查。
@require_role('admin')
权限控制集中化:分散的权限检查极易遗漏,导致功能级越权漏洞。

风险提示

  • 生产环境禁止绝对禁止在未经授权的生产环境运行模糊测试。Fuzzing会产生大量垃圾数据,可能污染数据库、触发非预期的业务流程(如发送邮件、计费),甚至导致服务瘫痪。
  • 数据隔离:测试应在完全隔离的环境中进行,该环境拥有独立的数据库和下游服务依赖。测试结束后,应能一键重置环境。
  • 资源消耗:长时间的Fuzzing会消耗大量的CPU、内存和网络带宽,需要提前规划资源。

开发侧安全代码范式

  1. 输入验证:对所有外部输入(URL参数、Body、Header)进行严格的类型、格式和长度校验。
  2. 输出编码:在将数据显示到客户端前,确保对数据进行了恰当的上下文编码(如HTML编码、JSON编码),防止XSS等注入攻击。
  3. 参数化查询:使用预编译语句(Prepared Statements)或ORM来操作数据库,杜绝SQL注入。
  4. 遵循最小权限原则:每个API端点都应有明确的、最小化的权限要求,并由集中的认证授权服务强制执行。

运维侧加固方案

  1. API网关:部署API网关,实现统一的认证、授权、速率限制和请求日志记录。
  2. WAF/RASP:使用Web应用防火墙(WAF)或运行时应用自我保护(RASP)来检测和拦截已知的攻击模式。
  3. 访问控制:在网络层面,限制对非公开API和管理后台的访问,仅允许来自可信IP的流量。

日志检测线索

安全运营团队应监控以下日志模式,它们可能是Fuzzing活动的迹象:

  • 短时间内出现大量4xx/5xx错误:特别是来自同一IP地址的请求。
  • 请求参数异常:参数值出现大量特殊字符、超长字符串或SQL/Shell命令关键字。
  • 非典型API调用序列:出现不符合正常业务逻辑的API调用顺序。
  • User-Agent异常:请求的User-Agent为常见的安全工具名(如wfuzz, sqlmap)或为空。

总结

  1. 核心知识:AI驱动的模糊测试通过学习API规范和动态反馈,实现从“盲目”到“智能”的进化,能高效发现传统Fuzzer难以触及的状态相关和业务逻辑漏洞。
  2. 使用场景:它是现代云服务、微服务、IoT和金融等领域进行深度、自动化API安全测试的关键技术。
  3. 防御要点:防御的核心在于“安全左移”,在开发阶段遵循安全编码规范(输入验证、权限集中),并结合运维侧的API网关和WAF进行纵深防御。
  4. 知识体系连接:AI驱动的模糊测试是模糊测试API安全人工智能三个领域的交叉点。它上承静态分析(SAST)和动态分析(DAST),下启渗透测试和红蓝对抗。
  5. 进阶方向:未来的发展方向包括更强的LLM集成(直接从自然语言需求生成测试用例)、多协议联动Fuzzing(模拟跨越HTTP、RPC、消息队列的完整业务流)以及与漏洞修复的联动(AI自动生成补丁建议)。

自检清单

  • 是否说明技术价值?
  • 是否给出学习目标?
  • 是否有 Mermaid 核心机制图?
  • 是否有可运行代码?
  • 是否有防御示例?
  • 是否连接知识体系?
  • 是否避免模糊术语?
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐