[SECURITY] Prevent reading of any local files in reportlab (CVE-2026-57535)

This commit is contained in:
Raphael Michel
2026-06-25 16:19:38 +02:00
committed by Raphael Michel
parent 3953d57c2e
commit 257bb2e4b7
3 changed files with 26 additions and 7 deletions
+1 -1
View File
@@ -30,7 +30,7 @@ class PretixHelpersConfig(AppConfig):
from .monkeypatching import monkeypatch_all_at_ready
monkeypatch_all_at_ready()
# Ensure reportlab does not make any calls to the internet
# Ensure reportlab does not make any calls to the internet or the local disk
from reportlab import rl_config
rl_config.trustedHosts = []
rl_config.trustedSchemes = ['data']
+21
View File
@@ -24,8 +24,11 @@ from datetime import datetime
from http import cookies
from PIL import Image
from django.core.exceptions import SuspiciousFileOperation
from requests.adapters import HTTPAdapter
from pretix.helpers.reportlab import ThumbnailingImageReader
def monkeypatch_vobject_performance():
"""
@@ -95,8 +98,26 @@ def monkeypatch_cookie_morsel():
cookies.Morsel._reserved.setdefault("partitioned", "Partitioned")
def monkeypatch_reportlab_imagereader():
from reportlab.lib import utils
old_init = utils.ImageReader.__init__
def new_init(self, fileName, ident=None): # noqa
if not isinstance(fileName, Image.Image) and not hasattr(fileName, 'read') and not hasattr(fileName, 'str'):
if not isinstance(self, ThumbnailingImageReader):
# ThumbnailingImageReader is only used by us explicitly and not by using <img> in html, so it is safe
raise SuspiciousFileOperation("reportlab should not be reading images from disk")
return types.MethodType(old_init, self)(
fileName, ident
)
utils.ImageReader.__init__ = new_init
def monkeypatch_all_at_ready():
monkeypatch_vobject_performance()
monkeypatch_pillow_safer()
monkeypatch_requests_timeout()
monkeypatch_cookie_morsel()
monkeypatch_reportlab_imagereader()
+4 -6
View File
@@ -20,6 +20,7 @@
# <https://www.gnu.org/licenses/>.
#
import pytest
from django.core.exceptions import SuspiciousFileOperation
from reportlab.platypus import Paragraph
@@ -29,24 +30,21 @@ def test_http_access_disabled(monkeypatch):
monkeypatch.setattr('socket.socket', guard)
with pytest.raises(OSError, match="Cannot open resource"):
with pytest.raises(SuspiciousFileOperation, match="should not be reading images from disk"):
Paragraph(
'<img src="https://static.pretix.cloud/static/pretixeu/img/opengraph.png"/>',
)
def test_file_access_disabled_scheme(monkeypatch):
with pytest.raises(OSError, match="Cannot open resource"):
with pytest.raises(SuspiciousFileOperation, match="should not be reading images from disk"):
Paragraph(
'<img src="file:///etc/passwd" />',
)
@pytest.mark.xfail
def test_file_access_disabled_direct(monkeypatch):
# Unfortunately this is not prevented by the reprotlab config, but the risk is low since only valid images
# can be used.
with pytest.raises(OSError, match="Cannot open resource"):
with pytest.raises(SuspiciousFileOperation, match="should not be reading images from disk"):
Paragraph(
'<img src="/etc/passwd" />',
)