Skip to main content
通过公私钥机制进行模板签名是确保模板完整性、真实性和安全性的关键方面。这种机制涉及使用非对称加密技术,特别是椭圆曲线数字签名算法(ECDSA),创建安全可验证的签名。 在这个过程中,模板作者生成一个保密且安全存储的私钥。相应的公钥随后与模板使用者共享。当创建或修改模板时,作者使用其私钥对其进行签名,生成附加到模板的唯一签名。 模板使用者可以使用作者的公钥验证已签名模板的真实性和完整性。通过应用适当的加密算法(ECDSA),他们可以验证签名并确保模板自签名后未被篡改。这提供了一定程度的信任,因为模板的任何修改或未授权更改都会导致验证过程失败。 通过采用公私钥机制,模板签名为模板生态系统增加了额外的安全和信任层。它有助于确立模板作者的身份,并确保在各种系统中使用的模板是真实的且未被恶意篡改。 签名模板意味着什么? 模板签名是确保模板完整性和真实性的机制。主要目标是为模板编写者和使用者提供一种信任众包或自定义模板的方式,确保它们不被篡改。 所有官方Nuclei模板都包含数字签名,并在加载模板时使用ProjectDiscovery的公钥(随Nuclei二进制文件提供)进行验证。 在工作环境中运行Nuclei的个人或组织可以使用nuclei生成自己的密钥对,并使用其私钥签署自定义模板,从而确保在其环境中仅使用经授权的模板。 这也允许实体充分利用code等新协议的能力,而不必担心在其环境中使用恶意自定义模板。 注意:
  • code协议外,所有协议的模板签名都是可选的
  • 未签名的code模板被禁用,无法使用Nuclei执行
  • 只有作者(您自己)或ProjectDiscovery签名的code模板才能被执行
  • 模板签名主要是为了确保在主机上运行代码的模板的安全性
  • 允许代码文件引用(例如:source: protocols/code/pyfile.py),这些文件的内容包含在模板摘要中。
  • 有效载荷文件引用(例如:payloads: protocols/http/params.txt)不包含在模板摘要中,因为它被视为有效载荷/辅助工具,而不是实际执行的代码。
  • 模板签名在签名和验证模板时是确定性的,即如果使用-lfa标志引用模板目录外的代码文件,那么如果没有-lfa标志使用相同的模板,验证将失败。(注意这仅适用于-lfa,即仅本地文件访问标志)

签署自定义模板

生成密钥对和签名/验证模板的最简单且推荐的方法是使用nuclei本身。 当签署模板时,如果密钥对不存在,Nuclei将提示用户生成新的密钥对并提供选项。
$ ./nuclei -t templates.yaml -sign
[INF] Generating new key-pair for signing templates
[*] Enter User/Organization Name (exit to abort) : acme
[*] Enter passphrase (exit to abort): 
[*] Enter same passphrase again: 
[INF] Successfully generated new key-pair for signing templates
注意: 密码短语是可选的,当使用PEMCipherAES256算法加密私钥时可以留空
一旦生成了密钥对,您可以使用-sign标志签署任何自定义模板,如下所示。
$ ./nuclei -t templates.yaml -sign
[INF] All templates signatures were elaborated success=1 failed=0
注意: 每次对代码模板进行任何更改时,您都需要重新签名才能使用Nuclei运行。

模板摘要和签名密钥

当模板被签名时,会生成摘要并添加到模板中。这个摘要是模板内容的哈希值,用于验证模板的完整性。如果模板在签名后被修改,摘要将会改变,模板加载期间的签名验证将会失败。
# digest: 4a0a00473045022100eb01da6b97893e7868c584f330a0cd52df9bddac005860bb8595ba5b8aed58c9022050043feac68d69045cf320cba9298a2eb2e792ea4720d045d01e803de1943e7d:4a3eb6b4988d95847d4203be25ed1d46
摘要的格式为签名:片段,其中签名是用于验证模板完整性的数字签名,片段是通过MD5哈希公钥生成的元数据,用于禁止对非您编写的代码模板进行重新签名。 Nuclei生成的密钥对存储在$CONFIG/nuclei/keys目录中的两个文件中,其中$CONFIG是系统特定的配置目录。私钥存储在nuclei-user-private-key.pem中,如果提供了密码短语,则加密。公钥存储在nuclei-user.crt中,其中包含公钥和标识符(例如,用户/组织名称)的自签名证书。
$ la ~/.config/nuclei/keys 
total 16
-rw-------  1 tarun  staff   251B Oct  4 21:45 nuclei-user-private-key.pem # 使用密码短语加密的私钥
-rw-------  1 tarun  staff   572B Oct  4 21:45 nuclei-user.crt # 包含公钥和标识符(即用户/组织名称)的自签名证书
要使用公钥进行验证,您可以将其复制到另一用户机器上的$CONFIG/nuclei/keys目录,或设置NUCLEI_USER_CERTIFICATE环境变量为公钥的路径或内容。 要使用私钥,您可以将其复制到另一用户机器上的$CONFIG/nuclei/keys目录,或设置NUCLEI_USER_PRIVATE_KEY环境变量为私钥的路径或内容。
$ export NUCLEI_USER_CERTIFICATE=$(cat path/to/nuclei-user.crt)
$ export NUCLEI_USER_PRIVATE_KEY=$(cat path/to/nuclei-user-private-key.pem)
需要注意的是,您负责保护和管理私钥,Nuclei对私钥的任何丢失不承担责任。 默认情况下,Nuclei从上述默认位置加载用户证书(公钥)并使用它来验证模板。运行Nuclei时,它将执行已签名的模板,警告执行未签名的自定义模板,并阻止未签名的代码模板。您可以通过将HIDE_TEMPLATE_SIG_WARNING环境变量设置为true来禁用此警告。

常见问题

发现X个未签名或被篡改的代码模板?
./nuclei -u scanme.sh -t simple-code.yaml 

                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v3.0.0-dev

		projectdiscovery.io

[WRN] Found 1 unsigned or tampered code template (carefully examine before using it & use -sign flag to sign them)
[INF] Current nuclei version: v3.0.0-dev (development)
[INF] Current nuclei-templates version: v9.6.4 (latest)
[WRN] Executing 1 unsigned templates. Use with caution.
[INF] Targets loaded for current scan: 1
[INF] No results found. Better luck next time!
[FTL] Could not run nuclei: no templates provided for scan
这里的simple-code.yaml是一个未签名或签名后内容已被修改的代码协议模板,这表明模板的完整性已丢失。 如果您是模板编写者,那么您可以继续使用-sign标志签署模板;如果您是模板使用者,那么您应该在签署前仔细检查模板。 出于安全原因不允许重新签署代码模板?
nuclei -u scanme.sh -t simple-code.yaml -sign

[ERR] could not sign 'simple-code.yaml': [signer:RUNTIME] re-signing code templates are not allowed for security reasons.
[INF] All templates signatures were elaborated success=0 failed=1
错误消息re-signing code templates are not allowed for security reasons来自Nuclei引擎。此错误表明最初由另一个用户签名的代码模板有人试图重新签名。 这一措施的实施是为了防止在不知情的情况下运行不受信任的模板,这可能导致潜在的安全问题。 当您遇到此错误时,它表明您正在处理的模板已由另一个用户签名,可能原始签名者不是您或projectdiscovery团队。 默认情况下,Nuclei不允许执行由您或projectdiscovery/nuclei-templates提供的公共模板以外的任何人签名的代码模板。 这样做是为了防止使用代码模板进行潜在的安全滥用。 要解决此错误:
  1. 打开并彻底检查代码模板是否有任何修改。
  2. 手动从模板中删除现有的摘要签名。
  3. 重新签署模板。
通过这种方式,您可以确保只有经过您(或projectdiscovery)验证和信任的模板才会运行,从而维护安全的环境。