Skip to content

Commit

Permalink
CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper…
Browse files Browse the repository at this point in the history
… Input Validation Leading to LFR/Path Traversal when fetching file:.. )
  • Loading branch information
dgtlmoon committed Dec 27, 2024
1 parent 5dea5e1 commit f7e9846
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 35 deletions.
4 changes: 2 additions & 2 deletions changedetectionio/processors/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ def call_browser(self, preferred_proxy_id=None):

url = self.watch.link

# Protect against file://, file:/ access, check the real "link" without any meta "source:" etc prepended.
if re.search(r'^file:/', url.strip(), re.IGNORECASE):
# Protect against file:, file:/, file:// access, check the real "link" without any meta "source:" etc prepended.
if re.search(r'^file:', url.strip(), re.IGNORECASE):
if not strtobool(os.getenv('ALLOW_FILE_URI', 'false')):
raise Exception(
"file:// type access is denied for security reasons."
Expand Down
47 changes: 14 additions & 33 deletions changedetectionio/tests/test_security.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import os

from flask import url_for
from .util import set_original_response, set_modified_response, live_server_setup, wait_for_all_checks
import time

from .util import live_server_setup, wait_for_all_checks
from .. import strtobool


Expand Down Expand Up @@ -61,54 +59,37 @@ def test_bad_access(client, live_server, measure_memory_usage):
assert b'Watch protocol is not permitted by SAFE_PROTOCOL_REGEX' in res.data


def test_file_slashslash_access(client, live_server, measure_memory_usage):
#live_server_setup(live_server)

test_file_path = os.path.abspath(__file__)
def _runner_test_various_file_slash(client, file_uri):

# file:// is permitted by default, but it will be caught by ALLOW_FILE_URI
client.post(
url_for("form_quick_watch_add"),
data={"url": f"file://{test_file_path}", "tags": ''},
data={"url": file_uri, "tags": ''},
follow_redirects=True
)
wait_for_all_checks(client)
res = client.get(url_for("index"))

# If it is enabled at test time
if strtobool(os.getenv('ALLOW_FILE_URI', 'false')):
res = client.get(
url_for("preview_page", uuid="first"),
follow_redirects=True
)

assert b"test_file_slashslash_access" in res.data
# So it should permit it, but it should fall back to the 'requests' library giving an error
# (but means it gets passed to playwright etc)
assert b"URLs with hostname components are not permitted" in res.data
assert b"_runner_test_various_file_slash" in res.data # Can read this file OK
else:
# Default should be here
assert b'file:// type access is denied for security reasons.' in res.data

res = client.get(url_for("form_delete", uuid="all"), follow_redirects=True)
assert b'Deleted' in res.data

def test_file_slash_access(client, live_server, measure_memory_usage):
#live_server_setup(live_server)
# file: is permitted by default, but it will be caught by ALLOW_FILE_URI

test_file_path = os.path.abspath(__file__)

# file:// is permitted by default, but it will be caught by ALLOW_FILE_URI
client.post(
url_for("form_quick_watch_add"),
data={"url": f"file:/{test_file_path}", "tags": ''},
follow_redirects=True
)
wait_for_all_checks(client)
res = client.get(url_for("index"))

# If it is enabled at test time
if strtobool(os.getenv('ALLOW_FILE_URI', 'false')):
# So it should permit it, but it should fall back to the 'requests' library giving an error
# (but means it gets passed to playwright etc)
assert b"URLs with hostname components are not permitted" in res.data
else:
# Default should be here
assert b'file:// type access is denied for security reasons.' in res.data
_runner_test_various_file_slash(client, file_uri=f"file://{test_file_path}")
_runner_test_various_file_slash(client, file_uri=f"file:/{test_file_path}")
_runner_test_various_file_slash(client, file_uri=f"file:{test_file_path}") # CVE-2024-56509

def test_xss(client, live_server, measure_memory_usage):
#live_server_setup(live_server)
Expand Down

0 comments on commit f7e9846

Please sign in to comment.