omamori 0.1.4 → 0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +19 -7
- data/README.md +185 -60
- data/README_ja.md +187 -57
- data/demo/ai_analysis_vulnerability.rb +3 -3
- data/demo/csrf_vulnerability.rb +1 -1
- data/demo/eval_vulnerability.rb +1 -1
- data/demo/idor_vulnerability.rb +2 -2
- data/demo/insecure_cookie_vulnerability.rb +1 -1
- data/demo/open_redirect_vulnerability.rb +1 -1
- data/demo/static_analysis_vulnerability.rb +1 -1
- data/demo/xss_vulnerability.rb +1 -1
- data/exe/omamori +2 -2
- data/lib/omamori/ai_analysis_engine/checklist_scanner.rb +143 -0
- data/lib/omamori/ai_analysis_engine/cli_clients/base.rb +43 -0
- data/lib/omamori/ai_analysis_engine/cli_clients/claude_code_client.rb +35 -0
- data/lib/omamori/ai_analysis_engine/cli_clients/codex_client.rb +47 -0
- data/lib/omamori/ai_analysis_engine/diff_splitter.rb +17 -4
- data/lib/omamori/ai_analysis_engine/fallback_client.rb +23 -0
- data/lib/omamori/ai_analysis_engine/judge_client.rb +45 -0
- data/lib/omamori/ai_analysis_engine/llm_client.rb +71 -0
- data/lib/omamori/ai_analysis_engine/prompt_manager.rb +72 -12
- data/lib/omamori/ai_analysis_engine/ruby_llm_context.rb +23 -0
- data/lib/omamori/ai_analysis_engine/sub_checks/audit_log_missing.yml +12 -0
- data/lib/omamori/ai_analysis_engine/sub_checks/csrf.yml +22 -0
- data/lib/omamori/ai_analysis_engine/sub_checks/insecure_deserialization_rce.yml +9 -0
- data/lib/omamori/ai_analysis_engine/sub_checks/insufficient_encryption.yml +19 -0
- data/lib/omamori/ai_analysis_engine/sub_checks/mass_assignment.yml +19 -0
- data/lib/omamori/ai_analysis_engine/sub_checks/open_redirect.yml +17 -0
- data/lib/omamori/ai_analysis_engine/sub_checks/sql_injection.yml +20 -0
- data/lib/omamori/ai_analysis_engine/sub_checks/xss.yml +37 -0
- data/lib/omamori/ai_settings.rb +273 -0
- data/lib/omamori/config.rb +71 -72
- data/lib/omamori/core_runner.rb +332 -359
- data/lib/omamori/doctor.rb +95 -0
- data/lib/omamori/parallel.rb +24 -0
- data/lib/omamori/report_generator/console_formatter.rb +48 -42
- data/lib/omamori/report_generator/html_formatter.rb +6 -6
- data/lib/omamori/report_generator/json_formatter.rb +1 -1
- data/lib/omamori/setup_files.rb +260 -0
- data/lib/omamori/static_analysers/brakeman_runner.rb +7 -7
- data/lib/omamori/static_analysers/bundler_audit_runner.rb +8 -6
- data/lib/omamori/version.rb +2 -2
- data/lib/omamori.rb +11 -11
- metadata +45 -26
- data/lib/omamori/ai_analysis_engine/gemini_client.rb +0 -71
data/lib/omamori.rb
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative
|
|
4
|
-
require_relative
|
|
5
|
-
require_relative
|
|
6
|
-
require_relative
|
|
7
|
-
require_relative
|
|
8
|
-
require_relative
|
|
9
|
-
require_relative
|
|
10
|
-
require_relative
|
|
11
|
-
require_relative
|
|
12
|
-
require_relative
|
|
3
|
+
require_relative 'omamori/version'
|
|
4
|
+
require_relative 'omamori/core_runner'
|
|
5
|
+
require_relative 'omamori/ai_analysis_engine/llm_client'
|
|
6
|
+
require_relative 'omamori/ai_analysis_engine/prompt_manager'
|
|
7
|
+
require_relative 'omamori/ai_analysis_engine/diff_splitter'
|
|
8
|
+
require_relative 'omamori/report_generator/console_formatter'
|
|
9
|
+
require_relative 'omamori/report_generator/html_formatter'
|
|
10
|
+
require_relative 'omamori/report_generator/json_formatter'
|
|
11
|
+
require_relative 'omamori/static_analysers/brakeman_runner'
|
|
12
|
+
require_relative 'omamori/static_analysers/bundler_audit_runner'
|
|
13
13
|
|
|
14
14
|
module Omamori
|
|
15
15
|
# Your code goes here...
|
|
16
|
-
end
|
|
16
|
+
end
|
metadata
CHANGED
|
@@ -1,85 +1,84 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: omamori
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- rira100000000
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
13
|
+
name: brakeman
|
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
|
16
15
|
requirements:
|
|
17
16
|
- - "~>"
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0
|
|
18
|
+
version: '7.0'
|
|
20
19
|
type: :runtime
|
|
21
20
|
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - "~>"
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0
|
|
25
|
+
version: '7.0'
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
27
|
+
name: bundler-audit
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
30
29
|
requirements:
|
|
31
30
|
- - "~>"
|
|
32
31
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
32
|
+
version: 0.9.2
|
|
34
33
|
type: :runtime
|
|
35
34
|
prerelease: false
|
|
36
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
36
|
requirements:
|
|
38
37
|
- - "~>"
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
39
|
+
version: 0.9.2
|
|
41
40
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
41
|
+
name: colorize
|
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
|
44
43
|
requirements:
|
|
45
44
|
- - "~>"
|
|
46
45
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 0.
|
|
46
|
+
version: '0.8'
|
|
48
47
|
type: :runtime
|
|
49
48
|
prerelease: false
|
|
50
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
50
|
requirements:
|
|
52
51
|
- - "~>"
|
|
53
52
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 0.
|
|
53
|
+
version: '0.8'
|
|
55
54
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
55
|
+
name: dotenv
|
|
57
56
|
requirement: !ruby/object:Gem::Requirement
|
|
58
57
|
requirements:
|
|
59
58
|
- - "~>"
|
|
60
59
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '
|
|
60
|
+
version: '2.0'
|
|
62
61
|
type: :runtime
|
|
63
62
|
prerelease: false
|
|
64
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
64
|
requirements:
|
|
66
65
|
- - "~>"
|
|
67
66
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '
|
|
67
|
+
version: '2.0'
|
|
69
68
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
69
|
+
name: ruby_llm
|
|
71
70
|
requirement: !ruby/object:Gem::Requirement
|
|
72
71
|
requirements:
|
|
73
72
|
- - "~>"
|
|
74
73
|
- !ruby/object:Gem::Version
|
|
75
|
-
version:
|
|
74
|
+
version: '2.1'
|
|
76
75
|
type: :runtime
|
|
77
76
|
prerelease: false
|
|
78
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
78
|
requirements:
|
|
80
79
|
- - "~>"
|
|
81
80
|
- !ruby/object:Gem::Version
|
|
82
|
-
version:
|
|
81
|
+
version: '2.1'
|
|
83
82
|
- !ruby/object:Gem::Dependency
|
|
84
83
|
name: bundler
|
|
85
84
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -136,8 +135,9 @@ dependencies:
|
|
|
136
135
|
- - "~>"
|
|
137
136
|
- !ruby/object:Gem::Version
|
|
138
137
|
version: '1.0'
|
|
139
|
-
description: omamori scans Ruby code and diffs using AI (
|
|
140
|
-
|
|
138
|
+
description: omamori scans Ruby code and diffs using AI (any LLM via RubyLLM, fast
|
|
139
|
+
decision models such as Jev, or Claude Code / Codex) to detect security vulnerabilities
|
|
140
|
+
often missed by traditional tools.
|
|
141
141
|
email:
|
|
142
142
|
- 101010hayakawa@gmail
|
|
143
143
|
executables:
|
|
@@ -145,6 +145,7 @@ executables:
|
|
|
145
145
|
extensions: []
|
|
146
146
|
extra_rdoc_files: []
|
|
147
147
|
files:
|
|
148
|
+
- CHANGELOG.md
|
|
148
149
|
- Gemfile
|
|
149
150
|
- Gemfile.lock
|
|
150
151
|
- LICENSE
|
|
@@ -160,25 +161,44 @@ files:
|
|
|
160
161
|
- demo/xss_vulnerability.rb
|
|
161
162
|
- exe/omamori
|
|
162
163
|
- lib/omamori.rb
|
|
164
|
+
- lib/omamori/ai_analysis_engine/checklist_scanner.rb
|
|
165
|
+
- lib/omamori/ai_analysis_engine/cli_clients/base.rb
|
|
166
|
+
- lib/omamori/ai_analysis_engine/cli_clients/claude_code_client.rb
|
|
167
|
+
- lib/omamori/ai_analysis_engine/cli_clients/codex_client.rb
|
|
163
168
|
- lib/omamori/ai_analysis_engine/diff_splitter.rb
|
|
164
|
-
- lib/omamori/ai_analysis_engine/
|
|
169
|
+
- lib/omamori/ai_analysis_engine/fallback_client.rb
|
|
170
|
+
- lib/omamori/ai_analysis_engine/judge_client.rb
|
|
171
|
+
- lib/omamori/ai_analysis_engine/llm_client.rb
|
|
165
172
|
- lib/omamori/ai_analysis_engine/prompt_manager.rb
|
|
173
|
+
- lib/omamori/ai_analysis_engine/ruby_llm_context.rb
|
|
174
|
+
- lib/omamori/ai_analysis_engine/sub_checks/audit_log_missing.yml
|
|
175
|
+
- lib/omamori/ai_analysis_engine/sub_checks/csrf.yml
|
|
176
|
+
- lib/omamori/ai_analysis_engine/sub_checks/insecure_deserialization_rce.yml
|
|
177
|
+
- lib/omamori/ai_analysis_engine/sub_checks/insufficient_encryption.yml
|
|
178
|
+
- lib/omamori/ai_analysis_engine/sub_checks/mass_assignment.yml
|
|
179
|
+
- lib/omamori/ai_analysis_engine/sub_checks/open_redirect.yml
|
|
180
|
+
- lib/omamori/ai_analysis_engine/sub_checks/sql_injection.yml
|
|
181
|
+
- lib/omamori/ai_analysis_engine/sub_checks/xss.yml
|
|
182
|
+
- lib/omamori/ai_settings.rb
|
|
166
183
|
- lib/omamori/config.rb
|
|
167
184
|
- lib/omamori/core_runner.rb
|
|
185
|
+
- lib/omamori/doctor.rb
|
|
186
|
+
- lib/omamori/parallel.rb
|
|
168
187
|
- lib/omamori/report_generator/console_formatter.rb
|
|
169
188
|
- lib/omamori/report_generator/html_formatter.rb
|
|
170
189
|
- lib/omamori/report_generator/json_formatter.rb
|
|
171
190
|
- lib/omamori/report_generator/report_template.erb
|
|
191
|
+
- lib/omamori/setup_files.rb
|
|
172
192
|
- lib/omamori/static_analysers/brakeman_runner.rb
|
|
173
193
|
- lib/omamori/static_analysers/bundler_audit_runner.rb
|
|
174
194
|
- lib/omamori/version.rb
|
|
175
195
|
homepage: https://github.com/rira100000000/omamori
|
|
176
|
-
licenses:
|
|
196
|
+
licenses:
|
|
197
|
+
- MIT
|
|
177
198
|
metadata:
|
|
178
199
|
homepage_uri: https://github.com/rira100000000/omamori
|
|
179
200
|
source_code_uri: https://github.com/rira100000000/omamori
|
|
180
201
|
changelog_uri: https://github.com/rira100000000/omamori/blob/main/CHANGELOG.md
|
|
181
|
-
post_install_message:
|
|
182
202
|
rdoc_options: []
|
|
183
203
|
require_paths:
|
|
184
204
|
- lib
|
|
@@ -186,15 +206,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
186
206
|
requirements:
|
|
187
207
|
- - ">="
|
|
188
208
|
- !ruby/object:Gem::Version
|
|
189
|
-
version: '
|
|
209
|
+
version: '3.2'
|
|
190
210
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
211
|
requirements:
|
|
192
212
|
- - ">="
|
|
193
213
|
- !ruby/object:Gem::Version
|
|
194
214
|
version: '0'
|
|
195
215
|
requirements: []
|
|
196
|
-
rubygems_version: 3.
|
|
197
|
-
signing_key:
|
|
216
|
+
rubygems_version: 3.6.9
|
|
198
217
|
specification_version: 4
|
|
199
218
|
summary: AI-powered security vulnerability scanner for Ruby projects.
|
|
200
219
|
test_files: []
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'gemini'
|
|
4
|
-
|
|
5
|
-
module Omamori
|
|
6
|
-
module AIAnalysisEngine
|
|
7
|
-
class GeminiClient
|
|
8
|
-
def initialize(api_key)
|
|
9
|
-
@api_key = api_key || ENV["GEMINI_API_KEY"]
|
|
10
|
-
@client = nil # Initialize client later
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def analyze(prompt, json_schema, model: "gemini-2.5-flash-preview-04-17")
|
|
14
|
-
# Ensure the client is initialized
|
|
15
|
-
client
|
|
16
|
-
|
|
17
|
-
begin
|
|
18
|
-
response = client.generate_content(
|
|
19
|
-
prompt,
|
|
20
|
-
model: model,
|
|
21
|
-
response_schema: json_schema, # Use response_schema for Structured Output
|
|
22
|
-
temperature: 0.0
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
# Debug: Inspect the response object
|
|
26
|
-
# puts "Debug: response object: #{response.inspect}"
|
|
27
|
-
# puts "Debug: response methods: #{response.methods.sort}"
|
|
28
|
-
|
|
29
|
-
# Extract and parse JSON from the response text
|
|
30
|
-
json_string = response.text.gsub(/\A```json\n|```\z/, '').strip
|
|
31
|
-
begin
|
|
32
|
-
parsed_response = JSON.parse(json_string)
|
|
33
|
-
# Validate the parsed output structure
|
|
34
|
-
if parsed_response.is_a?(Hash) && parsed_response.key?('security_risks')
|
|
35
|
-
# Return the parsed JSON data
|
|
36
|
-
parsed_response
|
|
37
|
-
else
|
|
38
|
-
puts "Warning: Unexpected AI analysis response structure."
|
|
39
|
-
puts "Raw response text: #{response.text}"
|
|
40
|
-
nil # Return nil if the structure is unexpected
|
|
41
|
-
end
|
|
42
|
-
rescue JSON::ParserError
|
|
43
|
-
puts "Warning: Failed to parse response text as JSON."
|
|
44
|
-
puts "Raw response text: #{response.text}"
|
|
45
|
-
nil # Or handle the error appropriately
|
|
46
|
-
end
|
|
47
|
-
rescue Faraday::Error => e
|
|
48
|
-
puts "API Error: #{e.message}"
|
|
49
|
-
puts "Response body: #{e.response[:body]}" if e.response
|
|
50
|
-
nil # Handle API errors
|
|
51
|
-
rescue => e
|
|
52
|
-
puts "An unexpected error occurred during API call: #{e.message}"
|
|
53
|
-
nil # Handle other errors
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
private
|
|
58
|
-
|
|
59
|
-
def client
|
|
60
|
-
@client ||= begin
|
|
61
|
-
# Configure the client with the API key
|
|
62
|
-
Gemini.configure do |config|
|
|
63
|
-
config.api_key = @api_key
|
|
64
|
-
end
|
|
65
|
-
# Create a new client instance
|
|
66
|
-
Gemini::Client.new
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|