新闻详情

新闻详情

首页 / 资讯中心 / 详情

Nuclei 项目架构与开发指南:从构建测试、模板系统到扫描执行引擎的源码解析

发布时间:2026/9/30 2:29:21来源:尧图网络
Nuclei 项目架构与开发指南:从构建测试、模板系统到扫描执行引擎的源码解析
网络安全应用安全漏洞扫描【免费下载链接】nucleiNuclei is a fast, customizable vulnerability scanner powered by the global security community and built on a simple YAML-based DSL, enabling collaboration to tackle trending vulnerabilities on the internet. It helps you find vulnerabilities in your applications, APIs, networks, DNS, and cloud configurations.项目地址https://gitcode.com/GitHub_Trending/nu/nuclei点击查看免费下载本文是一份面向开发者的 Nuclei 工程实战指南。它以仓库根目录的 CLAUDE.md 为骨架结合 Makefile 与cmd/、internal/、pkg/等核心目录的源码实现系统讲解 Nuclei 的开发命令、架构分层、协议设计、模板系统、关键执行流程与目录导览。读完本文你将掌握 Nuclei 的构建与测试工作流、理解扫描引擎的并发与聚类机制并知道如何围绕模板开发与 JavaScript 集成进行二次开发。一、项目概览基于 YAML 模板的 Go 高性能漏洞扫描器根据 CLAUDE.md 的项目概述Nuclei 是一个用 Go 编写的现代高性能漏洞扫描器其核心设计理念是通过 YAML 模板定义漏洞检测逻辑实现可定制化、可协作的漏洞检测。关键特征包括多协议支持HTTP、DNS、TCPNetwork、SSL、WebSocket、WHOIS、JavaScript、Code 等协议均有独立实现。零误报设计目标通过模拟真实世界的漏洞触发条件而非仅做指纹匹配来降低误报率。社区驱动模板由全球安全社区维护可快速响应互联网上的流行漏洞trending vulnerabilities。从 go.mod 可见该模块路径为github.com/projectdiscovery/nuclei/v3当前 Go 版本要求为go 1.27.1因此本地开发环境需要满足相应的 Go 工具链版本。二、开发命令构建、测试、校验与工具链2.1 构建与测试Nuclei 的所有开发命令都通过仓库根目录的 Makefile 统一封装主要目标如下命令作用Makefile 实现要点make build构建主二进制到./bin/nuclei设置GOBUILD_OUTPUT ./bin/nuclei、GOBUILD_PACKAGES cmd/nuclei/main.go并启用-pgoauto非 macOS 平台追加-extldflags -static静态链接参数Makefile 第 40-43 行make test运行单元测试默认开启竞态检测GOFLAGS $(RACE) -v -timeout 1h -count 1其中RACE ? -raceMakefile 第 86-92 行make integration运行原生集成测试套件执行go test -tagsintegration -timeout 40m ./internal/tests/integrationMakefile 第 96-97 行make functionalCI 专用的功能对比测试入口需要先构建./bin/nuclei并要求 PATH 中存在 release 版nuclei二进制通过RELEASE_BINARY与DEV_BINARY对比运行./internal/tests/functionalMakefile 第 108-115 行make vet运行 go vet 静态分析先执行make download与make verify校验模块再执行go vet ./...Makefile 第 126-127 行make tidy清理 go module 依赖执行go mod tidyMakefile 第 117-118 行此外还有可选的回归测试入口make regression该目标通过go test -tagsregression -timeout 30m ./lib/tests -run TestScaleRegression -v启动 HTTP 引擎的规模回归scale regression测试默认拉起多个 loopback 主机并在多样化的模板集上断言检出结果的一致性主机数量可通过环境变量覆盖例如NUCLEI_SCALE_HOSTS500 make regressionMakefile 第 104-106 行。2.2 校验与代码规范模板校验make template-validate使用刚构建的二进制执行模板校验流程Makefile 第 290-301 行./bin/nuclei -ut更新本地模板./bin/nuclei -validate -et http/technologies -t dns -t ssl -t network -t http/exposures -ept code排除http/technologies技术指纹类模板、排除code协议模板后校验 DNS、SSL、Network、HTTP exposures 模板./bin/nuclei -validate -w workflows -et http/technologies -ept code单独校验 workflows 模板。Go 代码规范go fmt ./...统一格式go vet ./...做静态分析。2.3 开发工具链make devtools-all一次性构建全部 JS 开发工具 ——devtools-bindgen、devtools-tsgen、devtools-scrapefuncs对应二进制输出到./bin/bindgen、./bin/tsgen、./bin/scrapefuncsMakefile 第 129-141 行。make jsupdate-all更新 JavaScript 绑定与 TypeScript 定义 ——jsupdate-bindgen以pkg/js/libs为输入、输出到pkg/js/generatedjsupdate-tsgen输出到pkg/js/generated/tsMakefile 第 143-155 行。make docs/make syntax-docs通过dstdocgenyamldoc-go 工具从模板结构生成docs.md与SYNTAX-REFERENCE.mdMakefile 第 66-84 行。make memogen为 JavaScript 库生成 memoization 代码输入pkg/js/libs、模板文件cmd/memogen/function.tpl输出二进制./bin/memogenMakefile 第 279-283 行工具源码见 cmd/memogen/memogen.go。make dsl-docs借助 scrapefuncs 导出内置 DSL 函数文档dsl.mdMakefile 第 285-288 行。2.4 运行单个测试文档推荐以下方式精准定位问题# 运行某个包中的单个测试 go test -v ./pkg/path/to/package -run TestName # 集成测试统一入口 go test -tagsintegration ./internal/tests/integration集成测试位于internal/tests/integration/涵盖 HTTP、DNS、DSL、JavaScript、WebSocket、Network、SSL、Fuzz、Interactsh、Workflow 等数十个协议与场景如 http_test.go、dns_test.go、javascript_test.go。三、总体架构CLI、Runner、引擎与模板分层CLAUDE.md 给出了明确的模块划分结合源码可以还原出完整的调用链组件职责源码位置cmd/nuclei主 CLI 入口负责 flag 解析与配置初始化cmd/nuclei/main.gointernal/runner核心 Runner编排整个扫描流程internal/runner/runner.gopkg/core执行引擎包含 work pool 并发与模板聚类pkg/core/engine.gopkg/templates模板的解析、编译与管理pkg/templates/templates.gopkg/protocols各协议实现HTTP、DNS、Network 等pkg/protocols/protocols.gopkg/operators匹配与提取逻辑matchers / extractorspkg/operators/operators.gopkg/catalog模板发现与加载本地磁盘 / 远程源pkg/catalog/catalog.go在 CLI 入口 cmd/nuclei/main.go 中可以看到若干值得注意的初始化动作通过runner.ConfigureOptions()完成全部 flag 的解析与校验设置config.CurrentAppMode config.AppModeCLI以启用 CLI 特有的交互式行为当用户传入-list-dsl-sigs时直接调用dsl.GetPrintableDslFunctionSignatures()打印全部内置 DSL 函数签名并退出main.go 第 71-75 行当用户传入模板签名相关选项时调用templates.UseOptionsForSigner(options)使用解析后的参数初始化模板签名器main.go 第 77-80 行。3.1 协议架构统一的 Executer 接口每个协议HTTP、DNS、Network 等都遵循统一的设计模式。核心接口定义在 pkg/protocols/protocols.gotype Executer interface { Compile() error // 编译执行生成器预备所有可能的请求 Requests() int // 返回该规则将发起的请求总数 Execute(ctx *scan.ScanContext) (bool, error) // 执行协议组并返回是否发现结果 ExecuteWithResults(ctx *scan.ScanContext) ([]*output.ResultEvent, error) // 执行并返回结果而非写入 }每个协议执行器还内嵌 Operators统一获得匹配matchers与提取extractors能力从而把协议请求的构造与发送和结果的判定与提取解耦。例如 HTTP 协议在 pkg/protocols/http/http.go 中实现Compile()时会根据模板分析结果设置相关的执行配置http.go 第 165、443 行。3.2 执行引擎工作池与聚类pkg/core/engine.go 是执行引擎的核心其文档注释明确说明了设计意图引擎内含多个线程池work pool允许每个协议使用不同的并发值并承担了从模板聚类到最终由工作池执行的大部分重活。并发配置通过GetWorkPoolConfig()从用户选项映射而来engine.go 第 61-69 行BulkSize→ 输入目标并发CurrentTemplateThreads()→ 模板并发HeadlessBulkSize→ headless 浏览器输入并发HeadlessTemplateThreads→ headless 模板并发。引擎还暴露了模板执行生命周期回调TemplateExecutionCallback在模板对目标开始执行TemplateExecutionStarted与执行结束TemplateExecutionFinished两个时点触发事件回调可能被并发调用实现必须保证并发安全engine.go 第 11-32 行。四、模板系统YAML 驱动的检测逻辑模板是 Nuclei 的灵魂。根据 CLAUDE.md 的总结并结合 pkg/templates/templates.go 的实现模板是 YAML 文件Template结构体包含id全局唯一 ID如CVE-2021-19520、info元数据信息块、requests协议请求、flow多请求间的执行流程等字段模板会被**编译为可执行请求 operatorsmatchers/extractors**的组合支持workflows多模板按流程顺序执行的复合模板相关实现位于 pkg/workflows/workflows.go支持模板聚类把多个模板中完全相同的请求合并为一次请求大幅减少网络请求量。4.1 模板聚类的实现细节聚类逻辑位于 pkg/templates/cluster.goCluster(list []*Template)会遍历模板列表对 DNS、HTTP、SSL 等协议的请求调用IsClusterable()判断是否可聚类并以TmplClusterKey()计算聚类哈希把哈希相同的请求归为一组cluster.go 第 48-86 行ClusterID()将聚类结果转换为可跨执行复现的数学哈希ClusterTemplates()是上层入口当OfflineHTTP离线 HTTP 模式或DisableClustering用户显式关闭聚类时跳过聚类否则调用Cluster()并为每个聚类组生成cluster-id形式的模板 IDcluster.go 第 125-142 行。4.2 模板签名与验证模板还支持签名与验证机制相关代码位于 pkg/templates/signer/其中handler.go提供签名处理逻辑、default.go提供默认签名器。协议层在编译时携带TemplateVerification缓存含验证者、指纹、内容摘要等字段见 pkg/protocols/protocols.goCode 与 JavaScript 协议会在执行时校验模板签名是否来自可信验证者。五、关键执行流程CLAUDE.md 概括了扫描执行的五个阶段与源码一一对应模板加载与编译经 pkg/catalog/loader/loader.go含远程加载器 remote_loader.go从磁盘或远程源发现并加载模板再由 pkg/templates/compile.go 编译。输入提供者targets经 pkg/input/provider/ 处理目标输入支持多种输入格式Burp、OpenAPI、Raw、JSON、Swagger、YAML 等见 pkg/input/formats/formats.go。引擎创建与并发在 pkg/core/engine.go 中基于 work pool 构建并发执行环境。模板执行与结果收集执行各协议请求通过 operatorspkg/operators/matchers/、pkg/operators/extractors/完成匹配与提取产出ResultEvent。输出写入与报告集成经 pkg/output/ 多路输出文件、JSON、屏幕并通过 pkg/reporting/ 对接 Elasticsearch、JSONL、Markdown、PDF、SARIF、Splunk、MongoDB 等导出器与 GitHub、GitLab、Jira、Linear、Gitea 等工单跟踪系统。六、JavaScript 集成与 Code 协议Nuclei 内置了一个自定义 JavaScript 运行时用于支持 JavaScript / Code 协议模板。相关布局如下运行时与编译器pkg/js/compiler/含池化与非池化实现、会话管理自动生成绑定pkg/js/generated/go/下 32 个 Go 绑定文件、ts/下 33 个 TypeScript 定义库实现pkg/js/libs/涵盖 HTTP、SMB、SMTP、SSH、LDAP、MySQL、MSSQL、Redis、Kerberos、WebSocket 等数十个交互协议库绑定生成开发工具pkg/js/devtools/bindgen、tsgen、scrapefuncs。日常开发中通过make jsupdate-all在修改pkg/js/libs后重新生成绑定与 TypeScript 定义通过make memogen生成 memoization 代码。模板解析层在 pkg/templates/templates.go 中同时导入了code与javascript协议因此单个模板可以混用 HTTP Code/JavaScript 等多种协议。七、模板开发根据 CLAUDE.md 的模板开发章节模板本体存放在独立的 nuclei-templates 仓库中本仓库负责解析、编译与执行YAML 模板由info元信息、requests协议请求、operators匹配/提取三个核心部分组成单个模板可包含多种协议类型内置 DSL 函数用于动态内容生成如随机数、时间戳、载荷变形完整签名可通过 CLI 的-list-dsl-sigs参数列出底层实现见 pkg/operators/common/dsl/模板提交前可使用make template-validate完成自动校验参数含义见上文 2.2 节。八、关键目录导览目录内容备注lib/将 Nuclei 作为 Go 库嵌入的 SDK参见 lib/sdk.goexamples/不同场景的使用示例如 examples/simple/simple.go、examples/advanced/advanced.gointernal/tests/integration/原生集成测试套件及配套 testdata通过make integration运行internal/tests/functional/CI 专用的原生功能对比套件通过make functional运行pkg/fuzz/模糊测试引擎与 DAST 能力含 XSS、时间盲注分析器与频率跟踪pkg/input/多格式输入处理Burp、OpenAPI、Swagger 等pkg/reporting/结果导出与工单跟踪集成多种导出器与跟踪器8.1 SDK 用法示例lib/sdk.go 提供了NucleiEngine可通过函数式选项NucleiSDKOptions定制扫描行为并定义了ErrNoTemplatesAvailable、ErrNoTargetsAvailable等可识别错误。一个最小的嵌入示例examples/simple/simple.gopackage main import ( context nuclei github.com/projectdiscovery/nuclei/v3/lib ) func main() { ne, err : nuclei.NewNucleiEngineCtx(context.Background(), nuclei.WithTemplateFilters(nuclei.TemplateFilters{Tags: []string{oast}}), nuclei.EnableStatsWithOpts(nuclei.StatsOptions{MetricServerPort: 6064}), ) if err ! nil { panic(err) } // 加载目标false 表示不对非 http/https 目标做存活探测 ne.LoadTargets([]string{http://honey.scanme.sh}, false) err ne.ExecuteWithCallback(nil) if err ! nil { panic(err) } defer ne.Close() }更复杂的场景自定义结果回调、线程安全模式、模板自动升级开关等可参考 lib/example_test.go 与 lib/multi.go。九、安全上下文与延伸阅读仓库维护者在 CLAUDE.md 末尾特别提示在编写或评审与安全相关的代码之前务必先阅读 SECURITY_CONTEXT.md该文件记录了本仓库已知的漏洞与反复出现的薄弱点recurring weak spots避免在开发中重蹈覆辙。进一步的资料还包括DESIGN.md整体设计文档DEBUG.md调试排障指南SYNTAX-REFERENCE.md模板语法参考可由make syntax-docs重新生成CONTRIBUTING.md贡献指南README_CN.md中文版项目介绍。结合以上内容你可以从会使用进阶到能开发先用make build产出二进制用make test/make integration守护改动再沿着cmd/nuclei → internal/runner → pkg/core → pkg/protocols → pkg/operators这条主线深入源码最后借助pkg/templates与pkg/catalog理解模板从文件到可执行请求的完整生命周期。赞分享网络安全应用安全漏洞扫描【免费下载链接】nucleiNuclei is a fast, customizable vulnerability scanner powered by the global security community and built on a simple YAML-based DSL, enabling collaboration to tackle trending vulnerabilities on the internet. It helps you find vulnerabilities in your applications, APIs, networks, DNS, and cloud configurations.项目地址https://gitcode.com/GitHub_Trending/nu/nuclei点击查看免费下载相关推荐Nuclei核心架构深度解析从模板DSL到执行引擎的全流程解析Nuclei核心架构深度解析从模板DSL到执行引擎的全流程解析 你是否曾因漏洞扫描工具配置复杂、扫描效率低下而困扰Nuclei作为一款基于YAML DSL网络安全应用安全漏洞扫描Ansible 核心代码结构解析从 CLI 到执行引擎的目录架构、插件体系与测试布局Ansible 核心代码结构解析从 CLI 到执行引擎的目录架构、插件体系与测试布局 本文基于 ansible 仓库的 代码结构说明 https://linkDevOps运维配置管理工作流自动化任务调度WiredTiger 存储引擎开发指南从源码构建、代码架构到测试规范MongoDB 默认存储引擎WiredTiger 存储引擎开发指南从源码构建、代码架构到测试规范MongoDB 默认存储引擎 WiredTiger 是 MongoDB 的默认存储引擎数据库文档数据库后端上一篇Online3DViewer免费、3 步跑起来的在线 3D 模型查看器下一篇Onekey 完整使用指南5 分钟解锁 Steam 游戏的全部 DLC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Git hooks目录缺失导致创建失败?排查与修复完整指南 2026/9/30 3:22:56

Git hooks目录缺失导致创建失败?排查与修复完整指南

开发环境里有些报错特别奇怪,光看字面意思容易让人一头雾水,比如我今天要聊的这个:缺少 .git/hooks 目录导致创建失败。 很多人头一回撞到它时,第一反应是"hooks 目录是什么时候丢的",第二反应是"重建它…

阅读更多 →
Docker镜像与容器的核心区别:概念、原理与实战排查 2026/9/30 3:22:43

Docker镜像与容器的核心区别:概念、原理与实战排查

刚开始接触 Docker 的人,十个有九个会纠结同一个问题:镜像 Images 和容器 Container,到底是不是同一个东西?为什么docker images看不到正在运行的服务,docker ps又看不到下载好的镜像?这两个词看起来像同义…

阅读更多 →
从文件清单到全文检索:构建个人知识库的深度搜索方案 2026/9/30 3:22:43

从文件清单到全文检索:构建个人知识库的深度搜索方案

1. 为什么“把文件收拾整齐”治标不治本:先重新定义盘点想在几千个文件里找一段只记得零散字句的旧文档,最抓狂的不是文件多,而是你根本不知道自己到底存了些什么、它们分布在哪些目录、哪个版本才是最新的。我之前也走过弯路:花一…

阅读更多 →
vi编辑器实战指南:模式原理、高频命令与服务器高效编辑技巧 2026/9/30 3:22:43

vi编辑器实战指南:模式原理、高频命令与服务器高效编辑技巧

1. 为什么今天还值得花时间学vi说句实话,在2025年还在教学vi,听起来确实有点像在教人用算盘。但如果你真的在命令行环境里工作过哪怕一个星期,你就会明白vi从来就没有退出过历史舞台,它只是安静地躺在每一台Linux服务器的某个角落…

阅读更多 →
分布式事务面试100题:从2PC到TCC,高频考点全解析 2026/9/30 3:22:43

分布式事务面试100题:从2PC到TCC,高频考点全解析

面试后端岗位这些年,我发现一个规律:候选人简历上写“精通微服务”的不少,但能把分布式事务讲透的,十个人里最多一两个。分布式事务相关的问题几乎必考,且面试官不会只满足于“2PC、TCC、Saga”这几个名词。最近我用 D…

阅读更多 →
快速矩阵乘法工程实践:Strassen算法落地指南 2026/9/30 3:22:43

快速矩阵乘法工程实践:Strassen算法落地指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉