Skip to content

Commit 6a4610b

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

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

monkey/monkey_island/cc/app.py

+26-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,8 @@ 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+
# Forbid sending authentication token in URL parameters
93+
app.config["SECURITY_TOKEN_AUTHENTICATION_KEY"] = None
9194

9295
# The database object needs to be created after we configure the flask application
9396
db = MongoEngine(app)
@@ -114,6 +117,13 @@ class CustomConfirmRegisterForm(ConfirmRegisterForm):
114117
user_datastore,
115118
confirm_register_form=CustomConfirmRegisterForm,
116119
)
120+
from flask_login import user_loaded_from_request
121+
122+
@user_loaded_from_request.connect
123+
def user_loaded_from_request(self, user=None):
124+
g.login_via_request = True
125+
126+
app.session_interface = disable_session_cookies()
117127

118128

119129
def init_app_config(app, mongo_url, data_dir: Path):
@@ -135,6 +145,21 @@ def init_app_config(app, mongo_url, data_dir: Path):
135145
setup_authentication(app, data_dir)
136146

137147

148+
def disable_session_cookies() -> SecureCookieSessionInterface:
149+
class CustomSessionInterface(SecureCookieSessionInterface):
150+
"""Prevent creating session from API requests."""
151+
152+
def should_set_cookie(self, *args, **kwargs):
153+
return False
154+
155+
def save_session(self, *args, **kwargs):
156+
if g.get("login_via_request"):
157+
return
158+
return super(CustomSessionInterface, self).save_session(*args, **kwargs)
159+
160+
return CustomSessionInterface()
161+
162+
138163
def init_app_url_rules(app):
139164
app.add_url_rule("/", "serve_home", serve_home)
140165
app.add_url_rule("/<path:static_path>", "serve_static_file", serve_static_file)

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)