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.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Omamori
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.4"
5
5
  end
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.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-04-29 00:00:00.000000000 Z
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
@@ -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
- # ユーザーがログインした状態でこのページを閲覧すると、意図せずプロファイルが更新される可能性がある。
@@ -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` コマンドが実行されてしまう可能性がある。
@@ -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")
@@ -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
- # アラートが表示されれば脆弱性がある