Skip to content

Commit e99a468

Browse files
Island: Disable session-based cookies in Flask
Issue: #2157 PR: #3044
1 parent f69d1c0 commit e99a468

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

monkey/monkey_island/cc/app.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from typing import Iterable, Set, Type
55

66
import flask_restful
7-
from flask import Flask, Response, send_from_directory
7+
from flask import Flask, Response, g, send_from_directory
8+
from flask.sessions import SecureCookieSessionInterface
89
from flask_mongoengine import MongoEngine
910
from flask_security import ConfirmRegisterForm, MongoEngineUserDatastore, Security
1011
from werkzeug.exceptions import NotFound
@@ -88,6 +89,9 @@ def setup_authentication(app, data_dir):
8889
# Ignore CSRF, because it's irrelevant for javascript applications
8990
app.config["WTF_CSRF_CHECK_DEFAULT"] = False
9091
app.config["SECURITY_CSRF_IGNORE_UNAUTH_ENDPOINTS"] = True
92+
# In Token Authentication we can pass the token both in query parametar and header
93+
# This disables the query parameter token
94+
app.config["SECURITY_TOKEN_AUTHENTICATION_KEY"] = None
9195

9296
# The database object needs to be created after we configure the flask application
9397
db = MongoEngine(app)
@@ -109,12 +113,31 @@ class CustomConfirmRegisterForm(ConfirmRegisterForm):
109113
"Email", default="dummy@dummy.com", validators=[validate_no_user_exists_already]
110114
)
111115

116+
from flask_login import user_loaded_from_request
117+
118+
@user_loaded_from_request.connect
119+
def user_loaded_from_request(self, user=None):
120+
g.login_via_request = True
121+
122+
class CustomSessionInterface(SecureCookieSessionInterface):
123+
"""Prevent creating session from API requests."""
124+
125+
def should_set_cookie(self, *args, **kwargs):
126+
return False
127+
128+
def save_session(self, *args, **kwargs):
129+
if g.get("login_via_request"):
130+
return
131+
return super(CustomSessionInterface, self).save_session(*args, **kwargs)
132+
112133
app.security = Security(
113134
app,
114135
user_datastore,
115136
confirm_register_form=CustomConfirmRegisterForm,
116137
)
117138

139+
app.session_interface = CustomSessionInterface()
140+
118141

119142
def init_app_config(app, mongo_url, data_dir: Path):
120143
app.config["MONGO_URI"] = mongo_url

vulture_allowlist.py

+3
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@
102102
app.url_map.strict_slashes
103103
api.representations
104104
hub.exception_stream
105+
app.login_via_request
106+
app.should_set_cookie
107+
app.session_interface
105108

106109
# Deployment is chosen dynamically
107110
Deployment.DEVELOP

0 commit comments

Comments
 (0)