Skip to content

Commit 082423d

Browse files
authored
Merge pull request #22 from noobpk/dev
Bump to main
2 parents 30d175b + b5a2236 commit 082423d

File tree

9 files changed

+830
-381
lines changed

9 files changed

+830
-381
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## 02/12/2024
4+
5+
- Release v0.1.7 Gemini-self-protector for Flask
6+
- Fix bug
7+
- Refactor source code
8+
- Add new dashboard metrix
9+
310
## 12/11/2023
411

512
- Release v0.1.6 Gemini-self-protector for Flask

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Gemini - The Runtime Application Self Protection (RASP) Solution Combined With Deep Learning
44

55
[![CodeQL](https://github.com/noobpk/gemini-self-protector/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/noobpk/gemini-self-protector/actions/workflows/codeql.yml)
6+
[![trivy](https://github.com/noobpk/gemini-self-protector/actions/workflows/trivy.yml/badge.svg?branch=main)](https://github.com/noobpk/gemini-self-protector/actions/workflows/trivy.yml)
67
![Static Badge](https://img.shields.io/badge/python-3.x-blue?logo=python)
78
![Static Badge](https://img.shields.io/badge/Deep%20Learning-orange)
89
![Static Badge](https://img.shields.io/badge/Convolutional%20Neural%20Network-yellow)
@@ -76,6 +77,10 @@ Gemini supports 3 modes and recommends sensitivity levels for the application to
7677

7778
## Screenshot
7879

80+
### New Dashboard Metrix
81+
82+
![image](https://github.com/user-attachments/assets/d7733f82-fc81-42a2-99f6-b08d6f5255be)
83+
7984
### Dashboard
8085

8186
<img width="1440" alt="image" src="https://github.com/noobpk/gemini-self-protector/assets/31820707/068048ef-42cf-4032-b064-137d69abccb6">

gemini-python/gemini_self_protector/CHANGELOG.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
# Changelog
22

3-
## v0.1.5 (12/11/2023)
3+
## v0.1.6 (2/12/2024)
4+
5+
- Fix bug
6+
- Refactor source code
7+
- Add new dashboard metrix
8+
9+
## v0.1.6 (12/11/2023)
410

511
- Fix bug
612
- Refactor source code

gemini-python/gemini_self_protector/poetry.lock

+640-366
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gemini-python/gemini_self_protector/pyproject.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "gemini_self_protector"
3-
version = "0.1.6"
3+
version = "0.1.7"
44
description = "Runtime Application Self-Protection"
55
authors = ["lethanhphuc"]
66
license = "MIT"
@@ -16,6 +16,8 @@ cachetools = "^5.3.1"
1616
passlib = "^1.7.4"
1717
requests = "^2.31.0"
1818
tqdm = "^4.66.1"
19+
argon2-cffi = "^23.1.0"
20+
psutil = "^6.1.0"
1921

2022
[tool.poetry.dev-dependencies]
2123

gemini-python/gemini_self_protector/src/gemini_self_protector/_gemini.py

+10
Original file line numberDiff line numberDiff line change
@@ -714,3 +714,13 @@ def g_serve_diagnostic() -> None:
714714
"_Gemini.g_serve_diagnostic", e
715715
)
716716
)
717+
718+
def g_server_performance() -> None:
719+
try:
720+
return _Utils.g_server_performance()
721+
except Exception as e:
722+
logger.error(
723+
"[x_x] Something went wrong at {0}, please check your error message.\n Message - {1}".format(
724+
"_Gemini.g_server_performance", e
725+
)
726+
)

gemini-python/gemini_self_protector/src/gemini_self_protector/_gui.py

+14-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from flask import Flask, Blueprint, request, render_template, session, redirect, url_for, flash, jsonify, send_file
22
from ._logger import logger
33
from ._gemini import _Gemini
4-
from passlib.hash import argon2
4+
import argon2
55
from datetime import datetime
66
import ipaddress
77
import re
@@ -13,6 +13,8 @@
1313
import urllib.parse
1414
import sys
1515

16+
ph = argon2.PasswordHasher()
17+
1618
class _Gemini_GUI(object):
1719

1820
def __init__(self, flask_app: Flask) -> None:
@@ -148,7 +150,7 @@ def gemini_install():
148150
"g_serve_key": g_serve_key
149151
})
150152
_Gemini.update_gemini_user({
151-
"password": argon2.hash(password),
153+
"password": ph.hash(password),
152154
})
153155
logger.info(
154156
"[+] Install gemini-self-protector successful.!")
@@ -207,8 +209,11 @@ def gemini_login():
207209
app_username = _Gemini.get_gemini_user().username
208210
app_password = _Gemini.get_gemini_user().password
209211

210-
password_check = argon2.verify(password, app_password)
211-
212+
try:
213+
password_check = ph.verify(app_password, password)
214+
except argon2.exceptions.VerifyMismatchError:
215+
return render_template('gemini-protector-gui/accounts/login.html', msg="Incorrect Username / Password")
216+
212217
if username == app_username and password_check:
213218
session['gemini_logged_in'] = True
214219
flash('Welcome back {}!'.format(
@@ -241,7 +246,7 @@ def gemini_profile():
241246
return render_template('gemini-protector-gui/home/profile.html', msg="Invalid password")
242247

243248
_Gemini.update_gemini_config({
244-
"gemini_app_password": argon2.hash(password),
249+
"gemini_app_password": ph.hash(password),
245250
})
246251
logger.info("[+] Update password successful.")
247252
return redirect(url_for('nested_service.gemini_login'))
@@ -271,6 +276,7 @@ def gemini_dashboard():
271276
request_log = _Gemini.get_gemini_request_log()
272277
beharvior_log = _Gemini.get_gemini_behavior_log()
273278
# predict_server_status = _Gemini.health_check_predict_server()
279+
server_performance = _Gemini.g_server_performance()
274280

275281
sorted_request_log_data = sorted(
276282
request_log, key=lambda x: x.time)
@@ -281,7 +287,7 @@ def gemini_dashboard():
281287
start_index = (page - 1) * per_page
282288
end_index = start_index + per_page
283289
limited_request_log_data = sorted_request_log_data[start_index:end_index]
284-
290+
285291
attack_counts = {
286292
'Malicious Request': 0,
287293
'ACL Block': 0,
@@ -320,7 +326,8 @@ def gemini_dashboard():
320326
_gemini_notification_channel=gemini_config.notification_channel,
321327
_gemini_attack_counts=attack_counts,
322328
_any_attack_count_gt_zero=any_attack_count_gt_zero,
323-
_gemini_beharvior_log_data=beharvior_log
329+
_gemini_beharvior_log_data=beharvior_log,
330+
_server_performance=server_performance
324331
)
325332
except Exception as e:
326333
logger.error("[x_x] Something went wrong at {0}, please check your error message.\n Message - {1}".format(

gemini-python/gemini_self_protector/src/gemini_self_protector/_utils.py

+44-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import socket
1414
from hashlib import sha256
1515
from requests.exceptions import ConnectionError
16-
16+
import psutil
1717

1818
class _Utils(object):
1919
def g_wvd_serve_predict(_payload) -> None:
@@ -176,7 +176,7 @@ def create_path() -> None:
176176

177177
def load_banner():
178178
print(
179-
"""\033[1;31m \n
179+
r"""\033[1;31m \n
180180
__ ___ __ ___ ___ __ __ __ ___ ___ __ ___ __ __
181181
/ _` |__ |\/| | |\ | | /__` |__ | |__ |__) |__) / \ | |__ / ` | / \ |__)
182182
\__> |___ | | | | \| | .__/ |___ |___ | | | \ \__/ | |___ \__, | \__/ | \
@@ -282,7 +282,7 @@ def g_decoder_and_rule_based_detection(_string):
282282
"""Decode a string using the specified encoding type."""
283283

284284
# Remove the invalid escape sequences - # Remove the backslash
285-
string = _string.replace("\%", "%").replace("\\", "").replace("<br/>", "")
285+
string = _string.replace(r"\%", "%").replace("\\", "").replace("<br/>", "")
286286

287287
string = string.encode().decode("unicode_escape")
288288

@@ -308,7 +308,7 @@ def g_decoder_and_rule_based_detection(_string):
308308
# Try second base64-decode
309309
try:
310310
string = (
311-
string.replace("\%", "%")
311+
string.replace(r"\%", "%")
312312
.replace("\\", "")
313313
.replace("<br/>", "")
314314
.replace(" ", "")
@@ -394,6 +394,46 @@ def g_decoder_and_rule_based_detection(_string):
394394
)
395395
)
396396

397+
def g_server_performance():
398+
try:
399+
# Conversion factor for bytes to GB
400+
BYTES_TO_GB = 1_073_741_824
401+
402+
server_metrix = {
403+
"CPU": None,
404+
"MEMORY": None,
405+
"NETWORK_IN": None,
406+
"NETWORK_OUT": None,
407+
"DISK_READ": None,
408+
"DISK_WRITE": None,
409+
}
410+
411+
# Fetch CPU and memory metrics
412+
server_metrix["CPU"] = psutil.cpu_percent(interval=1)
413+
server_metrix["MEMORY"] = psutil.virtual_memory().percent
414+
415+
# Fetch network metrics
416+
net_io = psutil.net_io_counters()
417+
server_metrix["NETWORK_IN"] = net_io.bytes_recv / BYTES_TO_GB # Total bytes received
418+
server_metrix["NETWORK_OUT"] = net_io.bytes_sent / BYTES_TO_GB # Total bytes sent
419+
420+
# Fetch disk metrics
421+
disk_io = psutil.disk_io_counters()
422+
server_metrix["DISK_READ"] = disk_io.read_bytes / BYTES_TO_GB # Total bytes read
423+
server_metrix["DISK_WRITE"] = disk_io.write_bytes / BYTES_TO_GB # Total bytes written
424+
425+
# Round all values to 2 decimal places
426+
for key in server_metrix:
427+
if isinstance(server_metrix[key], (float, int)):
428+
server_metrix[key] = round(server_metrix[key], 2)
429+
430+
return server_metrix
431+
except Exception as e:
432+
logger.error(
433+
"[x_x] Something went wrong at {0}, please check your error message.\n Message - {1}".format(
434+
"_Utils.g_server_performance", e
435+
)
436+
)
397437

398438
class _Validator(object):
399439
def validate_g_serve_key(_key) -> None:

gemini-python/gemini_self_protector/src/gemini_self_protector/resource/templates/home/index.html

+100-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,108 @@
2626
<div class="card-block">
2727
<div class="row d-flex align-items-center">
2828
<div class="col-auto">
29-
{%if _anti_dos %}
29+
{%if _server_performance['CPU'] < 80 %}
30+
<i class="feather icon-cpu f-30 text-c-green"></i>
31+
{%else%}
32+
<i class="feather icon-cpu f-30 text-c-red"></i>
33+
{% endif %}
34+
</div>
35+
<div class="col">
36+
<h3 class="f-w-300">{{_server_performance['CPU']}}%</h3>
37+
<span class="d-block text-uppercase">CPU USAGE</span>
38+
</div>
39+
</div>
40+
</div>
41+
</div>
42+
</div>
43+
<div class="col-md-6 col-xl-4">
44+
<div class="card">
45+
<div class="card-block">
46+
<div class="row d-flex align-items-center">
47+
<div class="col-auto">
48+
{%if _server_performance['MEMORY'] < 80 %}
49+
<i class="feather icon-cpu f-30 text-c-green"></i>
50+
{%else%}
51+
<i class="feather icon-cpu f-30 text-c-red"></i>
52+
{% endif %}
53+
</div>
54+
<div class="col">
55+
<h3 class="f-w-300">{{_server_performance['MEMORY']}}%</h3>
56+
<span class="d-block text-uppercase">MEMORY USAGE</span>
57+
</div>
58+
</div>
59+
</div>
60+
</div>
61+
</div>
62+
<div class="col-md-6 col-xl-4">
63+
<div class="card">
64+
<div class="card-block">
65+
<div class="row d-flex align-items-center">
66+
<div class="col-auto">
3067
<i class="feather icon-activity f-30 text-c-green"></i>
68+
</div>
69+
<div class="col">
70+
<h3 class="f-w-300">{{_server_performance['NETWORK_IN']}} GB</h3>
71+
<span class="d-block text-uppercase">NETWORK IN</span>
72+
</div>
73+
</div>
74+
</div>
75+
</div>
76+
</div>
77+
<div class="col-md-6 col-xl-4">
78+
<div class="card">
79+
<div class="card-block">
80+
<div class="row d-flex align-items-center">
81+
<div class="col-auto">
82+
<i class="feather icon-disc f-30 text-c-green"></i>
83+
</div>
84+
<div class="col">
85+
<h3 class="f-w-300">{{_server_performance['DISK_READ']}} GB</h3>
86+
<span class="d-block text-uppercase">DISK READ</span>
87+
</div>
88+
</div>
89+
</div>
90+
</div>
91+
</div>
92+
<div class="col-md-6 col-xl-4">
93+
<div class="card">
94+
<div class="card-block">
95+
<div class="row d-flex align-items-center">
96+
<div class="col-auto">
97+
<i class="feather icon-disc f-30 text-c-green"></i>
98+
</div>
99+
<div class="col">
100+
<h3 class="f-w-300">{{_server_performance['DISK_WRITE']}} GB</h3>
101+
<span class="d-block text-uppercase">DISK WRITE</span>
102+
</div>
103+
</div>
104+
</div>
105+
</div>
106+
</div>
107+
<div class="col-md-6 col-xl-4">
108+
<div class="card">
109+
<div class="card-block">
110+
<div class="row d-flex align-items-center">
111+
<div class="col-auto">
112+
<i class="feather icon-activity f-30 text-c-green"></i>
113+
</div>
114+
<div class="col">
115+
<h3 class="f-w-300">{{_server_performance['NETWORK_OUT']}} GB</h3>
116+
<span class="d-block text-uppercase">NETWORK OUT</span>
117+
</div>
118+
</div>
119+
</div>
120+
</div>
121+
</div>
122+
<div class="col-md-6 col-xl-4">
123+
<div class="card">
124+
<div class="card-block">
125+
<div class="row d-flex align-items-center">
126+
<div class="col-auto">
127+
{%if _anti_dos %}
128+
<i class="feather icon-shield f-30 text-c-green"></i>
31129
{%else%}
32-
<i class="feather icon-activity f-30 text-c-red"></i>
130+
<i class="feather icon-shield f-30 text-c-red"></i>
33131
{% endif %}
34132
</div>
35133
<div class="col">

0 commit comments

Comments
 (0)