Skip to content

Commit d0b0461

Browse files
committed
import InsecureHashAlgorithm cop
1 parent 5a5e50f commit d0b0461

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# frozen_string_literal: true
2+
3+
require "rubocop"
4+
5+
module RuboCop
6+
module Cop
7+
module GitHub
8+
class InsecureHashAlgorithm < Cop
9+
MESSAGE = "This hash algorithm is old and insecure and should not be used. Please use SHA256 instead."
10+
11+
def_node_matcher :insecure_const?, "(const (const _ :Digest) #insecure_algorithm?)"
12+
def_node_matcher :insecure_call?, "(send (const _ {:Digest :HMAC}) _ (str #insecure_algorithm?) ...)"
13+
14+
def insecure_algorithm?(val)
15+
case val.to_s.downcase
16+
when "md5", "sha1"
17+
true
18+
else
19+
false
20+
end
21+
end
22+
23+
def on_const(const_node)
24+
if insecure_const?(const_node)
25+
add_offense(const_node, message: MESSAGE)
26+
end
27+
end
28+
29+
def on_send(send_node)
30+
if insecure_call?(send_node)
31+
add_offense(send_node, message: MESSAGE)
32+
end
33+
end
34+
end
35+
end
36+
end
37+
end

test/test_insecure_hash_algorithm.rb

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "./cop_test"
4+
require "minitest/autorun"
5+
require "rubocop/cop/github/insecure_hash_algorithm"
6+
7+
class TestInsecureHashAlgorithm < CopTest
8+
def cop_class
9+
RuboCop::Cop::GitHub::InsecureHashAlgorithm
10+
end
11+
12+
def test_kitchen_sink
13+
investigate(cop, <<-RUBY)
14+
class Something
15+
BAD_ALGO = Digest::MD5
16+
#^^^^^^^^^^^ #{message}
17+
GOOD_ALGO = Digest::SHA256
18+
OBAD_ALGO = OpenSSL::Digest::MD5
19+
#^^^^^^^^^^^^^^^^^^^^ #{message}
20+
BAD_SHA1_ALGO = Digest::SHA1
21+
#^^^^^^^^^^^^ #{message}
22+
OBAD_SHA1_ALGO = OpenSSL::Digest::SHA1
23+
#^^^^^^^^^^^^^^^^^^^^^ #{message}
24+
25+
def kitchen_sink_hash(str)
26+
BAD_ALGO.hexdigest(str) +
27+
GOOD_ALGO.hexdigest(str) +
28+
Digest::MD5.hexdigest(str) +
29+
#^^^^^^^^^^^ #{message}
30+
Digest::SHA1.hexdigest(str) +
31+
#^^^^^^^^^^^^ #{message}
32+
OpenSSL::Digest::MD5.hexdigest(str) +
33+
#^^^^^^^^^^^^^^^^^^^^ #{message}
34+
OpenSSL::Digest::SHA1.hexdigest(str)
35+
#^^^^^^^^^^^^^^^^^^^^^ #{message}
36+
OpenSSL::Digest.digest("MD5", str)
37+
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{message}
38+
OpenSSL::Digest.digest("SHA1", str)
39+
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{message}
40+
OpenSSL::Digest.hexdigest("Sha1", str)
41+
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{message}
42+
OpenSSL::Digest.digest("SHA256", str)
43+
OpenSSL::HMAC.hexdigest('md5', str)
44+
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{message}
45+
OpenSSL::HMAC.hexdigest('sha1', str)
46+
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{message}
47+
OpenSSL::HMAC.hexdigest('sha256', str)
48+
OpenSSL::Digest::Digest.new('md5')
49+
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{message}
50+
OpenSSL::Digest::Digest.new('sha1')
51+
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{message}
52+
OpenSSL::Digest::Digest.new('sha256')
53+
end
54+
end
55+
RUBY
56+
57+
assert_equal 15, cop.offenses.count
58+
assert_equal([cop_class::MESSAGE], cop.offenses.map(&:message).uniq)
59+
end
60+
end

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy