From efca9301cea54beb9c674399736573c6b7820822 Mon Sep 17 00:00:00 2001 From: Aliaksandr Barouski Date: Mon, 31 Jan 2022 11:18:56 -0800 Subject: [PATCH] Fixing potential security issue (#2108) An attacker could access random URL from the executing server if model is crafted. It happens because pd.read_json checks if the parameter is string contains URL and loads it in the case. The fix enforcing using parameter as a JSON. Co-authored-by: Alex Barouski --- python/prophet/serialize.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/prophet/serialize.py b/python/prophet/serialize.py index 85140ee..51c6a7c 100644 --- a/python/prophet/serialize.py +++ b/python/prophet/serialize.py @@ -8,6 +8,7 @@ from __future__ import absolute_import, division, print_function from collections import OrderedDict from copy import deepcopy +from io import StringIO import json import numpy as np @@ -145,7 +146,7 @@ def model_from_dict(model_dict): if model_dict[attribute] is None: setattr(model, attribute, None) else: - s = pd.read_json(model_dict[attribute], typ='series', orient='split') + s = pd.read_json(StringIO(model_dict[attribute]), typ='series', orient='split') if s.name == 'ds': if len(s) == 0: s = pd.to_datetime(s) @@ -159,7 +160,7 @@ def model_from_dict(model_dict): if model_dict[attribute] is None: setattr(model, attribute, None) else: - df = pd.read_json(model_dict[attribute], typ='frame', orient='table', convert_dates=['ds']) + df = pd.read_json(StringIO(model_dict[attribute]), typ='frame', orient='table', convert_dates=['ds']) if attribute == 'train_component_cols': # Special handling because of named index column df.columns.name = 'component'