omamori 0.1.1 → 0.1.4
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/Gemfile +0 -3
- data/Gemfile.lock +12 -12
- data/README.md +32 -4
- data/README_ja.md +32 -4
- data/lib/omamori/ai_analysis_engine/diff_splitter.rb +14 -19
- data/lib/omamori/ai_analysis_engine/gemini_client.rb +4 -3
- data/lib/omamori/ai_analysis_engine/prompt_manager.rb +93 -42
- data/lib/omamori/config.rb +21 -0
- data/lib/omamori/core_runner.rb +383 -157
- data/lib/omamori/version.rb +1 -1
- metadata +44 -24
- data/demo_/ai_analysis_vulnerability.rb +0 -28
- data/demo_/csrf_vulnerability.rb +0 -31
- data/demo_/eval_vulnerability.rb +0 -29
- data/demo_/idor_vulnerability.rb +0 -39
- data/demo_/insecure_cookie_vulnerability.rb +0 -25
- data/demo_/open_redirect_vulnerability.rb +0 -22
- data/demo_/static_analysis_vulnerability.rb +0 -18
- data/demo_/xss_vulnerability.rb +0 -21
data/lib/omamori/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omamori
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rira100000000
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -38,6 +38,48 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ruby-gemini-api
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.1.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: brakeman
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '7.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '7.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler-audit
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.9.2
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.9.2
|
41
83
|
- !ruby/object:Gem::Dependency
|
42
84
|
name: bundler
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,20 +136,6 @@ dependencies:
|
|
94
136
|
- - "~>"
|
95
137
|
- !ruby/object:Gem::Version
|
96
138
|
version: '1.0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: ruby-gemini-api
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 0.1.0
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 0.1.0
|
111
139
|
description: omamori scans Ruby code and diffs using AI (Google Gemini) to detect
|
112
140
|
security vulnerabilities often missed by traditional tools.
|
113
141
|
email:
|
@@ -130,14 +158,6 @@ files:
|
|
130
158
|
- demo/open_redirect_vulnerability.rb
|
131
159
|
- demo/static_analysis_vulnerability.rb
|
132
160
|
- demo/xss_vulnerability.rb
|
133
|
-
- demo_/ai_analysis_vulnerability.rb
|
134
|
-
- demo_/csrf_vulnerability.rb
|
135
|
-
- demo_/eval_vulnerability.rb
|
136
|
-
- demo_/idor_vulnerability.rb
|
137
|
-
- demo_/insecure_cookie_vulnerability.rb
|
138
|
-
- demo_/open_redirect_vulnerability.rb
|
139
|
-
- demo_/static_analysis_vulnerability.rb
|
140
|
-
- demo_/xss_vulnerability.rb
|
141
161
|
- exe/omamori
|
142
162
|
- lib/omamori.rb
|
143
163
|
- lib/omamori/ai_analysis_engine/diff_splitter.rb
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# This file contains vulnerabilities that AI analysis can help detect.
|
2
|
-
|
3
|
-
require 'net/http'
|
4
|
-
require 'uri'
|
5
|
-
|
6
|
-
API_KEY = "HARDCODED_SECRET_API_KEY_12345" # Hardcoded sensitive information
|
7
|
-
|
8
|
-
def fetch_data(user_input)
|
9
|
-
# Insufficient input validation
|
10
|
-
if user_input.length > 100
|
11
|
-
puts "Input too long, truncating."
|
12
|
-
user_input = user_input[0..99]
|
13
|
-
end
|
14
|
-
|
15
|
-
uri = URI("https://api.example.com/data?query=#{user_input}&api_key=#{API_KEY}")
|
16
|
-
response = Net::HTTP.get_response(uri)
|
17
|
-
|
18
|
-
if response.is_a?(Net::HTTPSuccess)
|
19
|
-
puts "Data fetched successfully: #{response.body}"
|
20
|
-
else
|
21
|
-
# Poor error handling - reveals internal details
|
22
|
-
puts "Error fetching data: #{response.code} - #{response.message}"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# Example usage
|
27
|
-
# fetch_data("some data")
|
28
|
-
# fetch_data("a" * 200) # Long input
|
data/demo_/csrf_vulnerability.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'sinatra'
|
4
|
-
|
5
|
-
# CSRF (Cross-Site Request Forgery) の脆弱性を含むデモコード
|
6
|
-
# フォーム送信時にCSRFトークンによる検証を行っていない例
|
7
|
-
|
8
|
-
# ユーザー情報を更新する想定のPOSTエンドポイント
|
9
|
-
post '/update_profile' do
|
10
|
-
# 本来はここでCSRFトークンの検証が必要だが、省略されている
|
11
|
-
user_id = params['user_id']
|
12
|
-
new_email = params['email']
|
13
|
-
|
14
|
-
# ユーザー情報の更新処理 (実際には行わない)
|
15
|
-
puts "ユーザー #{user_id} のメールアドレスを #{new_email} に更新しました。"
|
16
|
-
|
17
|
-
"Profile updated for user #{user_id}."
|
18
|
-
end
|
19
|
-
|
20
|
-
# 実行方法:
|
21
|
-
# 1. このファイルを保存
|
22
|
-
# 2. ターミナルで `ruby demo/csrf_vulnerability.rb` を実行
|
23
|
-
# 3. 攻撃者は、このエンドポイントへのPOSTリクエストをユーザーに意図せず実行させるような細工を施したページを作成し、ユーザーを誘導する。
|
24
|
-
# 例えば、以下のようなHTMLを含むページを別のサイトに用意する:
|
25
|
-
# <form action="http://localhost:4567/update_profile" method="post">
|
26
|
-
# <input type="hidden" name="user_id" value="123">
|
27
|
-
# <input type="hidden" name="email" value="attacker@example.com">
|
28
|
-
# <input type="submit" value="Click me!">
|
29
|
-
# </form>
|
30
|
-
# または、JavaScriptを使って自動的にPOSTリクエストを送信させる。
|
31
|
-
# ユーザーがログインした状態でこのページを閲覧すると、意図せずプロファイルが更新される可能性がある。
|
data/demo_/eval_vulnerability.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'sinatra'
|
4
|
-
|
5
|
-
# 危険な eval/動的コード実行の脆弱性を含むデモコード
|
6
|
-
# ユーザーからの入力を eval で直接評価している例
|
7
|
-
|
8
|
-
get '/calculate' do
|
9
|
-
# ユーザーからの入力 (expression) を取得
|
10
|
-
expression = params['expression']
|
11
|
-
|
12
|
-
# 取得した入力を eval で評価
|
13
|
-
# ここにコードインジェクションの脆弱性がある
|
14
|
-
# 攻撃者は任意のRubyコードを実行させることが可能になる
|
15
|
-
begin
|
16
|
-
result = eval(expression)
|
17
|
-
"Result: #{result}"
|
18
|
-
rescue StandardError => e
|
19
|
-
status 500
|
20
|
-
"Error: #{e.message}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# 実行方法:
|
25
|
-
# 1. このファイルを保存
|
26
|
-
# 2. ターミナルで `ruby demo/eval_vulnerability.rb` を実行
|
27
|
-
# 3. ブラウザで `http://localhost:4567/calculate?expression=2%2B2` にアクセスすると "Result: 4" が表示される。
|
28
|
-
# 4. 悪意のある入力を与える例: `http://localhost:4567/calculate?expression=system('ls%20-l')`
|
29
|
-
# サーバー側で `ls -l` コマンドが実行されてしまう可能性がある。
|
data/demo_/idor_vulnerability.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'sinatra'
|
4
|
-
|
5
|
-
# IDOR (Insecure Direct Object Reference) の脆弱性を含むデモコード
|
6
|
-
# ユーザーからの入力(ID)を直接使用してリソースにアクセスし、認可チェックを行っていない例
|
7
|
-
|
8
|
-
# ユーザー情報を表示する想定のエンドポイント
|
9
|
-
get '/user_info/:user_id' do
|
10
|
-
user_id = params['user_id']
|
11
|
-
|
12
|
-
# 本来はここで、リクエストを行ったユーザーが、指定された user_id の情報にアクセスする権限があるかチェックが必要だが、省略されている
|
13
|
-
user_data = fetch_user_data(user_id) # ユーザーIDに基づいてデータを取得する関数を想定
|
14
|
-
|
15
|
-
if user_data
|
16
|
-
"User Info for ID #{user_id}: #{user_data}"
|
17
|
-
else
|
18
|
-
status 404
|
19
|
-
"User not found."
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# ダミーのユーザーデータ取得関数
|
24
|
-
def fetch_user_data(user_id)
|
25
|
-
# 実際にはデータベースなどからデータを取得する
|
26
|
-
users = {
|
27
|
-
'101' => 'Alice',
|
28
|
-
'102' => 'Bob',
|
29
|
-
'103' => 'Charlie'
|
30
|
-
}
|
31
|
-
users[user_id]
|
32
|
-
end
|
33
|
-
|
34
|
-
# 実行方法:
|
35
|
-
# 1. このファイルを保存
|
36
|
-
# 2. ターミナルで `ruby demo/idor_vulnerability.rb` を実行
|
37
|
-
# 3. ブラウザで `http://localhost:4567/user_info/101` にアクセスすると Alice の情報が表示される。
|
38
|
-
# 4. ログインしていない、または権限のないユーザーが `http://localhost:4567/user_info/102` にアクセスすると、
|
39
|
-
# 本来アクセス権限がないはずの Bob の情報が表示されてしまう可能性がある。
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'sinatra'
|
4
|
-
|
5
|
-
# 不適切なクッキー属性(HttpOnly, Secure, SameSite 未設定)の脆弱性を含むデモコード
|
6
|
-
# セキュリティ関連の属性が設定されていないクッキーを発行する例
|
7
|
-
|
8
|
-
# ログイン成功時にセッションクッキーを発行する想定のエンドポイント
|
9
|
-
get '/login' do
|
10
|
-
user_id = params['user_id'] # ダミーのユーザーID取得
|
11
|
-
|
12
|
-
# セッションIDをクッキーに設定
|
13
|
-
# HttpOnly, Secure, SameSite 属性が設定されていない
|
14
|
-
# これにより、XSS攻撃によるクッキー情報の窃盗や、CSRF攻撃のリスクが高まる
|
15
|
-
response.set_cookie('session_id', value: "user_#{user_id}_#{Time.now.to_i}")
|
16
|
-
|
17
|
-
"Logged in as user #{user_id}. Session cookie set."
|
18
|
-
end
|
19
|
-
|
20
|
-
# 実行方法:
|
21
|
-
# 1. このファイルを保存
|
22
|
-
# 2. ターミナルで `ruby demo/insecure_cookie_vulnerability.rb` を実行
|
23
|
-
# 3. ブラウザで `http://localhost:4567/login?user_id=test_user` にアクセス
|
24
|
-
# 開発者ツールなどでクッキーを確認すると、session_id クッキーに HttpOnly, Secure, SameSite 属性が付与されていないことがわかる。
|
25
|
-
# HTTPSでアクセスした場合でもSecure属性が付かない。
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'sinatra'
|
4
|
-
|
5
|
-
# オープンリダイレクトの脆弱性を含むデモコード
|
6
|
-
# ユーザーからの入力(URL)を検証せずにリダイレクト先に指定している例
|
7
|
-
|
8
|
-
get '/redirect' do
|
9
|
-
# ユーザーからの入力 (url) を取得
|
10
|
-
redirect_url = params['url']
|
11
|
-
|
12
|
-
# 取得した入力をそのままリダイレクト先に指定
|
13
|
-
# ここにオープンリダイレクトの脆弱性がある
|
14
|
-
redirect redirect_url
|
15
|
-
end
|
16
|
-
|
17
|
-
# 実行方法:
|
18
|
-
# 1. このファイルを保存
|
19
|
-
# 2. ターミナルで `ruby demo/open_redirect_vulnerability.rb` を実行
|
20
|
-
# 3. ブラウザで `http://localhost:4567/redirect?url=https://malicious-site.example.com` にアクセス
|
21
|
-
# 悪意のあるサイトにリダイレクトされてしまう。
|
22
|
-
# フィッシング詐欺などに悪用される可能性がある。
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# This file contains a vulnerability detectable by static analysis tools like Brakeman.
|
2
|
-
|
3
|
-
require 'sqlite3'
|
4
|
-
|
5
|
-
def find_user(username)
|
6
|
-
db = SQLite3::Database.open 'users.db'
|
7
|
-
# Vulnerable to SQL injection
|
8
|
-
query = "SELECT * FROM users WHERE username = '#{username}'"
|
9
|
-
puts "Executing query: #{query}"
|
10
|
-
db.execute query
|
11
|
-
rescue SQLite3::Exception => e
|
12
|
-
puts "Exception occurred: #{e}"
|
13
|
-
ensure
|
14
|
-
db.close if db
|
15
|
-
end
|
16
|
-
|
17
|
-
# Example usage (vulnerable)
|
18
|
-
# find_user("' OR '1'='1")
|
data/demo_/xss_vulnerability.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'sinatra'
|
4
|
-
|
5
|
-
# XSS (Cross-Site Scripting) の脆弱性を含むデモコード
|
6
|
-
# ユーザーからの入力を適切にエスケープせずにHTMLに出力している例
|
7
|
-
|
8
|
-
get '/greet' do
|
9
|
-
# ユーザーからの入力 (name) を取得
|
10
|
-
name = params['name']
|
11
|
-
|
12
|
-
# 取得した入力をそのままHTMLに埋め込んで出力
|
13
|
-
# ここにXSSの脆弱性がある
|
14
|
-
"<h1>Hello, #{name}!</h1>"
|
15
|
-
end
|
16
|
-
|
17
|
-
# 実行方法:
|
18
|
-
# 1. このファイルを保存
|
19
|
-
# 2. ターミナルで `ruby demo/xss_vulnerability.rb` を実行
|
20
|
-
# 3. ブラウザで `http://localhost:4567/greet?name=<script>alert('XSS')</script>` にアクセス
|
21
|
-
# アラートが表示されれば脆弱性がある
|