Summary
The validation for the file URI scheme falls short, and results in an attacker being able to read any file on the system. This issue only affects instances with a webdriver enabled, and ALLOW_FILE_URI
false or not defined.
Details
The check used for URL protocol, is_safe_url
, allows file:
as a URL scheme:
|
# Allowable protocols, protects against javascript: etc |
|
# file:// is further checked by ALLOW_FILE_URI |
|
SAFE_PROTOCOL_REGEX='^(http|https|ftp|file):' |
It later checks if local files are permitted, but one of the preconditions for the check is that the URL starts with file://
. The issue comes with the fact that the file URI scheme is not required to have double slashes.
A valid file URI must therefore begin with either file:/path
(no hostname), file:///path
(empty hostname), or file://hostname/path
.
— Wikipedia
|
if re.search(r'^file://', url, re.IGNORECASE): |
|
if not strtobool(os.getenv('ALLOW_FILE_URI', 'false')): |
|
raise Exception( |
|
"file:// type access is denied for security reasons." |
|
) |
PoC
- Open up a changedetection.io instance with a webdriver configured
- Create a new watch:
file:/etc/passwd
or a similar path for your operating system. Enable webdriver mode
- Wait for it to be checked
- Open preview
- Notice contents of the file
Summary
The validation for the file URI scheme falls short, and results in an attacker being able to read any file on the system. This issue only affects instances with a webdriver enabled, and
ALLOW_FILE_URI
false or not defined.Details
The check used for URL protocol,
is_safe_url
, allowsfile:
as a URL scheme:changedetection.io/changedetectionio/model/Watch.py
Lines 11 to 13 in e0abf0b
It later checks if local files are permitted, but one of the preconditions for the check is that the URL starts with
file://
. The issue comes with the fact that the file URI scheme is not required to have double slashes.changedetection.io/changedetectionio/processors/__init__.py
Lines 37 to 41 in e0abf0b
PoC
file:/etc/passwd
or a similar path for your operating system. Enable webdriver mode