mihari 0.17.4 → 1.1.1

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +155 -0
  4. data/.travis.yml +7 -1
  5. data/Gemfile +2 -0
  6. data/README.md +41 -72
  7. data/config/pre_commit.yml +3 -0
  8. data/docker/Dockerfile +1 -1
  9. data/lib/mihari.rb +12 -8
  10. data/lib/mihari/alert_viewer.rb +16 -34
  11. data/lib/mihari/analyzers/base.rb +7 -19
  12. data/lib/mihari/analyzers/basic.rb +3 -1
  13. data/lib/mihari/analyzers/binaryedge.rb +3 -3
  14. data/lib/mihari/analyzers/censys.rb +2 -2
  15. data/lib/mihari/analyzers/circl.rb +2 -2
  16. data/lib/mihari/analyzers/onyphe.rb +3 -3
  17. data/lib/mihari/analyzers/passivetotal.rb +2 -2
  18. data/lib/mihari/analyzers/pulsedive.rb +2 -2
  19. data/lib/mihari/analyzers/securitytrails.rb +2 -2
  20. data/lib/mihari/analyzers/securitytrails_domain_feed.rb +2 -2
  21. data/lib/mihari/analyzers/shodan.rb +2 -2
  22. data/lib/mihari/analyzers/virustotal.rb +2 -2
  23. data/lib/mihari/analyzers/zoomeye.rb +2 -2
  24. data/lib/mihari/cli.rb +13 -4
  25. data/lib/mihari/config.rb +68 -2
  26. data/lib/mihari/configurable.rb +1 -1
  27. data/lib/mihari/database.rb +68 -0
  28. data/lib/mihari/emitters/base.rb +1 -1
  29. data/lib/mihari/emitters/database.rb +29 -0
  30. data/lib/mihari/emitters/misp.rb +8 -1
  31. data/lib/mihari/emitters/slack.rb +4 -2
  32. data/lib/mihari/emitters/stdout.rb +2 -1
  33. data/lib/mihari/emitters/the_hive.rb +28 -14
  34. data/lib/mihari/models/alert.rb +11 -0
  35. data/lib/mihari/models/artifact.rb +27 -0
  36. data/lib/mihari/models/tag.rb +10 -0
  37. data/lib/mihari/models/tagging.rb +10 -0
  38. data/lib/mihari/notifiers/slack.rb +7 -4
  39. data/lib/mihari/serializers/alert.rb +12 -0
  40. data/lib/mihari/serializers/artifact.rb +9 -0
  41. data/lib/mihari/serializers/tag.rb +9 -0
  42. data/lib/mihari/slack_monkeypatch.rb +16 -0
  43. data/lib/mihari/status.rb +1 -1
  44. data/lib/mihari/type_checker.rb +1 -1
  45. data/lib/mihari/version.rb +1 -1
  46. data/mihari.gemspec +13 -6
  47. metadata +140 -36
  48. data/lib/mihari/artifact.rb +0 -36
  49. data/lib/mihari/cache.rb +0 -35
  50. data/lib/mihari/the_hive.rb +0 -42
  51. data/lib/mihari/the_hive/alert.rb +0 -25
  52. data/lib/mihari/the_hive/artifact.rb +0 -33
  53. data/lib/mihari/the_hive/base.rb +0 -14
@@ -16,7 +16,7 @@ module Mihari
16
16
  end
17
17
 
18
18
  def run(**params)
19
- retry_on_error { emit(params) }
19
+ retry_on_error { emit(**params) }
20
20
  end
21
21
 
22
22
  def emit(*)
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mihari
4
+ module Emitters
5
+ class Database < Base
6
+ def valid?
7
+ true
8
+ end
9
+
10
+ def emit(title:, description:, artifacts:, source:, tags: [])
11
+ return if artifacts.empty?
12
+
13
+ tags = tags.map { |name| Tag.find_or_create_by(name: name) }.compact.uniq
14
+ taggings = tags.map { |tag| Tagging.new(tag_id: tag.id) }
15
+
16
+ alert = Alert.new(
17
+ title: title,
18
+ description: description,
19
+ artifacts: artifacts,
20
+ source: source,
21
+ taggings: taggings
22
+ )
23
+
24
+ alert.save
25
+ alert
26
+ end
27
+ end
28
+ end
29
+ end
@@ -6,6 +6,13 @@ require "net/ping"
6
6
  module Mihari
7
7
  module Emitters
8
8
  class MISP < Base
9
+ def initialize
10
+ ::MISP.configure do |config|
11
+ config.api_endpoint = Mihari.config.misp_api_endpoint
12
+ config.api_key = Mihari.config.misp_api_key
13
+ end
14
+ end
15
+
9
16
  # @return [true, false]
10
17
  def valid?
11
18
  api_endpoint? && api_key? && ping?
@@ -28,7 +35,7 @@ module Mihari
28
35
  private
29
36
 
30
37
  def config_keys
31
- %w(MISP_API_ENDPOINT MISP_API_KEY)
38
+ %w(misp_api_endpoint misp_api_key)
32
39
  end
33
40
 
34
41
  def build_attribute(artifact)
@@ -4,6 +4,8 @@ require "slack-notifier"
4
4
  require "digest/sha2"
5
5
  require "mem"
6
6
 
7
+ require "mihari/slack_monkeypatch"
8
+
7
9
  module Mihari
8
10
  module Emitters
9
11
  class Attachment
@@ -123,7 +125,7 @@ module Mihari
123
125
  ].join("\n")
124
126
  end
125
127
 
126
- def emit(title:, description:, artifacts:, tags: [])
128
+ def emit(title:, description:, artifacts:, tags: [], **_options)
127
129
  return if artifacts.empty?
128
130
 
129
131
  attachments = to_attachments(artifacts)
@@ -135,7 +137,7 @@ module Mihari
135
137
  private
136
138
 
137
139
  def config_keys
138
- %w(SLACK_WEBHOOK_URL)
140
+ %w(slack_webhook_url)
139
141
  end
140
142
  end
141
143
  end
@@ -9,11 +9,12 @@ module Mihari
9
9
  true
10
10
  end
11
11
 
12
- def emit(title:, description:, artifacts:, tags:)
12
+ def emit(title:, description:, artifacts:, source:, tags:)
13
13
  h = {
14
14
  title: title,
15
15
  description: description,
16
16
  artifacts: artifacts.map(&:data),
17
+ source: source,
17
18
  tags: tags
18
19
  }
19
20
  puts JSON.pretty_generate(h)
@@ -1,42 +1,56 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "hachi"
4
+ require "net/ping"
5
+
3
6
  module Mihari
4
7
  module Emitters
5
8
  class TheHive < Base
6
9
  # @return [true, false]
7
10
  def valid?
8
- the_hive.valid?
11
+ api_endpont? && api_key? && ping?
9
12
  end
10
13
 
11
- def emit(title:, description:, artifacts:, tags: [])
14
+ def emit(title:, description:, artifacts:, tags: [], **_options)
12
15
  return if artifacts.empty?
13
16
 
14
- the_hive.alert.create(
17
+ api.alert.create(
15
18
  title: title,
16
19
  description: description,
17
- artifacts: artifacts.map(&:to_h),
18
- tags: tags
20
+ artifacts: artifacts.map { |artifact| { data: artifact.data, data_type: artifact.data_type, message: description } },
21
+ tags: tags,
22
+ type: "external",
23
+ source: "mihari"
19
24
  )
20
-
21
- save_as_cache artifacts.map(&:data)
22
25
  end
23
26
 
24
27
  private
25
28
 
26
29
  def config_keys
27
- %w(THEHIVE_API_ENDPOINT THEHIVE_API_KEY)
30
+ %w(thehive_api_endpoint thehive_api_key)
28
31
  end
29
32
 
30
- def the_hive
31
- @the_hive ||= Mihari::TheHive.new
33
+ def api
34
+ @api ||= Hachi::API.new(api_endpoint: Mihari.config.thehive_api_endpoint, api_key: Mihari.config.thehive_api_key)
32
35
  end
33
36
 
34
- def cache
35
- @cache ||= Cache.new
37
+ # @return [true, false]
38
+ def api_endpont?
39
+ !Mihari.config.thehive_api_endpoint.nil?
36
40
  end
37
41
 
38
- def save_as_cache(data)
39
- cache.save data
42
+ # @return [true, false]
43
+ def api_key?
44
+ !Mihari.config.thehive_api_key.nil?
45
+ end
46
+
47
+ def ping?
48
+ base_url = Mihari.config.thehive_api_endpoint
49
+ base_url = base_url.end_with?("/") ? base_url[0..-2] : base_url
50
+ url = "#{base_url}/index.html"
51
+
52
+ http = Net::Ping::HTTP.new(url)
53
+ http.ping?
40
54
  end
41
55
  end
42
56
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ module Mihari
6
+ class Alert < ActiveRecord::Base
7
+ has_many :taggings, dependent: :destroy
8
+ has_many :artifacts, dependent: :destroy
9
+ has_many :tags, through: :taggings
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ class ArtifactValidator < ActiveModel::Validator
6
+ def validate(record)
7
+ return if record.data_type
8
+
9
+ record.errors[:data] << "#{record.data} is not supported"
10
+ end
11
+ end
12
+
13
+ module Mihari
14
+ class Artifact < ActiveRecord::Base
15
+ include ActiveModel::Validations
16
+ validates_with ArtifactValidator
17
+
18
+ def initialize(attributes)
19
+ super
20
+ self.data_type = TypeChecker.type(data)
21
+ end
22
+
23
+ def unique?
24
+ self.class.find_by(data: data).nil?
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ module Mihari
6
+ class Tag < ActiveRecord::Base
7
+ has_many :taggings, dependent: :destroy
8
+ has_many :tags, through: :taggings
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ module Mihari
6
+ class Tagging < ActiveRecord::Base
7
+ belongs_to :alert
8
+ belongs_to :tag
9
+ end
10
+ end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "slack-notifier"
4
+ require "mihari/slack_monkeypatch"
5
+
3
6
  module Mihari
4
7
  module Notifiers
5
8
  class Slack < Base
@@ -8,15 +11,15 @@ module Mihari
8
11
  DEFAULT_USERNAME = "mihari"
9
12
 
10
13
  def slack_channel
11
- ENV.fetch SLACK_CHANNEL_KEY, "#general"
14
+ Mihari.config.slack_channel || "#general"
12
15
  end
13
16
 
14
17
  def slack_webhook_url
15
- ENV.fetch SLACK_WEBHOOK_URL_KEY
18
+ Mihari.config.slack_webhook_url
16
19
  end
17
20
 
18
21
  def slack_webhook_url?
19
- ENV.key? SLACK_WEBHOOK_URL_KEY
22
+ !Mihari.config.slack_webhook_url.nil?
20
23
  end
21
24
 
22
25
  def valid?
@@ -25,7 +28,7 @@ module Mihari
25
28
 
26
29
  def notify(text:, attachments: [], mrkdwn: true)
27
30
  notifier = ::Slack::Notifier.new(slack_webhook_url, channel: slack_channel, username: DEFAULT_USERNAME)
28
- notifier.post(text: text, attachments: attachments, mrkdwn: true)
31
+ notifier.post(text: text, attachments: attachments, mrkdwn: mrkdwn)
29
32
  end
30
33
  end
31
34
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_model_serializers"
4
+
5
+ module Mihari
6
+ class AlertSerializer < ActiveModel::Serializer
7
+ attributes :title, :description, :source, :created_at
8
+
9
+ has_many :artifacts
10
+ has_many :tags, through: :taggings
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_model_serializers"
4
+
5
+ module Mihari
6
+ class ArtifactSerializer < ActiveModel::Serializer
7
+ attributes :data, :data_type
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_model_serializers"
4
+
5
+ module Mihari
6
+ class TagSerializer < ActiveModel::Serializer
7
+ attributes :name
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Slack
4
+ class Notifier
5
+ module Util
6
+ class LinkFormatter
7
+ class << self
8
+ def format(string, opts = {})
9
+ # Resolve warning in Ruby 2.7
10
+ LinkFormatter.new(string, **opts).formatted
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -4,7 +4,7 @@ module Mihari
4
4
  class Status
5
5
  def check
6
6
  statuses.map do |key, value|
7
- [key, convert(value)]
7
+ [key, convert(**value)]
8
8
  end.to_h
9
9
  end
10
10
 
@@ -44,7 +44,7 @@ module Mihari
44
44
 
45
45
  # @return [true, false]
46
46
  def mail?
47
- EmailAddress.valid? data
47
+ EmailAddress.valid? data, host_validation: :syntax
48
48
  end
49
49
 
50
50
  # @return [String, nil]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mihari
4
- VERSION = "0.17.4"
4
+ VERSION = "1.1.1"
5
5
  end
@@ -26,35 +26,42 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  spec.add_development_dependency "bundler", "~> 2.1"
28
28
  spec.add_development_dependency "coveralls", "~> 0.8"
29
- spec.add_development_dependency "fakefs", "~> 1.0"
29
+ spec.add_development_dependency "execjs", "~> 2.7"
30
+ spec.add_development_dependency "fakefs", "~> 1.2"
31
+ spec.add_development_dependency "pre-commit", "~> 0.39"
30
32
  spec.add_development_dependency "rake", "~> 13.0"
31
33
  spec.add_development_dependency "rspec", "~> 3.9"
34
+ spec.add_development_dependency "rubocop", "~> 0.88"
35
+ spec.add_development_dependency "rubocop-performance", "~> 1.7"
32
36
  spec.add_development_dependency "timecop", "~> 0.9"
33
- spec.add_development_dependency "vcr", "~> 5.0"
34
- spec.add_development_dependency "webmock", "~> 3.7"
37
+ spec.add_development_dependency "vcr", "~> 6.0"
38
+ spec.add_development_dependency "webmock", "~> 3.8"
35
39
 
40
+ spec.add_dependency "active_model_serializers", "~> 0.10"
41
+ spec.add_dependency "activerecord", "~> 6.0"
36
42
  spec.add_dependency "addressable", "~> 2.7"
37
43
  spec.add_dependency "binaryedge", "~> 0.1"
38
44
  spec.add_dependency "censu", "~> 0.2"
39
- spec.add_dependency "crtsh-rb", "~> 0.2"
45
+ spec.add_dependency "crtsh-rb", "~> 0.3"
40
46
  spec.add_dependency "dnpedia", "~> 0.1"
41
47
  spec.add_dependency "dnstwister", "~> 0.1"
42
48
  spec.add_dependency "email_address", "~> 0.1"
43
49
  spec.add_dependency "hachi", "~> 0.3"
44
- spec.add_dependency "lightly", "~> 0.3"
45
50
  spec.add_dependency "mem", "~> 0.1"
46
51
  spec.add_dependency "misp", "~> 0.1"
47
52
  spec.add_dependency "murmurhash3", "~> 0.1"
48
53
  spec.add_dependency "net-ping", "~> 2.0"
49
- spec.add_dependency "onyphe", "~> 1.1"
54
+ spec.add_dependency "onyphe", "~> 2.0"
50
55
  spec.add_dependency "parallel", "~> 1.19"
51
56
  spec.add_dependency "passive_circl", "~> 0.1"
52
57
  spec.add_dependency "passivetotalx", "~> 0.1"
58
+ spec.add_dependency "pg", "~> 1.2"
53
59
  spec.add_dependency "public_suffix", "~> 4.0"
54
60
  spec.add_dependency "pulsedive", "~> 0.1"
55
61
  spec.add_dependency "securitytrails", "~> 1.0"
56
62
  spec.add_dependency "shodanx", "~> 0.2"
57
63
  spec.add_dependency "slack-notifier", "~> 2.3"
64
+ spec.add_dependency "sqlite3", "~> 1.4"
58
65
  spec.add_dependency "thor", "~> 1.0"
59
66
  spec.add_dependency "urlscan", "~> 0.5"
60
67
  spec.add_dependency "virustotalx", "~> 1.1"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mihari
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.4
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-13 00:00:00.000000000 Z
11
+ date: 2020-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,20 +38,48 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: execjs
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.7'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: fakefs
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '1.0'
61
+ version: '1.2'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '1.0'
68
+ version: '1.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pre-commit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.39'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.39'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rake
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +108,34 @@ dependencies:
80
108
  - - "~>"
81
109
  - !ruby/object:Gem::Version
82
110
  version: '3.9'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.88'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.88'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-performance
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.7'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.7'
83
139
  - !ruby/object:Gem::Dependency
84
140
  name: timecop
85
141
  requirement: !ruby/object:Gem::Requirement
@@ -100,28 +156,56 @@ dependencies:
100
156
  requirements:
101
157
  - - "~>"
102
158
  - !ruby/object:Gem::Version
103
- version: '5.0'
159
+ version: '6.0'
104
160
  type: :development
105
161
  prerelease: false
106
162
  version_requirements: !ruby/object:Gem::Requirement
107
163
  requirements:
108
164
  - - "~>"
109
165
  - !ruby/object:Gem::Version
110
- version: '5.0'
166
+ version: '6.0'
111
167
  - !ruby/object:Gem::Dependency
112
168
  name: webmock
113
169
  requirement: !ruby/object:Gem::Requirement
114
170
  requirements:
115
171
  - - "~>"
116
172
  - !ruby/object:Gem::Version
117
- version: '3.7'
173
+ version: '3.8'
118
174
  type: :development
119
175
  prerelease: false
120
176
  version_requirements: !ruby/object:Gem::Requirement
121
177
  requirements:
122
178
  - - "~>"
123
179
  - !ruby/object:Gem::Version
124
- version: '3.7'
180
+ version: '3.8'
181
+ - !ruby/object:Gem::Dependency
182
+ name: active_model_serializers
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '0.10'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '0.10'
195
+ - !ruby/object:Gem::Dependency
196
+ name: activerecord
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '6.0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '6.0'
125
209
  - !ruby/object:Gem::Dependency
126
210
  name: addressable
127
211
  requirement: !ruby/object:Gem::Requirement
@@ -170,14 +254,14 @@ dependencies:
170
254
  requirements:
171
255
  - - "~>"
172
256
  - !ruby/object:Gem::Version
173
- version: '0.2'
257
+ version: '0.3'
174
258
  type: :runtime
175
259
  prerelease: false
176
260
  version_requirements: !ruby/object:Gem::Requirement
177
261
  requirements:
178
262
  - - "~>"
179
263
  - !ruby/object:Gem::Version
180
- version: '0.2'
264
+ version: '0.3'
181
265
  - !ruby/object:Gem::Dependency
182
266
  name: dnpedia
183
267
  requirement: !ruby/object:Gem::Requirement
@@ -234,20 +318,6 @@ dependencies:
234
318
  - - "~>"
235
319
  - !ruby/object:Gem::Version
236
320
  version: '0.3'
237
- - !ruby/object:Gem::Dependency
238
- name: lightly
239
- requirement: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - "~>"
242
- - !ruby/object:Gem::Version
243
- version: '0.3'
244
- type: :runtime
245
- prerelease: false
246
- version_requirements: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - "~>"
249
- - !ruby/object:Gem::Version
250
- version: '0.3'
251
321
  - !ruby/object:Gem::Dependency
252
322
  name: mem
253
323
  requirement: !ruby/object:Gem::Requirement
@@ -310,14 +380,14 @@ dependencies:
310
380
  requirements:
311
381
  - - "~>"
312
382
  - !ruby/object:Gem::Version
313
- version: '1.1'
383
+ version: '2.0'
314
384
  type: :runtime
315
385
  prerelease: false
316
386
  version_requirements: !ruby/object:Gem::Requirement
317
387
  requirements:
318
388
  - - "~>"
319
389
  - !ruby/object:Gem::Version
320
- version: '1.1'
390
+ version: '2.0'
321
391
  - !ruby/object:Gem::Dependency
322
392
  name: parallel
323
393
  requirement: !ruby/object:Gem::Requirement
@@ -360,6 +430,20 @@ dependencies:
360
430
  - - "~>"
361
431
  - !ruby/object:Gem::Version
362
432
  version: '0.1'
433
+ - !ruby/object:Gem::Dependency
434
+ name: pg
435
+ requirement: !ruby/object:Gem::Requirement
436
+ requirements:
437
+ - - "~>"
438
+ - !ruby/object:Gem::Version
439
+ version: '1.2'
440
+ type: :runtime
441
+ prerelease: false
442
+ version_requirements: !ruby/object:Gem::Requirement
443
+ requirements:
444
+ - - "~>"
445
+ - !ruby/object:Gem::Version
446
+ version: '1.2'
363
447
  - !ruby/object:Gem::Dependency
364
448
  name: public_suffix
365
449
  requirement: !ruby/object:Gem::Requirement
@@ -430,6 +514,20 @@ dependencies:
430
514
  - - "~>"
431
515
  - !ruby/object:Gem::Version
432
516
  version: '2.3'
517
+ - !ruby/object:Gem::Dependency
518
+ name: sqlite3
519
+ requirement: !ruby/object:Gem::Requirement
520
+ requirements:
521
+ - - "~>"
522
+ - !ruby/object:Gem::Version
523
+ version: '1.4'
524
+ type: :runtime
525
+ prerelease: false
526
+ version_requirements: !ruby/object:Gem::Requirement
527
+ requirements:
528
+ - - "~>"
529
+ - !ruby/object:Gem::Version
530
+ version: '1.4'
433
531
  - !ruby/object:Gem::Dependency
434
532
  name: thor
435
533
  requirement: !ruby/object:Gem::Requirement
@@ -496,6 +594,7 @@ extra_rdoc_files: []
496
594
  files:
497
595
  - ".gitignore"
498
596
  - ".rspec"
597
+ - ".rubocop.yml"
499
598
  - ".travis.yml"
500
599
  - Gemfile
501
600
  - LICENSE
@@ -503,6 +602,7 @@ files:
503
602
  - Rakefile
504
603
  - bin/console
505
604
  - bin/setup
605
+ - config/pre_commit.yml
506
606
  - docker/Dockerfile
507
607
  - examples/ipinfo_hosted_domains.rb
508
608
  - exe/mihari
@@ -531,27 +631,31 @@ files:
531
631
  - lib/mihari/analyzers/urlscan.rb
532
632
  - lib/mihari/analyzers/virustotal.rb
533
633
  - lib/mihari/analyzers/zoomeye.rb
534
- - lib/mihari/artifact.rb
535
- - lib/mihari/cache.rb
536
634
  - lib/mihari/cli.rb
537
635
  - lib/mihari/config.rb
538
636
  - lib/mihari/configurable.rb
637
+ - lib/mihari/database.rb
539
638
  - lib/mihari/emitters/base.rb
639
+ - lib/mihari/emitters/database.rb
540
640
  - lib/mihari/emitters/misp.rb
541
641
  - lib/mihari/emitters/slack.rb
542
642
  - lib/mihari/emitters/stdout.rb
543
643
  - lib/mihari/emitters/the_hive.rb
544
644
  - lib/mihari/errors.rb
545
645
  - lib/mihari/html.rb
646
+ - lib/mihari/models/alert.rb
647
+ - lib/mihari/models/artifact.rb
648
+ - lib/mihari/models/tag.rb
649
+ - lib/mihari/models/tagging.rb
546
650
  - lib/mihari/notifiers/base.rb
547
651
  - lib/mihari/notifiers/exception_notifier.rb
548
652
  - lib/mihari/notifiers/slack.rb
549
653
  - lib/mihari/retriable.rb
654
+ - lib/mihari/serializers/alert.rb
655
+ - lib/mihari/serializers/artifact.rb
656
+ - lib/mihari/serializers/tag.rb
657
+ - lib/mihari/slack_monkeypatch.rb
550
658
  - lib/mihari/status.rb
551
- - lib/mihari/the_hive.rb
552
- - lib/mihari/the_hive/alert.rb
553
- - lib/mihari/the_hive/artifact.rb
554
- - lib/mihari/the_hive/base.rb
555
659
  - lib/mihari/type_checker.rb
556
660
  - lib/mihari/version.rb
557
661
  - mihari.gemspec
@@ -563,7 +667,7 @@ homepage: https://github.com/ninoseki/mihari
563
667
  licenses:
564
668
  - MIT
565
669
  metadata: {}
566
- post_install_message:
670
+ post_install_message:
567
671
  rdoc_options: []
568
672
  require_paths:
569
673
  - lib
@@ -578,8 +682,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
578
682
  - !ruby/object:Gem::Version
579
683
  version: '0'
580
684
  requirements: []
581
- rubygems_version: 3.0.3
582
- signing_key:
685
+ rubygems_version: 3.1.2
686
+ signing_key:
583
687
  specification_version: 4
584
688
  summary: A framework for continuous malicious hosts monitoring.
585
689
  test_files: []