MCP Scanner
ScanLeaderboardDocsSign in
Home/SalesforceAIResearch/enterprise-deep-research/Results
0F

enterprise-deep-research

SalesforceAIResearch/enterprise-deep-research

96 files · 21 findings

Share GitHub SARIF JSON
7 critical14 high
Tool Poisoning2 issues
Command Injection3 issues
Path Traversal3 issues
SSRF10 issues
Credential Theft2 issues
Excessive Permissionsclean
Missing Authclean
SSRF10

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

ai-research-assistant/src/components/DatabaseUpload.js:17
return isDevelopment ? 'http://localhost:8000' : '';
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

Tool Poisoning2

Cross-tool shadowing of system commands

high

Tool names mimicking built-in system tools (e.g., 'bash', 'shell', 'terminal') can trick the LLM into routing actions to a malicious handler.

app.py:124
"/", StaticFiles(directory="ai-research-assistant/build", html=True), name="root"
How to fix

Rename the tool to avoid colliding with system commands (bash, shell, exec, etc.).

Path Traversal3

path.join/resolve with user-controlled input

high

Using path.join or path.resolve with variables from user input without validation can lead to directory traversal.

benchmarks/process_deepconsult.py:220
output_file = os.path.join(args.output_dir, output_filename)
How to fix

Sanitize user input before passing to path.join/resolve. Use path.normalize() and check for '..' sequences.

Credential Theft2

Hardcoded API key or token literal

critical

String literals matching known API key prefixes (sk-, ghp_, AKIA, xoxb-, etc.) or long base64-like strings may expose secrets in source code.

math_client.py:20
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "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")
How to fix

Remove hardcoded secrets from source code. Use environment variables or a secrets manager.

Command Injection3

Python subprocess with shell=True

critical

subprocess calls with shell=True execute commands through the shell, enabling injection attacks.

src/tools/examples/list_mcp_servers.py:152
result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=5)  # Added 5 second timeout
How to fix

Set shell=False in subprocess calls and pass command as a list.

Data Exfiltration1

Writing session data to external storage

high

Sending conversation, prompt, or session data to external storage services may leak sensitive user interactions.

src/tools/examples/simple_math_client.py:104
self.process.stdin.write(json.dumps(message).encode() + b"\n")
How to fix

Do not write session or conversation data to external storage. Keep user interaction data within the authorized session boundary.

Supply Chain
clean
Rug Pullclean
Data Exfiltration1 issue

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

ai-research-assistant/src/components/InitialScreen.js:283
const apiBaseUrl = isDevelopment ? 'http://localhost:8000' : ''
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

ai-research-assistant/src/components/InitialScreen.js:569
return isDevelopment ? 'http://localhost:8000' : ''
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

HTTP request with unvalidated URL parameter

high

Passing user-controlled variables directly to fetch, axios, or http.get without URL validation enables SSRF attacks.

ai-research-assistant/src/services/researchService.js:308
const response = await fetch(apiUrl, {
How to fix

Validate and sanitize all URLs before making HTTP requests. Use an allowlist of permitted domains.

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

src/tools/examples/list_mcp_servers.py:28
base_url="http://localhost:3000"
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

src/tools/examples/list_mcp_servers.py:58
base_url="http://localhost:3000"
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

src/tools/examples/list_mcp_servers.py:81
base_url="http://localhost:3000"
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

src/tools/examples/list_mcp_servers.py:136
#     url="http://localhost:8931/sse" # Using SSE endpoint from docs
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

src/tools/examples/list_mcp_servers.py:166
url = f"http://localhost:{server['default_port']}/mcp/v1/initialize"
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

Request to localhost or loopback address

high

Requests targeting 127.0.0.1, localhost, or [::1] may access internal services not intended to be exposed.

src/tools/examples/puppeteer_research.py:54
base_url="http://localhost:3000"
How to fix

Block requests to localhost and loopback addresses. Implement URL validation that rejects 127.x.x.x and ::1.

HTML comment injection in tool description

critical

HTML comments in tool descriptions may contain hidden instructions intended to influence LLM reasoning.

src/graph.py:2809
markdown_report = re.sub(r"<!--.*?-->", "", markdown_report, flags=re.DOTALL)
How to fix

Remove HTML comments from description strings. Use source code comments instead.

path.join/resolve with user-controlled input

high

Using path.join or path.resolve with variables from user input without validation can lead to directory traversal.

benchmarks/process_drb.py:54
file_path = os.path.join(args.input_dir, file)
How to fix

Sanitize user input before passing to path.join/resolve. Use path.normalize() and check for '..' sequences.

Access to sensitive system files

critical

Direct access to sensitive files like /etc/passwd, /etc/shadow, or SSH keys indicates potential data exfiltration.

e2b.toml:16
start_cmd = "/root/.jupyter/start-up.sh"
How to fix

Remove direct references to sensitive system files. Use a restricted file access layer.

Hardcoded API key or token literal

critical

String literals matching known API key prefixes (sk-, ghp_, AKIA, xoxb-, etc.) or long base64-like strings may expose secrets in source code.

math_client_new.py:20
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "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")
How to fix

Remove hardcoded secrets from source code. Use environment variables or a secrets manager.

Python subprocess with shell=True

critical

subprocess calls with shell=True execute commands through the shell, enabling injection attacks.

src/tools/examples/list_mcp_servers.py:212
result = subprocess.run(server["install_command"], shell=True)
How to fix

Set shell=False in subprocess calls and pass command as a list.

Python subprocess with shell=True

critical

subprocess calls with shell=True execute commands through the shell, enabling injection attacks.

src/tools/examples/list_mcp_servers.py:235
subprocess.run(server["run_command"], shell=True)
How to fix

Set shell=False in subprocess calls and pass command as a list.