Skip to content

Commit 861bb6d

Browse files
vxgmicheljquast
andauthored
Hash usernames to prevent path traversal on save directories (#35)
* Hash usernames to prevent path traversal on save directories * Make sure the ROM file exists before running the SSH server --------- Co-authored-by: Jeff Quast <contact@jeffquast.com>
1 parent 2800c1e commit 861bb6d

1 file changed

Lines changed: 15 additions & 7 deletions

File tree

gambaterm/ssh.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
import time
55
import hmac
6+
import hashlib
67
import asyncio
78
import argparse
89
import traceback
@@ -112,14 +113,16 @@ async def ssh_process_handler(process: SSHServerProcess[str]) -> int:
112113
console_cls.add_console_arguments(parser)
113114
namespace = parser.parse_args(command.split(), namespace)
114115

115-
# Manage save directory
116+
# Manage save directory — hash username to prevent path traversal
116117
if "save_directory" in namespace.__dict__:
117-
save_directory = (
118-
None
119-
if getattr(namespace, "input_file", False)
120-
else Path("ssh_save") / username
121-
)
122-
setattr(namespace, "save_directory", save_directory)
118+
if getattr(namespace, "input_file", False):
119+
setattr(namespace, "save_directory", None)
120+
else:
121+
safe_name = hashlib.sha256(username.encode("utf-8")).hexdigest()[:16]
122+
save_directory = Path("ssh_save") / safe_name
123+
save_directory.mkdir(parents=True, exist_ok=True)
124+
(save_directory / "username").write_text(username)
125+
setattr(namespace, "save_directory", save_directory)
123126

124127
# Pop console arguments and extract configuration
125128
console_callback = console_cls.pop_console_arguments(namespace)
@@ -457,6 +460,11 @@ def main(
457460
"Both `--password` and `--no-auth` cannot be provided at the same time"
458461
)
459462

463+
# Make sure that the ROM file exists before starting the server
464+
rom_path: Path = namespace.romfile
465+
if not rom_path.exists():
466+
raise SystemExit(f"ROM file `{rom_path}` does not exist")
467+
460468
# Run an executor with no limit on the number of threads
461469
try:
462470
with ThreadPoolExecutor(max_workers=32) as executor:

0 commit comments

Comments
 (0)