omamori 0.1.0 → 0.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.
- checksums.yaml +4 -4
- data/README.md +4 -5
- data/README_ja.md +4 -5
- data/demo_/ai_analysis_vulnerability.rb +28 -0
- data/demo_/csrf_vulnerability.rb +31 -0
- data/demo_/eval_vulnerability.rb +29 -0
- data/demo_/idor_vulnerability.rb +39 -0
- data/demo_/insecure_cookie_vulnerability.rb +25 -0
- data/demo_/open_redirect_vulnerability.rb +22 -0
- data/demo_/static_analysis_vulnerability.rb +18 -0
- data/demo_/xss_vulnerability.rb +21 -0
- data/lib/omamori/core_runner.rb +2 -2
- data/lib/omamori/version.rb +1 -1
- metadata +9 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 047332a1b52e201377fafce4a1556aaff4653c6f8982914d35486b0ae6413f48
|
4
|
+
data.tar.gz: 2ae4023aec70fcd7242c035787787cf5ab0803bcb242ec93d347a8eb98daff70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 125dad0b11d11a647b943e4761049e34176f7b628ebb28487f4e30221aed3b967cedaf7f23f3ef547f3f5096c1a9bb38898213fa5e8cd97c641e5ecd26131df7
|
7
|
+
data.tar.gz: a972855f407359eaafee5e524e2b20d7ae303afc3dd2d8b972d2e385c45ed91ee5d84aa78007edd37c746d9e285c9958ebc205bb5008f575839632be31de07fa
|
data/README.md
CHANGED
@@ -145,16 +145,15 @@ The `demo` directory contains example files with known vulnerabilities that can
|
|
145
145
|
|
146
146
|
To run Omamori on the demo files, you need to stage the changes in the `demo` directory. Since the `demo` directory might be ignored by git, follow these steps:
|
147
147
|
|
148
|
-
1.
|
149
|
-
2. Rename the `demo` directory to `demo_`:
|
148
|
+
1. Copy the `demo` directory:
|
150
149
|
```bash
|
151
|
-
|
150
|
+
cp -r demo demo_
|
152
151
|
```
|
153
|
-
|
152
|
+
2. Stage the `demo_` directory:
|
154
153
|
```bash
|
155
154
|
git add demo_
|
156
155
|
```
|
157
|
-
|
156
|
+
3. Now you can run Omamori on the staged demo files:
|
158
157
|
```bash
|
159
158
|
omamori scan
|
160
159
|
```
|
data/README_ja.md
CHANGED
@@ -141,20 +141,19 @@ model: gemini-2.5-flash-preview-04-17
|
|
141
141
|
|
142
142
|
デモファイルを対象にOmamoriを実行するには、以下の手順を実施してください:
|
143
143
|
|
144
|
-
1. `demo
|
145
|
-
2. `demo`ディレクトリ名を変更します:
|
144
|
+
1. `demo`ディレクトリをコピーします:
|
146
145
|
|
147
146
|
```bash
|
148
|
-
|
147
|
+
cp -r demo demo_
|
149
148
|
```
|
150
149
|
|
151
|
-
|
150
|
+
2. コピーした`demo_`ディレクトリをステージします:
|
152
151
|
|
153
152
|
```bash
|
154
153
|
git add demo_
|
155
154
|
```
|
156
155
|
|
157
|
-
|
156
|
+
3. ステージしたデモファイルに対してOmamoriを実行します:
|
158
157
|
|
159
158
|
```bash
|
160
159
|
omamori scan
|
@@ -0,0 +1,28 @@
|
|
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
|
@@ -0,0 +1,31 @@
|
|
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
|
+
# ユーザーがログインした状態でこのページを閲覧すると、意図せずプロファイルが更新される可能性がある。
|
@@ -0,0 +1,29 @@
|
|
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` コマンドが実行されてしまう可能性がある。
|
@@ -0,0 +1,39 @@
|
|
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 の情報が表示されてしまう可能性がある。
|
@@ -0,0 +1,25 @@
|
|
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属性が付かない。
|
@@ -0,0 +1,22 @@
|
|
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
|
+
# フィッシング詐欺などに悪用される可能性がある。
|
@@ -0,0 +1,18 @@
|
|
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")
|
@@ -0,0 +1,21 @@
|
|
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
|
+
# アラートが表示されれば脆弱性がある
|
data/lib/omamori/core_runner.rb
CHANGED
@@ -413,8 +413,8 @@ module Omamori
|
|
413
413
|
# bundler_audit:
|
414
414
|
# options: "--quiet" # Additional Bundler-Audit options
|
415
415
|
|
416
|
-
|
417
|
-
|
416
|
+
# Language setting for AI analysis details (optional, default: en)
|
417
|
+
# language: ja
|
418
418
|
|
419
419
|
YAML
|
420
420
|
# TODO: Specify output file path from options
|
data/lib/omamori/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rira100000000
|
@@ -130,6 +130,14 @@ files:
|
|
130
130
|
- demo/open_redirect_vulnerability.rb
|
131
131
|
- demo/static_analysis_vulnerability.rb
|
132
132
|
- 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
|
133
141
|
- exe/omamori
|
134
142
|
- lib/omamori.rb
|
135
143
|
- lib/omamori/ai_analysis_engine/diff_splitter.rb
|