Skip to main content

Curl Username Password

Description

General

The curl_username_password detector aims at catching curl CLI invocations that embed basic credentials via -u/--user, i.e. username:password, such as:

curl -u admin:abc123 https://192.12.8.1:9200/_cluster/health

Because curl commands are very common in codebases and docs, this detector relies on a strict matcher (CLI option parsing) plus multiple post-validation layers to reduce false positives.

Specifications

This detector focuses on a single pattern:

  • The command must be curl

  • The credentials must be provided through -u or --user

  • The option value must match:

    • username: [a-zA-Z0-9._%+-]{4,150}
    • password: [a-zA-Z0-9!#$%&*+/?@=^_~.>-]{4,128}
    • joined as username:password

The two captured groups are referred to as username and password.

Revoke the secret

This detector catches generic credentials used with curl, so GitGuardian cannot infer which service they authenticate to. To revoke:

  1. Identify the target service from the URL and context around the curl command.
  2. Rotate/revoke the impacted account credentials in that service.
  3. Update any scripts, CI variables, docs, or samples to use safer auth (tokens, vault-managed secrets, or interactive prompting).

Examples

Examples that WILL be caught

- text: |
curl -k -v -u 'svc_application:AreO42JJ5JY5LFDSa5OU' --upload-file abc.tar.gz https://prd-nexus/repository/application-raw/abc.tar.gz
username: svc_application
password: AreO42JJ5JY5LFDSa5OU
- text: |
curl -s -T index.html "ftp://f31-preview.eohost.com" --user "4689449_GASSANT:abc123"
username: 4689449_GASSANT
password: abc123

Examples that WILL NOT be caught

  • Missing curl keyword or missing -u/--user
http --auth admin:abc123 GET https://example.com
  • Too-short values (username/password must be at least 4 chars)
curl -u adm:abc https://example.com
curl -u user:[password] https://example.com
curl -u default:env.pw https://example.com

Details for Curl Username Password

  • High Recall: False

  • Validity Check: False

  • Occurrences found for one million commits: 15.17

  • Prefixed: False

  • PreValidators:

- type: ContentWhitelistPreValidator
case_sensitive: true
patterns:
- curl

- type: ContentWhitelistPreValidator
case_sensitive: true
patterns:
- "-u"
- "--user"
  • Matcher
- type: CLIOptionMatcher
command_name: curl
short_option_flag: "-u"
long_option_flag: "--user"
option_regex: (?P<username>[a-zA-Z0-9._%+-]{4,150}):(?P<password>[a-zA-Z0-9!#$%&*+/?@=^_`~.>-]{4,128})
username:
- type: ContextWindowBanlistPostValidator
patterns: ["default", "error", "invalid"]
window_width: 40
window_type: "left"
- type: AssignmentBanlistPostValidator
patterns:
- "missing"
- type: CommonValueBanlistPostValidator
- type: CommonUsernameBanlistPostValidator
- type: ValueBanlistPostValidator
patterns:
- "^none"
- "1234"
- ^null
- ^empty
- ^user
- pass
- ^root
- ^true
- ^false
- ^and
- ^self
- ^raw
- test
- sample
- dummy
- value
- name
- email
- ^form
- ^\.?request
- ^before
- ^string
- ^await$
- ^this
- ^int
- ^replace
- ^foo
- ^change
- ^disabled
- ^required
- \.string$
- ^django\.
- ^please
- ^validated
- "%s"
- ^cleaned
- ^table\.
- ^driver\.
- ^args\.
- ^bool(ean)?
- ^url
- credentialsId
- field
- ^open
- callback
- validator
- placeholder
- anonymous
- class
- ^get
- phone
- swift
- type
- label
- attribute
- ^html
- ^attr
- text
- nombre
- ^ask
- config
- input
- ^enter
- ^login
- ^token
- ^throw
- credential
- confirmer
- ^const
- ^new
- ^uid
- model$
- ^reg
- ^search
- nsstring
- candidate$
- form$
- expression
- ^share
- presence
- mysqli_real_escape
- onchange
- account
- base64
- email$
- create
- ^nil$
- removed
- mystring
- function
- ^local
- ^[_.-]
- "[_.-]$"
- ^void
- ^from
- ^char$
- ^usr$
- ^no-reply
- ^hash$
- ^%.+%$
- ^xpathFor

password:
- type: ContextWindowBanlistPostValidator
patterns: ["error", "invalid"]
window_width: 40
window_type: "left"
- type: AssignmentBanlistPostValidator
patterns:
- "hash"
- "salt"
- "missing"
- ^(?-i:[a-zA-Z0-9]{1,3}[A-Z0-9](Pwd|PWd|PwD|pWD|pWd|pwD))$
# Do not match AWS Secret manager recognized by passwordSecretName or passwordSecretKey
- "^passwordSecret(Name|Key)$"
- type: CommonValueBanlistPostValidator
- type: CommonPasswordBanlistPostValidator
- type: ValueBanlistPostValidator
patterns:
- ^\$[a-z]{3}
# avoid false positives like --fill_me--
- ^(-{2,4})[a-zA-Z_-]+\1$
- redacted
- ^local
- ^none
- ^null
- ^empty
- ^user
- pass
- ^root
- ^true
- ^false
- ^and
- ^prompt
- ^final$
- ^self
- ^email
- ^raw
- ^temp$
- ^undefined$
- ^auth_email$
- test
- ^req$
- "1234"
- ^#
- ^vault
- ^java
- ^ansible
- ^demo
- "123213123"
- ^guest
- ^visit$
- ^Coffee123$
- ^123bla456bla$
- value
- ^form
- ^request
- ^errors
- ^before
- ^wrong pass
- ^string
- ^await$
- ^foo
- ^change
- ^disabled
- ^required
- ^postgres
- ^django\.
- ^please
- ^validated
- "%s"
- ^cleaned
- \.string$
- ^wrong
- ^args\.
- ^bool(ean)?
- \/run\/
- ^url
- credentialsId
- field
- ^open
- callback
- validator
- placeholder
- anonymous
- class
- ^get
- phone
- swift
- type
- label
- attribute
- ^html
- ^attr
- text
- nombre
- ^ask
- config
- input
- ^enter
- ^login
- ^token
- ^throw
- credential
- confirmer
- ^const
- ^new
- ^uid
- model$
- ^reg
- ^search
- nsstring
- candidate$
- form$
- expression
- ^share
- presence
- mysqli_real_escape
- onchange
- account
- base64
- email$
- create
- ^nil$
- removed
- mystring
- function
- ^-*$
- sha256
- "^[0-9]{1,3}.[0-9]{1,3}s"
- encrypted
- bcrypt
- object
- secure
- ^salt$
- ^emit$
- ^[~^]?[0-9]+\.[0-9]+\.[0-9]+$
- ^[^a-z0-9]+$
- ^%.+%$
- ^env\.[A-Za-z_]*$
- ^xpathFor
- type: EntropyPostValidator
entropy: 1
- type: DictFilterPostValidator
threshold_words_pct_matched: 1.0