Skip to content

Commit 4526d64

Browse files
authored
Merge pull request #616 from odaysec/dev
Fix uncontrolled data used in path expression
2 parents 886ba8f + d8aa5cd commit 4526d64

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

src/agent/deep_research/deep_research_agent.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1111,7 +1111,12 @@ async def run(
11111111
}
11121112

11131113
self.current_task_id = task_id if task_id else str(uuid.uuid4())
1114-
output_dir = os.path.join(save_dir, self.current_task_id)
1114+
safe_root_dir = "./tmp/deep_research"
1115+
normalized_save_dir = os.path.normpath(save_dir)
1116+
if not normalized_save_dir.startswith(os.path.abspath(safe_root_dir)):
1117+
logger.warning(f"Unsafe save_dir detected: {save_dir}. Using default directory.")
1118+
normalized_save_dir = os.path.abspath(safe_root_dir)
1119+
output_dir = os.path.join(normalized_save_dir, self.current_task_id)
11151120
os.makedirs(output_dir, exist_ok=True)
11161121

11171122
logger.info(

src/webui/components/deep_research_agent_tab.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ async def run_deep_research(webui_manager: WebuiManager, components: Dict[Compon
7474
task_topic = components.get(research_task_comp, "").strip()
7575
task_id_to_resume = components.get(resume_task_id_comp, "").strip() or None
7676
max_parallel_agents = int(components.get(parallel_num_comp, 1))
77-
base_save_dir = components.get(save_dir_comp, "./tmp/deep_research")
77+
base_save_dir = components.get(save_dir_comp, "./tmp/deep_research").strip()
78+
safe_root_dir = "./tmp/deep_research"
79+
normalized_base_save_dir = os.path.abspath(os.path.normpath(base_save_dir))
80+
if os.path.commonpath([normalized_base_save_dir, os.path.abspath(safe_root_dir)]) != os.path.abspath(safe_root_dir):
81+
logger.warning(f"Unsafe base_save_dir detected: {base_save_dir}. Using default directory.")
82+
normalized_base_save_dir = os.path.abspath(safe_root_dir)
83+
base_save_dir = normalized_base_save_dir
7884
mcp_server_config_str = components.get(mcp_server_config_comp)
7985
mcp_config = json.loads(mcp_server_config_str) if mcp_server_config_str else None
8086

0 commit comments

Comments
 (0)