nuclei生成自己的密钥对,并使用其私钥签署自定义模板,从而确保在其环境中仅使用经授权的模板。
这也允许实体充分利用code等新协议的能力,而不必担心在其环境中使用恶意自定义模板。
注意:
- 除
code协议外,所有协议的模板签名都是可选的。 - 未签名的code模板被禁用,无法使用Nuclei执行。
- 只有作者(您自己)或ProjectDiscovery签名的code模板才能被执行。
- 模板签名主要是为了确保在主机上运行代码的模板的安全性。
- 允许代码文件引用(例如:
source: protocols/code/pyfile.py),这些文件的内容包含在模板摘要中。 - 有效载荷文件引用(例如:
payloads: protocols/http/params.txt)不包含在模板摘要中,因为它被视为有效载荷/辅助工具,而不是实际执行的代码。 - 模板签名在签名和验证模板时是确定性的,即如果使用
-lfa标志引用模板目录外的代码文件,那么如果没有-lfa标志使用相同的模板,验证将失败。(注意这仅适用于-lfa,即仅本地文件访问标志)
签署自定义模板
生成密钥对和签名/验证模板的最简单且推荐的方法是使用nuclei本身。
当签署模板时,如果密钥对不存在,Nuclei将提示用户生成新的密钥对并提供选项。
注意: 密码短语是可选的,当使用PEMCipherAES256算法加密私钥时可以留空一旦生成了密钥对,您可以使用
-sign标志签署任何自定义模板,如下所示。
注意: 每次对代码模板进行任何更改时,您都需要重新签名才能使用Nuclei运行。
模板摘要和签名密钥
当模板被签名时,会生成摘要并添加到模板中。这个摘要是模板内容的哈希值,用于验证模板的完整性。如果模板在签名后被修改,摘要将会改变,模板加载期间的签名验证将会失败。签名:片段,其中签名是用于验证模板完整性的数字签名,片段是通过MD5哈希公钥生成的元数据,用于禁止对非您编写的代码模板进行重新签名。
Nuclei生成的密钥对存储在$CONFIG/nuclei/keys目录中的两个文件中,其中$CONFIG是系统特定的配置目录。私钥存储在nuclei-user-private-key.pem中,如果提供了密码短语,则加密。公钥存储在nuclei-user.crt中,其中包含公钥和标识符(例如,用户/组织名称)的自签名证书。
$CONFIG/nuclei/keys目录,或设置NUCLEI_USER_CERTIFICATE环境变量为公钥的路径或内容。
要使用私钥,您可以将其复制到另一用户机器上的$CONFIG/nuclei/keys目录,或设置NUCLEI_USER_PRIVATE_KEY环境变量为私钥的路径或内容。
HIDE_TEMPLATE_SIG_WARNING环境变量设置为true来禁用此警告。
常见问题
发现X个未签名或被篡改的代码模板?simple-code.yaml是一个未签名或签名后内容已被修改的代码协议模板,这表明模板的完整性已丢失。
如果您是模板编写者,那么您可以继续使用-sign标志签署模板;如果您是模板使用者,那么您应该在签署前仔细检查模板。
出于安全原因不允许重新签署代码模板?
re-signing code templates are not allowed for security reasons来自Nuclei引擎。此错误表明最初由另一个用户签名的代码模板有人试图重新签名。
这一措施的实施是为了防止在不知情的情况下运行不受信任的模板,这可能导致潜在的安全问题。
当您遇到此错误时,它表明您正在处理的模板已由另一个用户签名,可能原始签名者不是您或projectdiscovery团队。
默认情况下,Nuclei不允许执行由您或projectdiscovery/nuclei-templates提供的公共模板以外的任何人签名的代码模板。
这样做是为了防止使用代码模板进行潜在的安全滥用。
要解决此错误:
- 打开并彻底检查代码模板是否有任何修改。
- 手动从模板中删除现有的摘要签名。
- 重新签署模板。