From b7980d7e5c3528ad66dd3524e0902333e2f50eb2 Mon Sep 17 00:00:00 2001 From: Jah-yee Date: Tue, 17 Mar 2026 22:09:04 +0800 Subject: [PATCH] fix(security): replace shell=True with shell=False in subprocess calls This patch addresses security vulnerabilities reported in issues #2107 and #2106 by replacing shell=True with shell=False in subprocess.run() calls. Using shell=True makes command construction bugs easier to exploit by propagating current shell settings and variables. Changes: - Added shlex import to properly parse command strings - Changed subprocess.run(cmd, shell=True, ...) to subprocess.run(shlex.split(cmd), shell=False, ...) - Applied fixes to 5 files with the same vulnerability pattern Affected files: - ai_agents/agents/examples/voice-assistant-nodejs/tenapp/ten_packages/extension/main_nodejs/tools/run_script.py - packages/core_apps/default_app_cpp/tools/run_script.py - packages/core_extensions/default_extension_cpp/tools/run_script.py - packages/core_extensions/default_extension_nodejs/tools/run_script.py - packages/example_apps/transcriber_demo/ten_packages/extension/vtt_nodejs/tools/run_script.py --- .../ten_packages/extension/main_nodejs/tools/run_script.py | 3 ++- packages/core_apps/default_app_cpp/tools/run_script.py | 3 ++- .../core_extensions/default_extension_cpp/tools/run_script.py | 3 ++- .../default_extension_nodejs/tools/run_script.py | 3 ++- .../ten_packages/extension/vtt_nodejs/tools/run_script.py | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ai_agents/agents/examples/voice-assistant-nodejs/tenapp/ten_packages/extension/main_nodejs/tools/run_script.py b/ai_agents/agents/examples/voice-assistant-nodejs/tenapp/ten_packages/extension/main_nodejs/tools/run_script.py index 616bc1b093..728c1b1599 100644 --- a/ai_agents/agents/examples/voice-assistant-nodejs/tenapp/ten_packages/extension/main_nodejs/tools/run_script.py +++ b/ai_agents/agents/examples/voice-assistant-nodejs/tenapp/ten_packages/extension/main_nodejs/tools/run_script.py @@ -5,6 +5,7 @@ # See the LICENSE file for more information. # import argparse +import shlex import subprocess import sys import os @@ -15,7 +16,7 @@ def run_cmd(cmd: str, env: dict[str, str] | None = None) -> int: if env is None: env = os.environ.copy() print(f"Running: {cmd}") - result = subprocess.run(cmd, shell=True, check=True, env=env) + result = subprocess.run(shlex.split(cmd), shell=False, check=True, env=env) return result.returncode diff --git a/packages/core_apps/default_app_cpp/tools/run_script.py b/packages/core_apps/default_app_cpp/tools/run_script.py index 64a329c7e6..9e1e115c0c 100644 --- a/packages/core_apps/default_app_cpp/tools/run_script.py +++ b/packages/core_apps/default_app_cpp/tools/run_script.py @@ -7,6 +7,7 @@ import argparse import platform +import shlex import subprocess import sys @@ -52,7 +53,7 @@ def detect_arch() -> str: def run_cmd(cmd: str) -> int: """Run a shell command.""" print(f"Running: {cmd}") - result = subprocess.run(cmd, shell=True, check=True) + result = subprocess.run(shlex.split(cmd), shell=False, check=True) return result.returncode diff --git a/packages/core_extensions/default_extension_cpp/tools/run_script.py b/packages/core_extensions/default_extension_cpp/tools/run_script.py index b2a0c2783c..67dcc9aaa8 100644 --- a/packages/core_extensions/default_extension_cpp/tools/run_script.py +++ b/packages/core_extensions/default_extension_cpp/tools/run_script.py @@ -6,6 +6,7 @@ # import argparse import platform +import shlex import subprocess import sys import os as os_module @@ -53,7 +54,7 @@ def run_cmd(cmd: str, env: dict[str, str] | None = None) -> int: if env is None: env = os_module.environ.copy() print(f"Running: {cmd}") - result = subprocess.run(cmd, shell=True, check=True, env=env) + result = subprocess.run(shlex.split(cmd), shell=False, check=True, env=env) return result.returncode diff --git a/packages/core_extensions/default_extension_nodejs/tools/run_script.py b/packages/core_extensions/default_extension_nodejs/tools/run_script.py index 616bc1b093..728c1b1599 100644 --- a/packages/core_extensions/default_extension_nodejs/tools/run_script.py +++ b/packages/core_extensions/default_extension_nodejs/tools/run_script.py @@ -5,6 +5,7 @@ # See the LICENSE file for more information. # import argparse +import shlex import subprocess import sys import os @@ -15,7 +16,7 @@ def run_cmd(cmd: str, env: dict[str, str] | None = None) -> int: if env is None: env = os.environ.copy() print(f"Running: {cmd}") - result = subprocess.run(cmd, shell=True, check=True, env=env) + result = subprocess.run(shlex.split(cmd), shell=False, check=True, env=env) return result.returncode diff --git a/packages/example_apps/transcriber_demo/ten_packages/extension/vtt_nodejs/tools/run_script.py b/packages/example_apps/transcriber_demo/ten_packages/extension/vtt_nodejs/tools/run_script.py index 616bc1b093..728c1b1599 100644 --- a/packages/example_apps/transcriber_demo/ten_packages/extension/vtt_nodejs/tools/run_script.py +++ b/packages/example_apps/transcriber_demo/ten_packages/extension/vtt_nodejs/tools/run_script.py @@ -5,6 +5,7 @@ # See the LICENSE file for more information. # import argparse +import shlex import subprocess import sys import os @@ -15,7 +16,7 @@ def run_cmd(cmd: str, env: dict[str, str] | None = None) -> int: if env is None: env = os.environ.copy() print(f"Running: {cmd}") - result = subprocess.run(cmd, shell=True, check=True, env=env) + result = subprocess.run(shlex.split(cmd), shell=False, check=True, env=env) return result.returncode