devops - 检测 secret 和检测 secret Hook 结果之间的差异

标签 devops credentials

我正在评估detect-secrets我不确定为什么我从检测 secret 和钩子(Hook)中得到不同的结果。

以下是简化日志:

$ cat docs/how-to-2.md
AZ_STORAGE_CS="DefaultEndpointsProtocol=https;AccountName=storageaccount1234;AccountKey=1OM7c6u5Ocp/zyUMWcRChowzd8czZmxPhzHZ8o45X7tAryr6JFF79+zerFFQS34KzVTK0yadoZGkvZh42A==;EndpointSuffix=core.windows.net"
$ detect-secrets scan --string $(cat docs/how-to-2.md)
AWSKeyDetector         : False
ArtifactoryDetector    : False
Base64HighEntropyString: True  (5.367)
BasicAuthDetector      : False
CloudantDetector       : False
HexHighEntropyString   : False
IbmCloudIamDetector    : False
IbmCosHmacDetector     : False
JwtTokenDetector       : False
KeywordDetector        : False
MailchimpDetector      : False
PrivateKeyDetector     : False
SlackDetector          : False
SoftlayerDetector      : False
StripeDetector         : False
TwilioKeyDetector      : False
$ detect-secrets-hook docs/how-to-2.md
$ detect-secrets-hook --baseline .secrets.baseline docs/how-to-2.md

我本以为 detect-secrets-hook 会告诉我有关具有高熵的 Azure 存储帐户 key 的信息。

有关基线的更多详细信息:

$ cat .secrets.baseline
{
  "custom_plugin_paths": [],
  "exclude": {
    "files": null,
    "lines": null
  },
  "generated_at": "2020-10-09T10:06:54Z",
  "plugins_used": [
    {
      "name": "AWSKeyDetector"
    },
    {
      "name": "ArtifactoryDetector"
    },
    {
      "base64_limit": 4.5,
      "name": "Base64HighEntropyString"
    },
    {
      "name": "BasicAuthDetector"
    },
    {
      "name": "CloudantDetector"
    },
    {
      "hex_limit": 3,
      "name": "HexHighEntropyString"
    },
    {
      "name": "IbmCloudIamDetector"
    },
    {
      "name": "IbmCosHmacDetector"
    },
    {
      "name": "JwtTokenDetector"
    },
    {
      "keyword_exclude": null,
      "name": "KeywordDetector"
    },
    {
      "name": "MailchimpDetector"
    },
    {
      "name": "PrivateKeyDetector"
    },
    {
      "name": "SlackDetector"
    },
    {
      "name": "SoftlayerDetector"
    },
    {
      "name": "StripeDetector"
    },
    {
      "name": "TwilioKeyDetector"
    }
  ],
  "results": {
    ".devcontainer/Dockerfile": [
      {
        ###obfuscated###
      }
    ],
    "deployment/export-sp.sh": [
      {
        ###obfuscated###
      }
    ],
    "docs/pip-install-from-artifacts-feeds.md": [
      {
        ###obfuscated###
      }
    ]
  },
  "version": "0.14.3",
  "word_list": {
    "file": null,
    "hash": null
  }
}

最佳答案

这绝对是一种奇怪的行为,但经过一番调查后,我意识到您偶然发现了该工具的一个边缘情况。

tl;博士

  • HighEntropyStringPlugin 支持有限的字符集(不包括 ;)
  • 为了减少误报,HighEntropyStringPlugin 利用了在某些上下文中引用字符串的启发式方法。
  • 为了改进 UI,内联字符串扫描不需要需要带引号的字符串。

因此,功能有所不同:当通过 detect-secrets-hook 运行时,由于 ; 的存在,它不会相应地解析字符串。但是,当通过 detect-secrets scan --string 运行时,它不需要引号,并且会分解字符串。

详细说明

如果不积极修剪误报,HighEntropyString 测试会非常嘈杂。它尝试执行此操作的一种方法是应用相当严格的正则表达式( source ),其中 requires it to be inside quotes 。但是,对于某些情况,this quoted requirement is removed (例如 YAML 文件和内联字符串扫描)。

删除此引用的要求后,我们会得到以下分割:

>>> line = 'AZ_STORAGE_CS="DefaultEndpointsProtocol=https;AccountName=storageaccount1234;AccountKey=1OM7c6u5Ocp/zyUMWcRChowzd8czZmxPhzHZ8o45X7tAryr6JFF79+zerFFQS34KzVTK0yadoZGkvZh42A==;EndpointSuffix=core.windows.net"'
>>> with self.non_quoted_string_regex(is_exact_match=False):
...    self.regex.findall(line)
['AZ_STORAGE_CS=', 'DefaultEndpointsProtocol=https', 'AccountName=storageaccount1234', 'AccountKey=1OM7c6u5Ocp/zyUMWcRChowzd8czZmxPhzHZ8o45X7tAryr6JFF79+zerFFQS34KzVTK0yadoZGkvZh42A==', 'EndpointSuffix=core', 'windows', 'net']

执行此操作后,我们可以看到 AccountKey=1OM7c6u5Ocp/zyUMWcRChowzd8czZmxPhzHZ8o45X7tAryr6JFF79+zerFFQS34KzVTK0yadoZGkvZh42A== 将触发 base64 插件,如下所示:

$ detect-secrets scan --string 'AccountKey=1OM7c6u5Ocp/zyUMWcRChowzd8czZmxPhzHZ8o45X7tAryr6JFF79+zerFFQS34KzVTK0yadoZGkvZh42A=='
AWSKeyDetector         : False
ArtifactoryDetector    : False
Base64HighEntropyString: True  (5.367)
BasicAuthDetector      : False
CloudantDetector       : False
HexHighEntropyString   : False
IbmCloudIamDetector    : False
IbmCosHmacDetector     : False
JwtTokenDetector       : False
KeywordDetector        : False
MailchimpDetector      : False
PrivateKeyDetector     : False
SlackDetector          : False
SoftlayerDetector      : False
StripeDetector         : False
TwilioKeyDetector      : False

但是,当应用这一引用要求时,整个字符串负载将被扫描为一个潜在 secret :DefaultEndpointsProtocol=https;AccountName=storageaccount1234;AccountKey=1OM7c6u5Ocp/zyUMWcRChowzd8czZmxPhzHZ8o45X7tAryr6JFF79+zerFFQS34KzVTK0yadoZGkv ZH42A= =;EndpointSuffix=core.windows.net

这不会被标记,因为它不符合原始的 base64 正则表达式规则,该规则不知道如何处理 ;

>>> self.regex.findall(line)
[]

因此,此功能有所不同,但通过所描述的调用模式并不能立即看出。

如何解决这个问题?

这是一个更具挑战性的问题,因为允许其他字符会改变熵计算以及标记字符串的概率。关于为所有角色创建插件已经进行了一些讨论,但团队尚未能够决定为此的默认熵限制。

关于devops - 检测 secret 和检测 secret Hook 结果之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64388788/

相关文章:

api - 最佳实践 - 是否存储 Twitter 凭据?

asp.net - 在 ASP.NET 中访问 Active Directory?

python - 运行我的谷歌凭据以更新谷歌表格中的某些数据时出现异常错误

java - 停止在自定义 Azure-VM 中运行的 Java 进程

docker - 获取Build.Repository.LocalPath的数据并在我的DockerFile中使用它

authentication - 贵公司如何管理凭据?

android - 我可以更改登录提示模式标题(从 'Choose an Account' 到 'Pre-fill Sign up form' )

azure - DevOps - 禁用发布管道中的阶段

ruby - Chef ruby​​_block 执行导致错误

amazon-web-services - AWS CodePipeline : Get CloudFormation outputs in CodeBuild