Skip to content

Commit fe83e15

Browse files
committed
fix(security): sanitize file names to prevent path traversal
Ref: Mayuri-Chan/pyrofork@2f2d515
1 parent 2da2329 commit fe83e15

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

pyrogram/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,8 @@ async def handle_download(self, packet):
10211021
file_id, directory, file_name, in_memory, file_size, progress, progress_args = packet
10221022

10231023
os.makedirs(directory, exist_ok=True) if not in_memory else None
1024-
temp_file_path = os.path.abspath(re.sub("\\\\", "/", os.path.join(directory, file_name))) + ".temp"
1024+
mcfn = re.sub("\\\\", "/", os.path.join(directory, file_name))
1025+
temp_file_path = os.path.abspath(mcfn) + ".temp"
10251026
file = BytesIO() if in_memory else open(temp_file_path, "wb")
10261027

10271028
try:

pyrogram/methods/messages/download_media.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,8 @@ async def progress(current, total):
248248
directory = self.PARENT_DIR / (directory or DEFAULT_DOWNLOAD_DIR)
249249

250250
os.makedirs(directory, exist_ok=True) if not in_memory else None
251-
temp_file_path = os.path.abspath(re.sub("\\\\", "/", os.path.join(directory, file_name)))
251+
mcfn = re.sub("\\\\", "/", os.path.join(directory, file_name))
252+
temp_file_path = os.path.abspath(mcfn)
252253

253254
with open(temp_file_path, "wb") as file:
254255
file.write(thumb.getbuffer())
@@ -269,6 +270,16 @@ async def progress(current, total):
269270
mime_type = getattr(media, "mime_type", "")
270271
date = getattr(media, "date", None)
271272

273+
# CWE-22: Path Traversal: sanitize file name
274+
if media_file_name:
275+
# Remove any path components, keeping only the basename
276+
media_file_name = os.path.basename(media_file_name)
277+
# Remove null bytes which could cause issues
278+
media_file_name = media_file_name.replace("\x00", "")
279+
# Handle edge cases
280+
if not media_file_name or media_file_name in (".", ".."):
281+
media_file_name = ""
282+
272283
directory, file_name = os.path.split(file_name)
273284
# TODO
274285
file_name = file_name or media_file_name or ""

0 commit comments

Comments
 (0)