puppet-lint-infrasecure 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/puppet-lint/linter.rb +32 -0
  3. data/lib/puppet-lint/plugins/check_admin_by_default.rb +22 -15
  4. data/lib/puppet-lint/plugins/check_cyrillic_homograph_attack.rb +16 -10
  5. data/lib/puppet-lint/plugins/check_empty_password.rb +15 -16
  6. data/lib/puppet-lint/plugins/check_hard_coded_key.rb +28 -0
  7. data/lib/puppet-lint/plugins/check_hard_coded_password.rb +33 -0
  8. data/lib/puppet-lint/plugins/check_hard_coded_secret.rb +20 -18
  9. data/lib/puppet-lint/plugins/check_hard_coded_username.rb +31 -0
  10. data/lib/puppet-lint/plugins/check_invalid_ip_addr_binding.rb +13 -12
  11. data/lib/puppet-lint/plugins/check_malicious_dependency.rb +2 -2
  12. data/lib/puppet-lint/plugins/check_suspicious_comment.rb +2 -2
  13. data/lib/puppet-lint/plugins/check_use_http_without_tls.rb +14 -12
  14. data/lib/puppet-lint/plugins/check_use_of_weak_crypto_algorithm.rb +2 -2
  15. data/lib/puppet-lint/plugins/check_weak_password.rb +6 -4
  16. data/lib/puppet-lint-infrasecure/config/default.yml +21 -0
  17. data/lib/puppet-lint-infrasecure/rules.rb +23 -6
  18. data/lib/puppet-lint-infrasecure/version.rb +1 -1
  19. data/spec/puppet-lint/plugins/check_admin_by_default_spec.rb +3 -3
  20. data/spec/puppet-lint/plugins/check_cyrillic_homograph_attack_spec.rb +1 -1
  21. data/spec/puppet-lint/plugins/check_empty_password_spec.rb +1 -1
  22. data/spec/puppet-lint/plugins/check_hard_coded_key_spec.rb +54 -0
  23. data/spec/puppet-lint/plugins/check_hard_coded_password_spec.rb +54 -0
  24. data/spec/puppet-lint/plugins/check_hard_coded_secret_spec.rb +6 -5
  25. data/spec/puppet-lint/plugins/check_hard_coded_username_spec.rb +54 -0
  26. data/spec/puppet-lint/plugins/check_invalid_ip_addr_binding_spec.rb +1 -1
  27. data/spec/puppet-lint/plugins/check_malicious_dependency_spec.rb +1 -1
  28. data/spec/puppet-lint/plugins/check_suspicious_comment_spec.rb +1 -1
  29. data/spec/puppet-lint/plugins/check_use_http_without_tls_spec.rb +2 -2
  30. data/spec/puppet-lint/plugins/check_use_of_weak_crypto_algorithm_spec.rb +1 -1
  31. data/spec/puppet-lint/plugins/check_weak_password_spec.rb +1 -1
  32. metadata +12 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af41dd57d2277014626a4346718c4fecc7ac7f1bb62a544d69853058837092bc
4
- data.tar.gz: 0f174a79194cdfaae29db7de3d720e5194a06ee91d9808b4db3c910c408565ed
3
+ metadata.gz: 1ccfc1a16704f252eb18653d27c22f1bb519afaf09c2527db4b776d0884e6846
4
+ data.tar.gz: bf3a2457fcb232299b77bee3ebfb379b76e1baa3b3ea52d21c8f7e39399b2bdd
5
5
  SHA512:
6
- metadata.gz: a94c3cf0b774ec50dcc4610b7cf281768af290a025f7a282c5d7a1281e3152c9607e5cba886007a56465f416bd5458c6eaefe66545c50526a27d266a796121fd
7
- data.tar.gz: 9eff8346d97c2c31b9716b276c9905e29a7e9d2cfb0e6c0e0dd7b7a40404bfb2fa1d05edb0e5d4ec2fe8ac2f9cb351a32f538fc963b623a02bccd25c342ac790
6
+ metadata.gz: 923cb4e0e996e1e1886836447dde93f5989e691142396a98c3e435f4f04214b7fe09083bbc09f66c791e98f75d030c916a633ef5215df35beb876c98612f821b
7
+ data.tar.gz: f62d22690a41560085df4744427362b7ff984ddf26caac75ee1ee52d1476bf9c5daf802255b4cbe301b6a5be7cf9c6fc643e80320c7e455be14cbc7cb30c0b8a
@@ -118,6 +118,38 @@ class PuppetLint::CheckPlugin
118
118
  return ftokens
119
119
  end
120
120
 
121
+ def filter_credentials(tokens)
122
+ credentials = {}
123
+ tokens.each do |token|
124
+ next if token.next_code_token.nil?
125
+ next if token.prev_code_token.nil?
126
+ # accepts (<VARIABLE>|<NAME>) =~ SECRET (<EQUALS>|<FARROW>) !(<STRING>|<SSTRING>|<NAME>) =~ (NONSECRET AND PLACHOLDER)
127
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and token.prev_code_token.value.downcase =~ Rules.secret and !(token.next_code_token.value.downcase =~ Rules.nonsecret) and !(token.next_code_token.value.downcase =~ Rules.placeholder)
128
+ # check if username
129
+ left_side_value = token.prev_code_token.value.downcase
130
+ is_username = left_side_value[Rules.username]
131
+ is_password = left_side_value[Rules.password]
132
+ if !is_username.nil?
133
+ puts is_username
134
+ context = left_side_value.gsub(is_username, '')
135
+ if context.length > 0
136
+ puts "CONTEXT", context
137
+ end
138
+ credentials.merge!(context => {:username => left_side_value }) if context.length > 0
139
+ end
140
+ if !is_password.nil?
141
+ puts is_password
142
+ context = left_side_value.gsub(is_password, '')
143
+ if context.length > 0
144
+ puts "CONTEXT", context
145
+ end
146
+ credentials.merge!(context => {:password => left_side_value }) if context.length > 0
147
+ end
148
+ end
149
+ end
150
+ puts credentials
151
+ end
152
+
121
153
  def filter_variables(tokens, keywords)
122
154
  line = -1
123
155
  kw_regex = Regexp.new keywords.join("|")
@@ -3,21 +3,28 @@ require 'puppet-lint-infrasecure'
3
3
  PuppetLint.new_check(:admin_by_default) do
4
4
 
5
5
  def check
6
- ftokens = get_tokens(tokens,'admin')
7
- ftokens.each do |token|
8
- token_value = token.value.downcase
9
- if [:EQUALS, :FARROW].include? token.prev_code_token.type
10
- prev_token = token.prev_code_token
11
- left_side = prev_token.prev_code_token
12
- if left_side.value.downcase =~ Rules.credentials and [:VARIABLE, :NAME].include? left_side.type
13
- if token_value == 'admin'
14
- notify :warning, {
15
- message: "[SECURITY] Admin by default (line=#{token.line}, col=#{token.column}) | Do not make user/password as admin as for $#{prev_token.prev_code_token.value.downcase} in line #{token.line}. This can be easily exploited.",
16
- line: token.line,
17
- column: token.column,
18
- token: token_value,
19
- cwe: 'CWE-250'
20
- }
6
+ tokens.each do |token|
7
+ next if token.next_code_token.nil?
8
+ next if token.prev_code_token.nil?
9
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) (<STRING>|<SSTRING>)
10
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and [:STRING, :SSTRING].include? token.next_code_token.type
11
+ left_side_value = token.prev_code_token.value.downcase
12
+ right_side_value = token.next_code_token.value.downcase
13
+
14
+ # left side checkers (<VARIABLE>|<NAME>)
15
+ if !(left_side_value =~ Rules.nonsecret) and left_side_value =~ Rules.username and !left_side_value[/(admin|root)/]
16
+ # right side checkers (<STRING>|<SSTRING>)
17
+ if !(right_side_value =~ Rules.placeholder) and right_side_value.length > 1 and !(right_side_value =~ /\/.*./ )
18
+ # final check
19
+ if ['admin', 'root'].include? right_side_value
20
+ notify :warning, {
21
+ message: "[SECURITY][CWE-250] Admin by default (line=#{token.line}, col=#{token.column}) | Do not make user as admin as for $#{left_side_value} in line #{token.line}. This can be easily exploited.",
22
+ line: token.line,
23
+ column: token.column,
24
+ token: right_side_value,
25
+ cwe: 'CWE-250'
26
+ }
27
+ end
21
28
  end
22
29
  end
23
30
  end
@@ -2,17 +2,23 @@ require 'puppet-lint-infrasecure'
2
2
 
3
3
  PuppetLint.new_check(:cyrillic_homograph_attack) do
4
4
  def check
5
- ftokens = filter_tokens(tokens)
6
5
  tokens.each do |token|
7
- token_value = token.value.downcase
8
- if [:STRING, :SSTRING].include? token.type and token_value =~ Rules.cyrillic
9
- notify :warning, {
10
- message: "[SECURITY] Homograph Attack (line=#{token.line}, col=#{token.column}). This link (#{token_value}) has a cyrillic char. These are not rendered by browsers and are sometimes used for phishing attacks.",
11
- line: token.line,
12
- column: token.column,
13
- token: token_value,
14
- cwe: 'CWE-1007'
15
- }
6
+ next if token.next_code_token.nil?
7
+ next if token.prev_code_token.nil?
8
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) (<STRING>|<SSTRING>)
9
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and [:STRING, :SSTRING].include? token.next_code_token.type
10
+ left_side_value = token.prev_code_token.value.downcase
11
+ right_side_value = token.next_code_token.value.downcase
12
+ # checks (<STRING>|<SSTRING>)
13
+ if right_side_value =~ Rules.cyrillic
14
+ notify :warning, {
15
+ message: "[SECURITY][CWE-1007] Homograph Attack (line=#{token.next_code_token.line}, col=#{token.next_code_token.column}). This link (#{right_side_value}) has a cyrillic char. These chars are not rendered by browsers and are sometimes used for phishing attacks. It can also result in typosquatting attacks.",
16
+ line: token.next_code_token.line,
17
+ column: token.next_code_token.column,
18
+ token: token.next_code_token.value,
19
+ cwe: 'CWE-1007'
20
+ }
21
+ end
16
22
  end
17
23
  end
18
24
  end
@@ -3,22 +3,21 @@ require 'puppet-lint-infrasecure'
3
3
  PuppetLint.new_check(:empty_password) do
4
4
 
5
5
  def check
6
- ftokens = get_string_tokens(tokens,'')
7
- ftokens.each do |token|
8
- token_value = token.value.downcase
9
- if [:EQUALS, :FARROW].include? token.prev_code_token.type
10
- prev_token = token.prev_code_token
11
- left_side = prev_token.prev_code_token
12
- if left_side.value.downcase =~ Rules.password and [:VARIABLE, :NAME].include? left_side.type
13
- if token_value == ''
14
- notify :warning, {
15
- message: "[SECURITY] Empty Password (line=#{token.line}, col=#{token.column}) | Do not keep the password field empty as for $#{prev_token.prev_code_token.value.downcase} in line #{token.line}. Use kms/heira/vault instead.",
16
- line: token.line,
17
- column: token.column,
18
- token: token_value,
19
- cwe: 'CWE-258'
20
- }
21
- end
6
+ tokens.each do |token|
7
+ next if token.next_code_token.nil?
8
+ next if token.prev_code_token.nil?
9
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) (<STRING>|<SSTRING>)
10
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and [:STRING, :SSTRING].include? token.next_code_token.type
11
+ left_side_value = token.prev_code_token.value.downcase
12
+ right_side_value = token.next_code_token.value.downcase
13
+ if left_side_value =~ Rules.password and right_side_value == ''
14
+ notify :warning, {
15
+ message: "[SECURITY][CWE-258] Empty Password (line=#{token.next_code_token.line}, col=#{token.next_code_token.column}) | Do not keep the password field empty as for $#{token.prev_code_token.value} in line #{token.prev_code_token.line}. Use a stronger password.",
16
+ line: token.next_code_token.line,
17
+ column: token.next_code_token.column,
18
+ token: token.next_code_token.value,
19
+ cwe: 'CWE-258'
20
+ }
22
21
  end
23
22
  end
24
23
  end
@@ -0,0 +1,28 @@
1
+ require 'puppet-lint-infrasecure'
2
+
3
+ PuppetLint.new_check(:hardcoded_secret_key) do
4
+ def check
5
+ tokens.each do |token|
6
+ next if token.next_code_token.nil?
7
+ next if token.prev_code_token.nil?
8
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) (<STRING>|<SSTRING>)
9
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and [:STRING, :SSTRING].include? token.next_code_token.type
10
+ left_side_value = token.prev_code_token.value.downcase
11
+ right_side_value = token.next_code_token.value.downcase
12
+ # checks left side (<VARIABLE>|<NAME>)
13
+ if left_side_value =~ Rules.key and !(left_side_value =~ Rules.nonsecret)
14
+ # checks right side (<STRING>|<SSTRING>)
15
+ if !(right_side_value =~ Rules.placeholder) and right_side_value.length > 1 and !right_side_value[/\/.*(\/)+/]
16
+ notify :warning, {
17
+ message: "[SECURITY][CWE-321] Hard Coded Key (line=#{token.next_code_token.line}, col=#{token.next_code_token.column}) | Do not keep secrets on your scripts as for $#{token.prev_code_token.value} = #{token.next_code_token.value} in line #{token.next_code_token.line}. Store secrets in a vault instead.",
18
+ line: token.next_code_token.line,
19
+ column: token.next_code_token.column,
20
+ token: right_side_value,
21
+ cwe: 'CWE-321'
22
+ }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ require 'puppet-lint-infrasecure'
2
+
3
+ PuppetLint.new_check(:hardcoded_secret_password) do
4
+ def check
5
+ # list of known credentials - not considered secrets by the community (https://puppet.com/docs/pe/2019.8/what_gets_installed_and_where.html#user_and_group_accounts_installed)
6
+ user_default = ['pe-puppet', 'pe-webserver', 'pe-puppetdb', 'pe-postgres', 'pe-console-services', 'pe-orchestration-services','pe-ace-server', 'pe-bolt-server']
7
+ # some were advised by puppet specialists
8
+ invalid_values = ['undefined', 'unset', 'www-data', 'wwwrun', 'www', 'no', 'yes', '[]', 'undef', 'true', 'false', 'changeit', 'changeme', 'root', 'admin', 'none']
9
+
10
+ tokens.each do |token|
11
+ next if token.next_code_token.nil?
12
+ next if token.prev_code_token.nil?
13
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) !(<STRING>|<SSTRING>)
14
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and [:STRING, :SSTRING].include? token.next_code_token.type
15
+ left_side_value = token.prev_code_token.value.downcase
16
+ right_side_value = token.next_code_token.value.downcase
17
+
18
+ if left_side_value =~ Rules.password and !(left_side_value =~ Rules.nonsecret)
19
+
20
+ if !(right_side_value =~ Rules.placeholder) and right_side_value.length > 1 and !right_side_value[/\/.*(\/)+/] and !(user_default.include? right_side_value) and !(invalid_values.include? right_side_value)
21
+ notify :warning, {
22
+ message: "[SECURITY][CWE-259] Hard Coded Password (line=#{token.next_code_token.line}, col=#{token.next_code_token.column}) | Do not keep secrets on your scripts as for $#{token.prev_code_token.value} = #{token.next_code_token.value} in line #{token.next_code_token.line}. Store secrets in a vault instead.",
23
+ line: token.next_code_token.line,
24
+ column: token.next_code_token.column,
25
+ token: token.next_code_token.value,
26
+ cwe: 'CWE-259'
27
+ }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -5,25 +5,27 @@ PuppetLint.new_check(:hardcoded_secret) do
5
5
  # list of known credentials - not considered secrets by the community (https://puppet.com/docs/pe/2019.8/what_gets_installed_and_where.html#user_and_group_accounts_installed)
6
6
  user_default = ['pe-puppet', 'pe-webserver', 'pe-puppetdb', 'pe-postgres', 'pe-console-services', 'pe-orchestration-services','pe-ace-server', 'pe-bolt-server']
7
7
  # some were advised by puppet specialists
8
- invalid_values = ['undefined', 'unset', 'www-data', 'wwwrun', 'www', 'no', 'yes', '[]', 'root']
9
- ftokens = filter_tokens(tokens)
10
- ftokens.each do |token|
8
+ invalid_values = ['undefined', 'unset', 'www-data', 'wwwrun', 'www', 'no', 'yes', '[]', 'undef', 'true', 'false', 'changeit', 'changeme', 'root', 'admin', 'none']
9
+
10
+ tokens.each do |token|
11
11
  next if token.next_code_token.nil?
12
- token_value = token.value.downcase
13
- token_type = token.type
14
- next_token = token.next_code_token
15
- # accepts <VARIABLE> <EQUALS> secret OR <NAME> <FARROW> secret, checks if <VARIABLE> | <NAME> satisfy SECRETS but not satisfy NON_SECRETS
16
- if [:VARIABLE, :NAME].include? token_type and [:EQUALS, :FARROW].include? next_token.type and token_value =~ Rules.secret and !(token_value =~ Rules.nonsecret)
17
- right_side_type = next_token.next_code_token.type
18
- right_side_value = next_token.next_code_token.value.downcase
19
- if [:STRING, :SSTRING].include? right_side_type and right_side_value.length > 1 and !invalid_values.include? right_side_value and !(right_side_value =~ /::|\/|\.|\\/ ) and !user_default.include? right_side_value
20
- notify :warning, {
21
- message: "[SECURITY] Hard Coded Secret (line=#{next_token.next_code_token.line}, col=#{next_token.next_code_token.column}) | Do not keep secrets on your scripts as for $#{token_value} = #{right_side_value} in #{next_token.next_code_token.line}. Use kms/heira/vault instead.",
22
- line: next_token.next_code_token.line,
23
- column: next_token.next_code_token.column,
24
- token: right_side_value,
25
- cwe: 'CWE-798'
26
- }
12
+ next if token.prev_code_token.nil?
13
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) !(<STRING>|<SSTRING>)
14
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and [:STRING, :SSTRING].include? token.next_code_token.type
15
+ left_side_value = token.prev_code_token.value.downcase
16
+ right_side_value = token.next_code_token.value.downcase
17
+
18
+ if left_side_value =~ Rules.secret and !(left_side_value =~ Rules.nonsecret)
19
+
20
+ if !(right_side_value =~ Rules.placeholder) and right_side_value.length > 1 and !right_side_value[/\/.*(\/)+/] and !(user_default.include? right_side_value) and !(invalid_values.include? right_side_value)
21
+ notify :warning, {
22
+ message: "[SECURITY][CWE-798] Hard Coded Secret (line=#{token.next_code_token.line}, col=#{token.next_code_token.column}) | Do not keep secrets on your scripts as for $#{token.prev_code_token.value} = #{token.next_code_token.value} in line #{token.next_code_token.line}. Store secrets in a vault instead.",
23
+ line: token.next_code_token.line,
24
+ column: token.next_code_token.column,
25
+ token: right_side_value,
26
+ cwe: 'CWE-798'
27
+ }
28
+ end
27
29
  end
28
30
  end
29
31
  end
@@ -0,0 +1,31 @@
1
+ require 'puppet-lint-infrasecure'
2
+
3
+ PuppetLint.new_check(:hardcoded_secret_username) do
4
+ def check
5
+ # list of known credentials - not considered secrets by the community (https://puppet.com/docs/pe/2019.8/what_gets_installed_and_where.html#user_and_group_accounts_installed)
6
+ user_default = ['pe-puppet', 'pe-webserver', 'pe-puppetdb', 'pe-postgres', 'pe-console-services', 'pe-orchestration-services','pe-ace-server', 'pe-bolt-server']
7
+ # some were advised by puppet specialists
8
+ invalid_values = ['undefined', 'unset', 'www-data', 'wwwrun', 'www', 'no', 'yes', '[]', 'undef', 'true', 'false', 'changeit', 'changeme', 'root', 'admin', 'none']
9
+
10
+ tokens.each do |token|
11
+ next if token.next_code_token.nil?
12
+ next if token.prev_code_token.nil?
13
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) !(<STRING>|<SSTRING>)
14
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and [:STRING, :SSTRING].include? token.next_code_token.type
15
+ left_side_value = token.prev_code_token.value.downcase
16
+ right_side_value = token.next_code_token.value.downcase
17
+ if left_side_value =~ Rules.username and !(left_side_value =~ Rules.nonsecret)
18
+ if !(right_side_value =~ Rules.placeholder) and right_side_value.length > 1 and !right_side_value[/\/.*(\/)+/] and !(user_default.include? right_side_value) and !(invalid_values.include? right_side_value)
19
+ notify :warning, {
20
+ message: "[SECURITY][CWE-798] Hard Coded Username (line=#{token.next_code_token.line}, col=#{token.next_code_token.column}) | Do not keep secrets on your scripts as for $#{token.prev_code_token.value} = #{token.next_code_token.value} in line #{token.next_code_token.line}. Store secrets in a vault instead.",
21
+ line: token.next_code_token.line,
22
+ column: token.next_code_token.column,
23
+ token: right_side_value,
24
+ cwe: 'CWE-798'
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -2,20 +2,21 @@ require 'puppet-lint-infrasecure'
2
2
 
3
3
  PuppetLint.new_check(:invalid_ip_addr_binding) do
4
4
  def check
5
- ftokens = get_tokens(tokens,"0.0.0.0")
6
- ftokens.each do |token|
7
- token_value = token.value.downcase
8
- if [:EQUALS, :FARROW].include? token.prev_code_token.type
9
- prev_token = token.prev_code_token
10
- left_side = prev_token.prev_code_token
11
- if token_value =~ Rules.ip_addr_bind and [:VARIABLE, :NAME].include? left_side.type
5
+ tokens.each do |token|
6
+ next if token.next_code_token.nil?
7
+ next if token.prev_code_token.nil?
8
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) (<STRING>|<SSTRING>)
9
+ if [:VARIABLE, :NAME].include? token.prev_code_token.type and [:EQUALS, :FARROW].include? token.type and [:STRING, :SSTRING].include? token.next_code_token.type
10
+ left_side_value = token.prev_code_token.value.downcase
11
+ right_side_value = token.next_code_token.value.downcase
12
+ if right_side_value =~ Rules.ip_addr_bind
12
13
  notify :warning, {
13
- message: "[SECURITY] Invalid IP Address Binding (line=#{token.line}, col=#{token.column}) | Don\'t bind your host to #{token_value}. This config allows connections from every possible network. Restrict your available IPs.",
14
- line: token.line,
15
- column: token.column,
16
- token: token_value,
14
+ message: "[SECURITY][CWE-284] Invalid IP Address Binding (line=#{token.next_code_token.line}, col=#{token.next_code_token.column}) | Don\'t bind your host to #{token.next_code_token.value}. This config allows connections from every possible network. Restrict your available IPs.",
15
+ line: token.next_code_token.line,
16
+ column: token.next_code_token.column,
17
+ token: token.next_code_token.value,
17
18
  cwe: 'CWE-284'
18
- }
19
+ }
19
20
  end
20
21
  end
21
22
  end
@@ -12,11 +12,11 @@ PuppetLint.new_check(:malicious_dependency) do
12
12
  cves = get_malicious_cves(dependency, version)
13
13
  if !cves.nil?
14
14
  notify :warning, {
15
- message: "[SECURITY] Malicious Dependency (line=#{token[:token].line}, col=#{token[:token].column}) | This software is using a third-party library/software (#{dependency} v#{version}) affected by known CVEs (#{cves.join(', ')}).",
15
+ message: "[SECURITY][CWE-829] Malicious Dependency (line=#{token[:token].line}, col=#{token[:token].column}) | This software is using a third-party library/software (#{dependency} v#{version}) affected by known CVEs (#{cves.join(', ')}).",
16
16
  line: token[:token].line,
17
17
  column: token[:token].column,
18
18
  token: token[:token].prev_code_token.value.downcase,
19
- cwe: "CWE-829"
19
+ cwe: 'CWE-829'
20
20
  }
21
21
  end
22
22
  end
@@ -5,9 +5,9 @@ PuppetLint.new_check(:suspicious_comment) do
5
5
  ftokens = get_comments(tokens)
6
6
  ftokens.each do |token|
7
7
  token_value = token.value.downcase
8
- if (token_value =~ Rules.susp_comment)
8
+ if ([:COMMENT, :MLCOMMENT, :SLASH_COMMENT].include? token.type) and (token_value =~ Rules.susp_comment)
9
9
  notify :warning, {
10
- message: "[SECURITY] Suspicious Comment (line=#{token.line}, col=#{token.column}) | Avoid doing comments containing info about a defect, missing functionality or weakness of the system.",
10
+ message: "[SECURITY][CWE-546] Suspicious Comment (line=#{token.line}, col=#{token.column}) | Avoid doing comments containing info about a defect, missing functionality or weakness of the system.",
11
11
  line: token.line,
12
12
  column: token.column,
13
13
  token: token_value,
@@ -2,25 +2,27 @@ require 'puppet-lint-infrasecure'
2
2
 
3
3
  PuppetLint.new_check(:use_http_without_tls) do
4
4
  def check
5
- resources = ['apt::source', '::apt::source', 'wget::fetch', 'yumrepo', 'yum::', 'aptly::mirror', 'util::system_package', 'yum::managed_yumrepo']
6
- ptokens = filter_resources(tokens, resources)
7
- keywords = ['backport', 'key', 'download', 'uri', 'mirror']
8
- ctokens = filter_variables(ptokens, keywords)
9
5
  if Config.regex.whitelist
10
- wtokens = filter_whitelist(ctokens)
6
+ wtokens = filter_whitelist(tokens)
11
7
  else
12
- wtokens = ptokens
8
+ wtokens = tokens
13
9
  end
14
10
  wtokens.each do |token|
15
- token_value = token.value.downcase
16
- if (token_value =~ Rules.http)
17
- notify :warning, {
18
- message: "[SECURITY] HTTP without TLS (line=#{token.line}, col=#{token.column}) | Do not use HTTP without TLS as in #{token_value}. This may cause a MITM attack.",
11
+ next if token.next_code_token.nil?
12
+ next if token.prev_code_token.nil?
13
+ # accepts (<VARIABLE>|<NAME>) (<EQUALS>|<FARROW>) (<STRING>|<SSTRING>)
14
+ if [:EQUALS, :FARROW].include? token.prev_code_token.type and [:STRING, :SSTRING].include? token.type
15
+ right_side_value = token.value.downcase
16
+
17
+ if (right_side_value =~ Rules.http)
18
+ notify :warning, {
19
+ message: "[SECURITY][CWE-319] HTTP without TLS (line=#{token.line}, col=#{token.column}) | Do not use HTTP without TLS as in #{token.value}. This may cause a MITM attack.",
19
20
  line: token.line,
20
21
  column: token.column,
21
- token: token_value,
22
+ token: token.value,
22
23
  cwe: 'CWE-319'
23
- }
24
+ }
25
+ end
24
26
  end
25
27
  end
26
28
  end
@@ -9,12 +9,12 @@ PuppetLint.new_check(:use_of_weak_crypto_algorithm) do
9
9
  end
10
10
  if (token_value =~ Rules.poor_crypto) && (next_token_type.eql? :LPAREN)
11
11
  notify :warning, {
12
- message: "[SECURITY] Weak Crypto Algorithm (line=#{token.line}, col=#{token.column}) | Do not use #{token_value}, as they have security weakness. Use SHA-512 instead.",
12
+ message: "[SECURITY][CWE-326] Weak Crypto Algorithm (line=#{token.line}, col=#{token.column}) | Do not use #{token_value}, as they have security weakness. Use SHA-512 instead.",
13
13
  line: token.line,
14
14
  column: token.column,
15
15
  token: token_value,
16
16
  cwe: 'CWE-326'
17
- }
17
+ }
18
18
  end
19
19
  end
20
20
  end
@@ -10,15 +10,17 @@ PuppetLint.new_check(:weak_password) do
10
10
  next if token.prev_code_token.nil? or token.next_code_token.nil?
11
11
  if [:EQUALS, :FARROW].include? token_type and [:VARIABLE,:NAME].include? token.prev_code_token.type
12
12
  left_side_value = token.prev_code_token.value.downcase
13
- right_side_value = token.next_code_token.value.downcase
13
+ right_side_value = token.next_code_token.value
14
14
  right_side_token = token.next_code_token
15
- if left_side_value =~ Rules.password and checker.is_weak?(right_side_value) and right_side_value != '' and token.next_code_token.type == :SSTRING
15
+ if left_side_value =~ Rules.password and checker.is_weak?(right_side_value) and right_side_value.length > 1 and [:SSTRING, :STRING].include? token.next_code_token.type
16
+ pwd_entropy = checker.calculate_entropy(right_side_value)
16
17
  notify :warning, {
17
- message: "[SECURITY] Weak Password (line=#{right_side_token.line}, col=#{right_side_token.column}) | Passwords should be strong to be hard to uncover by hackers (weak_password=#{right_side_value}). In any case, you should use kms/heira/vault to store secrets instead.",
18
+ message: "[SECURITY][CWE-521] Weak Password (line=#{right_side_token.line}, col=#{right_side_token.column}) | Passwords should be strong to be hard to uncover by hackers (weak_password=#{right_side_value}, entropy=#{pwd_entropy}). Recommendation is to use a password with at least 18 bits of entropy. In any case, secrets should be stored in services like kms/heira/vault not in plain text.",
18
19
  line: right_side_token.line,
19
20
  column: right_side_token.column,
20
21
  token: right_side_value,
21
- cwe: 'CWE-521'
22
+ cwe: 'CWE-521',
23
+ entropy: pwd_entropy
22
24
  }
23
25
  end
24
26
  end
@@ -0,0 +1,21 @@
1
+ user-default:
2
+ - pe-puppetpe-webserver
3
+ - pe-puppetdb
4
+ - pe-postgres
5
+ - pe-console-services
6
+ - pe-orchestration-services
7
+ - pe-ace-server
8
+ - pe-bolt-server
9
+
10
+ invalid-values:
11
+ - undefined
12
+ - unset
13
+ - www-data
14
+ - wwwrun
15
+ - www
16
+ - no
17
+ - yes
18
+ - []
19
+ - undef
20
+ - true
21
+ - false
@@ -17,22 +17,39 @@ module Rules
17
17
  @password ||= /pass(word|_|$)|pwd/
18
18
  end
19
19
 
20
- def self.credentials
21
- @credentials ||= /user|usr|pass(word|_|$)|pwd/
20
+ def self.secret
21
+ @secret ||= /user|usr|pass(word|_|$)|pwd|(pvt|priv)+.*(cert|key|rsa|secret|ssl)+/
22
22
  end
23
23
 
24
- def self.cyrillic
25
- @cyrillic ||= /^(http(s)?:\/\/)?.*\p{Cyrillic}+/
24
+ def self.key
25
+ @key ||= /(cert|key|rsa|secret|ssl)+/
26
26
  end
27
27
 
28
- def self.secret
29
- @secret ||= /user|usr|pass(word|_|$)|pwd|key|secret/
28
+ def self.privkey
29
+ @key ||= /(pvt|priv)+.*(cert|key|rsa|secret|ssl)+/
30
+ end
31
+
32
+
33
+ def self.username
34
+ @username ||= /user|usr/
30
35
  end
31
36
 
32
37
  def self.nonsecret
33
38
  @nonsecret ||= /gpg|path|type|buff|zone|mode|tag|header|scheme|length|guid/
34
39
  end
35
40
 
41
+ def self.credentials
42
+ @credentials ||= /user|usr|pass(word|_|$)|pwd/
43
+ end
44
+
45
+ def self.placeholder
46
+ @placeholder ||= /\${.*}|(\$)?.*::.*(::)?/
47
+ end
48
+
49
+ def self.cyrillic
50
+ @cyrillic ||= /^(http(s)?:\/\/)?.*\p{Cyrillic}+/
51
+ end
52
+
36
53
  def self.ip_addr_bind
37
54
  @ip_addr_bind ||= /^((http(s)?:\/\/)?0.0.0.0(:\d{1,5})?)$/
38
55
  end
@@ -1,3 +1,3 @@
1
1
  class InfraSecure
2
- VERSION = '1.1.0'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'admin_by_default' do
4
- let(:msg) { '[SECURITY] Admin by default (line=6, col=24) | Do not make user/password as admin as for $user in line 6. This can be easily exploited.' }
4
+ let(:msg) { '[SECURITY][CWE-250] Admin by default (line=6, col=22) | Do not make user as admin as for $user in line 6. This can be easily exploited.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'user configuration as admin' do
@@ -11,7 +11,7 @@ describe 'admin_by_default' do
11
11
  $auth_server = '127.0.0.1',
12
12
  $tenant = 'openstack',
13
13
  $user = 'admin'
14
-
14
+ $admin_user = 'admin',
15
15
  ) {
16
16
  include swift::deps
17
17
 
@@ -27,7 +27,7 @@ describe 'admin_by_default' do
27
27
  end
28
28
 
29
29
  it 'should create a warning for svnwc user config' do
30
- expect(problems).to contain_warning(msg).on_line(6).in_column(24)
30
+ expect(problems).to contain_warning(msg).on_line(6).in_column(22)
31
31
  end
32
32
  end
33
33
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'cyrillic_homograph_attack' do
4
- let(:msg) {'[SECURITY] Homograph Attack (line=2, col=35). This link (https://www.аpple.com/phish) has a cyrillic char. These are not rendered by browsers and are sometimes used for phishing attacks.' }
4
+ let(:msg) {'[SECURITY][CWE-1007] Homograph Attack (line=2, col=35). This link (https://www.аpple.com/phish) has a cyrillic char. These chars are not rendered by browsers and are sometimes used for phishing attacks. It can also result in typosquatting attacks.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'homograph attack using cyrillic chars not rendered by normal browsers' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'empty_password' do
4
- let(:msg) { '[SECURITY] Empty Password (line=12, col=32) | Do not keep the password field empty as for $password in line 12. Use kms/heira/vault instead.' }
4
+ let(:msg) { '[SECURITY][CWE-258] Empty Password (line=12, col=32) | Do not keep the password field empty as for $password in line 12. Use a stronger password.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'code configuration using empty passwords' do
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'hardcoded_secret_key' do
4
+ let(:msg) { '[SECURITY][CWE-321] Hard Coded Key (line=19, col=28) | Do not keep secrets on your scripts as for $private_ssl_key = D868325 in line 19. Store secrets in a vault instead.' }
5
+
6
+ context 'with fix disabled' do
7
+ context 'code contains hard coded usernames' do
8
+ let(:code) { "
9
+ class apmirror (
10
+ $uid = 508,
11
+ $gid = 508,
12
+ $group_present = 'present',
13
+ $groupname = 'apmirror',
14
+ $groups = [],
15
+ $service_ensure = 'running',
16
+ $cert = '/bin/bash',
17
+ $username_password = 'apmirror',
18
+ $packages = ['libwww-perl', 'libnet-dns-perl'],
19
+ ){
20
+ package { $packages:
21
+ ensure => present,
22
+ }
23
+
24
+ $cert_generation_class = '::puppet::puppetserver::generate_cert'
25
+
26
+ $private_ssl_key = 'D868325'
27
+ $pwd = $cert
28
+ $pwd = 'pe-puppet'
29
+
30
+ user { $username:
31
+ ensure => $user_present,
32
+ name => $username,
33
+ home => '/home/${username}',
34
+ shell => $shell,
35
+ uid => $uid,
36
+ gid => $groupname,
37
+ groups => $groups,
38
+ managehome => true,
39
+ require => [ Group[$groupname], Group[$apbackup::username] ],
40
+ }
41
+
42
+ }
43
+ " }
44
+
45
+ it 'should detect one problem' do
46
+ expect(problems).to have(1).problem
47
+ end
48
+
49
+ it 'should create a warning for username hard coded config' do
50
+ expect(problems).to contain_warning(msg).on_line(19).in_column(28)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'hardcoded_secret_password' do
4
+ let(:msg) { '[SECURITY][CWE-259] Hard Coded Password (line=10, col=36) | Do not keep secrets on your scripts as for $username_password = apmirror in line 10. Store secrets in a vault instead.' }
5
+
6
+ context 'with fix disabled' do
7
+ context 'code contains hard coded usernames' do
8
+ let(:code) { "
9
+ class apmirror (
10
+ $uid = 508,
11
+ $gid = 508,
12
+ $group_present = 'present',
13
+ $groupname = 'apmirror',
14
+ $groups = [],
15
+ $service_ensure = 'running',
16
+ $cert = '/bin/bash',
17
+ $username_password = 'apmirror',
18
+ $packages = ['libwww-perl', 'libnet-dns-perl'],
19
+ ){
20
+ package { $packages:
21
+ ensure => present,
22
+ }
23
+
24
+ $cert_generation_class = '::puppet::puppetserver::generate_cert'
25
+
26
+ $pwd = undef
27
+ $pwd = $cert
28
+ $pwd = 'pe-puppet'
29
+
30
+ user { $username:
31
+ ensure => $user_present,
32
+ name => $username,
33
+ home => '/home/${username}',
34
+ shell => $shell,
35
+ uid => $uid,
36
+ gid => $groupname,
37
+ groups => $groups,
38
+ managehome => true,
39
+ require => [ Group[$groupname], Group[$apbackup::username] ],
40
+ }
41
+
42
+ }
43
+ " }
44
+
45
+ it 'should detect one problem' do
46
+ expect(problems).to have(1).problem
47
+ end
48
+
49
+ it 'should create a warning for username hard coded config' do
50
+ expect(problems).to contain_warning(msg).on_line(10).in_column(36)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'hardcoded_secret' do
4
- let(:msg) { '[SECURITY] Hard Coded Secret (line=10, col=27) | Do not keep secrets on your scripts as for $username = apmirror in 10. Use kms/heira/vault instead.' }
4
+ let(:msg) { '[SECURITY][CWE-798] Hard Coded Secret (line=10, col=36) | Do not keep secrets on your scripts as for $username_password = apmirror in line 10. Store secrets in a vault instead.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'code contains hard coded usernames' do
@@ -13,8 +13,8 @@ describe 'hardcoded_secret' do
13
13
  $groupname = 'apmirror',
14
14
  $groups = [],
15
15
  $service_ensure = 'running',
16
- $shell = '/bin/bash',
17
- $username = 'apmirror',
16
+ $cert = '/bin/bash',
17
+ $username_password = 'apmirror',
18
18
  $packages = ['libwww-perl', 'libnet-dns-perl'],
19
19
  ){
20
20
  package { $packages:
@@ -23,7 +23,7 @@ describe 'hardcoded_secret' do
23
23
 
24
24
  $cert_generation_class = '::puppet::puppetserver::generate_cert'
25
25
 
26
- $pwd = 'unset'
26
+ $pwd = undef
27
27
  $pwd = $cert
28
28
  $pwd = 'pe-puppet'
29
29
 
@@ -38,6 +38,7 @@ describe 'hardcoded_secret' do
38
38
  managehome => true,
39
39
  require => [ Group[$groupname], Group[$apbackup::username] ],
40
40
  }
41
+
41
42
  }
42
43
  " }
43
44
 
@@ -46,7 +47,7 @@ describe 'hardcoded_secret' do
46
47
  end
47
48
 
48
49
  it 'should create a warning for username hard coded config' do
49
- expect(problems).to contain_warning(msg).on_line(10).in_column(27)
50
+ expect(problems).to contain_warning(msg).on_line(10).in_column(36)
50
51
  end
51
52
  end
52
53
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'hardcoded_secret_username' do
4
+ let(:msg) { '[SECURITY][CWE-798] Hard Coded Username (line=10, col=27) | Do not keep secrets on your scripts as for $username = apmirror in line 10. Store secrets in a vault instead.' }
5
+
6
+ context 'with fix disabled' do
7
+ context 'code contains hard coded usernames' do
8
+ let(:code) { "
9
+ class apmirror (
10
+ $uid = 508,
11
+ $gid = 508,
12
+ $group_present = 'present',
13
+ $groupname = 'apmirror',
14
+ $groups = [],
15
+ $service_ensure = 'running',
16
+ $cert = '/bin/bash',
17
+ $username = 'apmirror',
18
+ $packages = ['libwww-perl', 'libnet-dns-perl'],
19
+ ){
20
+ package { $packages:
21
+ ensure => present,
22
+ }
23
+
24
+ $cert_generation_class = '::puppet::puppetserver::generate_cert'
25
+
26
+ $private_ssl_key = 'D868325'
27
+ $pwd = $cert
28
+ $pwd = 'pe-puppet'
29
+
30
+ user { $username:
31
+ ensure => $user_present,
32
+ name => $username,
33
+ home => '/home/${username}',
34
+ shell => $shell,
35
+ uid => $uid,
36
+ gid => $groupname,
37
+ groups => $groups,
38
+ managehome => true,
39
+ require => [ Group[$groupname], Group[$apbackup::username] ],
40
+ }
41
+
42
+ }
43
+ " }
44
+
45
+ it 'should detect one problem' do
46
+ expect(problems).to have(1).problem
47
+ end
48
+
49
+ it 'should create a warning for username hard coded config' do
50
+ expect(problems).to contain_warning(msg).on_line(10).in_column(27)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'invalid_ip_addr_binding' do
4
- let(:msg) {'[SECURITY] Invalid IP Address Binding (line=4, col=30) | Don\'t bind your host to 0.0.0.0. This config allows connections from every possible network. Restrict your available IPs.' }
4
+ let(:msg) {'[SECURITY][CWE-284] Invalid IP Address Binding (line=4, col=30) | Don\'t bind your host to 0.0.0.0. This config allows connections from every possible network. Restrict your available IPs.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'invalid ip adress binding configuration' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'malicious_dependency' do
4
- let(:msg) {'[SECURITY] Malicious Dependency (line=10, col=40) | This software is using a third-party library/software (postgresql v9.4) affected by known CVEs (CVE-2017-12172, CVE-2017-15098, CVE-2017-7484, CVE-2017-7485, CVE-2017-7486, CVE-2017-7546, CVE-2017-7547, CVE-2017-7548, CVE-2016-0766, CVE-2016-0773, CVE-2016-5423, CVE-2016-5424).'}
4
+ let(:msg) {'[SECURITY][CWE-829] Malicious Dependency (line=10, col=40) | This software is using a third-party library/software (postgresql v9.4) affected by known CVEs (CVE-2017-12172, CVE-2017-15098, CVE-2017-7484, CVE-2017-7485, CVE-2017-7486, CVE-2017-7546, CVE-2017-7547, CVE-2017-7548, CVE-2016-0766, CVE-2016-0773, CVE-2016-5423, CVE-2016-5424).'}
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'software uses malicious dependencies' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'suspicious_comment' do
4
- let(:msg) { '[SECURITY] Suspicious Comment (line=8, col=9) | Avoid doing comments containing info about a defect, missing functionality or weakness of the system.' }
4
+ let(:msg) { '[SECURITY][CWE-546] Suspicious Comment (line=8, col=9) | Avoid doing comments containing info about a defect, missing functionality or weakness of the system.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'code with suspicious comment' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'use_http_without_tls' do
4
- let(:msg) { '[SECURITY] HTTP without TLS (line=2, col=23) | Do not use HTTP without TLS as in http://localhost:2021. This may cause a MITM attack.' }
4
+ let(:msg) { '[SECURITY][CWE-319] HTTP without TLS (line=2, col=23) | Do not use HTTP without TLS as in http://localhost:2021. This may cause a MITM attack.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'configuration using http' do
@@ -89,7 +89,7 @@ describe 'use_http_without_tls' do
89
89
  " }
90
90
 
91
91
  it 'should detect a single problem' do
92
- expect(problems).to have(1).problem
92
+ expect(problems).to have(13).problem
93
93
  end
94
94
 
95
95
  it 'should create a warning' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'use_of_weak_crypto_algorithm' do
4
- let(:msg) { '[SECURITY] Weak Crypto Algorithm (line=22, col=21) | Do not use sha1, as they have security weakness. Use SHA-512 instead.' }
4
+ let(:msg) { '[SECURITY][CWE-326] Weak Crypto Algorithm (line=22, col=21) | Do not use sha1, as they have security weakness. Use SHA-512 instead.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'code using unsecure algorithms' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'weak_password' do
4
- let(:msg) { '[SECURITY] Weak Password (line=9, col=20) | Passwords should be strong to be hard to uncover by hackers (weak_password=12345678). In any case, you should use kms/heira/vault to store secrets instead.' }
4
+ let(:msg) { '[SECURITY][CWE-521] Weak Password (line=9, col=20) | Passwords should be strong to be hard to uncover by hackers (weak_password=12345678, entropy=10). Recommendation is to use a password with at least 18 bits of entropy. In any case, secrets should be stored in services like kms/heira/vault not in plain text.' }
5
5
 
6
6
  context 'with fix disabled' do
7
7
  context 'code using weak password' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet-lint-infrasecure
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sofia Reis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-26 00:00:00.000000000 Z
11
+ date: 2022-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: puppet-lint
@@ -186,6 +186,7 @@ extra_rdoc_files: []
186
186
  files:
187
187
  - README.md
188
188
  - lib/puppet-lint-infrasecure.rb
189
+ - lib/puppet-lint-infrasecure/config/default.yml
189
190
  - lib/puppet-lint-infrasecure/config/dependencies.yml
190
191
  - lib/puppet-lint-infrasecure/config/whitelist
191
192
  - lib/puppet-lint-infrasecure/dependencies/activemq.json
@@ -228,7 +229,10 @@ files:
228
229
  - lib/puppet-lint/plugins/check_admin_by_default.rb
229
230
  - lib/puppet-lint/plugins/check_cyrillic_homograph_attack.rb
230
231
  - lib/puppet-lint/plugins/check_empty_password.rb
232
+ - lib/puppet-lint/plugins/check_hard_coded_key.rb
233
+ - lib/puppet-lint/plugins/check_hard_coded_password.rb
231
234
  - lib/puppet-lint/plugins/check_hard_coded_secret.rb
235
+ - lib/puppet-lint/plugins/check_hard_coded_username.rb
232
236
  - lib/puppet-lint/plugins/check_invalid_ip_addr_binding.rb
233
237
  - lib/puppet-lint/plugins/check_malicious_dependency.rb
234
238
  - lib/puppet-lint/plugins/check_suspicious_comment.rb
@@ -238,7 +242,10 @@ files:
238
242
  - spec/puppet-lint/plugins/check_admin_by_default_spec.rb
239
243
  - spec/puppet-lint/plugins/check_cyrillic_homograph_attack_spec.rb
240
244
  - spec/puppet-lint/plugins/check_empty_password_spec.rb
245
+ - spec/puppet-lint/plugins/check_hard_coded_key_spec.rb
246
+ - spec/puppet-lint/plugins/check_hard_coded_password_spec.rb
241
247
  - spec/puppet-lint/plugins/check_hard_coded_secret_spec.rb
248
+ - spec/puppet-lint/plugins/check_hard_coded_username_spec.rb
242
249
  - spec/puppet-lint/plugins/check_invalid_ip_addr_binding_spec.rb
243
250
  - spec/puppet-lint/plugins/check_malicious_dependency_spec.rb
244
251
  - spec/puppet-lint/plugins/check_suspicious_comment_spec.rb
@@ -274,7 +281,10 @@ test_files:
274
281
  - spec/puppet-lint/plugins/check_admin_by_default_spec.rb
275
282
  - spec/puppet-lint/plugins/check_cyrillic_homograph_attack_spec.rb
276
283
  - spec/puppet-lint/plugins/check_empty_password_spec.rb
284
+ - spec/puppet-lint/plugins/check_hard_coded_key_spec.rb
285
+ - spec/puppet-lint/plugins/check_hard_coded_password_spec.rb
277
286
  - spec/puppet-lint/plugins/check_hard_coded_secret_spec.rb
287
+ - spec/puppet-lint/plugins/check_hard_coded_username_spec.rb
278
288
  - spec/puppet-lint/plugins/check_invalid_ip_addr_binding_spec.rb
279
289
  - spec/puppet-lint/plugins/check_malicious_dependency_spec.rb
280
290
  - spec/puppet-lint/plugins/check_suspicious_comment_spec.rb