Cloudanix VulnDB

CVE-2024-3408

Critical · 9.8

CVSS

9.8

EPSS

78.0%

Published

Jun 6, 2024

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Attend

A vulnerable D-Tale analytics server can be remotely taken over without a valid login, potentially exposing or altering the data it can access.

Weaponized
Exploitation
Remote Unauthenticated
Attacker needs
None
Complexity
Low
Impact
Remote Code Execution
Component
Application
Class
Improper Input Validation
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

CVE-2024-3408 is an authentication bypass and remote code execution vulnerability in man-group/dtale 3.10.0 caused by a hardcoded Flask SECRET_KEY and insufficient validation of custom filter/update settings input. Because the signing key is predictable, an attacker can forge a valid Flask session cookie when authentication is enabled. The attacker can then abuse the /update-settings flow to bypass the intended enable_custom_filters restriction and submit malicious filter expressions that execute arbitrary code on the server. Successful exploitation gives unauthenticated network attackers code execution in the security context of the D-Tale application process, with potential confidentiality, integrity, and availability impact.

Why it matters to the business

An exposed vulnerable D-Tale instance can be taken over remotely without valid credentials. Because D-Tale is commonly used to inspect and manipulate datasets, exploitation may expose sensitive data, allow tampering with analysis outputs, disrupt business analytics workflows, or provide a foothold for broader infrastructure compromise. The CVSS score is critical, EPSS is high, and exploit maturity is listed as weaponized, so internet-accessible or internally shared instances should be treated as urgent even though the vulnerability is not currently listed in CISA KEV.

How an attack unfolds

An attacker first identifies a reachable D-Tale service and confirms it is running a vulnerable build. If authentication is enabled, the attacker uses the hardcoded Flask SECRET_KEY to craft a valid signed session cookie and appear authenticated. The attacker then sends crafted requests to the settings/update functionality, specifically abusing the /update-settings endpoint and custom filter handling. Because the application does not correctly enforce the enable_custom_filters control or properly validate filter expressions, the malicious filter payload is evaluated by the server. This results in arbitrary Python code execution under the D-Tale application account. From there, the attacker may read datasets available to the process, access environment variables and credentials, write files, launch reverse shells, install persistence, or pivot to adjacent systems depending on the host permissions and network access.

How to fix it

Upgrade D-Tale to a version that includes commit 32bd6fb4a63de779ff1e51823a456865ea3cbd13 or a later vendor release containing that fix. For source deployments, verify the running code includes commit 32bd6fb4a63de779ff1e51823a456865ea3cbd13. Rotate any Flask SECRET_KEY or application signing secrets and invalidate existing sessions after upgrade, because session cookies may have been forgeable before remediation. Restrict D-Tale access to trusted networks or behind strong authentication, and avoid exposing it directly to the internet. Disable or tightly restrict custom filter functionality unless explicitly required. Run D-Tale with a least-privileged service account, limit filesystem access to necessary data, and prevent the process from accessing unnecessary credentials, cloud metadata, SSH keys, or sensitive environment variables. Use network egress controls to reduce the impact of command execution, including blocking arbitrary outbound connections from analytics hosts where feasible. If compromise is suspected, rebuild the host or container from a trusted image after preserving forensic evidence.

How to confirm the fix worked

Confirm the installed D-Tale version or source commit and verify it is at or after 32bd6fb4a63de779ff1e51823a456865ea3cbd13. For Python package deployments, check package metadata with tools such as pip show dtale and compare against vendor release notes that include the fix. For Git-based deployments, run git rev-parse HEAD and git branch --contains 32bd6fb4a63de779ff1e51823a456865ea3cbd13. Validate that the Flask SECRET_KEY is not the vulnerable hardcoded value and is unique per deployment. After patching, ensure all active sessions are invalidated. From an unauthenticated client, verify that protected D-Tale functionality cannot be reached and that /update-settings rejects unauthorized requests. Confirm that custom filter execution is blocked when enable_custom_filters is disabled, and that filter inputs are treated as data rather than executable Python. Review reverse proxy, WAF, and application logs to ensure no post-remediation requests are succeeding against the vulnerable endpoint behavior.

Typical attack path

  1. Discover an exposed D-Tale web service through scanning, search engine indexing, internal reconnaissance, or application inventory data.
  2. Fingerprint the service version or behavior to determine whether it is likely running the vulnerable D-Tale 3.10.0 code path.
  3. Forge a Flask session cookie using the hardcoded SECRET_KEY to bypass authentication if authentication is enabled.
  4. Send crafted HTTP requests to /update-settings to alter or reach custom filter functionality despite enable_custom_filters not being enabled.
  5. Submit a malicious filter expression that is evaluated by the server and executes attacker-controlled Python code.
  6. Run operating system commands through the D-Tale Python process, such as downloading tools, opening a shell, or reading local files.
  7. Access datasets, credentials, environment variables, notebooks, mounted storage, or cloud metadata available to the application process.
  8. Establish persistence, exfiltrate data, or use the compromised server as a pivot point.

How to detect it

Review HTTP access logs from D-Tale, reverse proxies, load balancers, WAFs, and API gateways for requests to /update-settings, especially from unauthenticated users, unfamiliar IP addresses, scanners, or requests returning 200/500 responses shortly before process anomalies. Look for requests that include custom filter parameters, attempts to toggle enable_custom_filters, Python introspection syntax, shell metacharacters, or command-execution strings. Inspect Flask/D-Tale application logs for settings updates, unexpected session activity, deserialization/signature errors, stack traces from filter evaluation, and errors referencing custom filters. Examine endpoint telemetry for the D-Tale Python process spawning unexpected child processes such as sh, bash, cmd.exe, powershell.exe, curl, wget, nc, ncat, python, perl, or openssl. Search for new or modified files in temporary directories, application directories, user home directories, cron locations, systemd service paths, and SSH authorized_keys files around the time of suspicious web requests. Review outbound network connections from D-Tale hosts to unfamiliar IPs, especially immediately after /update-settings requests. Check environment-variable access, cloud metadata access, credential file reads, and anomalous database or object-store access from the D-Tale process. Because the vulnerability allows arbitrary code execution, absence of a single indicator does not rule out compromise; correlate web requests, process execution, file writes, and outbound network activity.

  • /update-settings
  • enable_custom_filters
  • custom_filters
  • SECRET_KEY
  • itsdangerous
  • __import__
  • os.system
  • subprocess.Popen
  • subprocess.call
  • eval(
  • exec(
  • popen(
  • /bin/sh
  • /bin/bash
  • cmd.exe
  • powershell.exe
  • curl
  • wget
  • nc
  • ncat
  • bash -i
  • python -c
  • python3 -c
  • /tmp/
  • /var/tmp/
  • /dev/shm/
  • authorized_keys
  • /etc/cron.d/
  • /etc/crontab
  • .service

What your security team should do

  • Immediately inventory all D-Tale deployments, including developer workstations, analytics servers, containers, notebooks, and internally exposed services.
  • Prioritize patching internet-accessible and shared multi-user D-Tale instances because exploitation is weaponized and EPSS is high.
  • Upgrade to a fixed build containing commit 32bd6fb4a63de779ff1e51823a456865ea3cbd13 or later, then restart services to ensure the patched code is running.
  • Rotate Flask SECRET_KEY values and invalidate all existing D-Tale sessions after applying the fix.
  • Place D-Tale behind SSO, VPN, IP allowlisting, or another strong access-control layer; do not expose it directly to the public internet.
  • Disable custom filters unless required, and review configuration for unsafe evaluation features.
  • Review logs and endpoint telemetry for historical exploitation before assuming patching alone has resolved the risk.
  • Investigate any D-Tale host where Python spawned shells, curl, wget, nc, bash, sh, PowerShell, or other unexpected child processes.
  • If exploitation is suspected, preserve logs and disk artifacts, isolate the host, rotate credentials accessible to the D-Tale process, and rebuild from a trusted baseline.
  • Add SIEM detections for suspicious /update-settings requests and Python process child execution from D-Tale services.

The record

man-group/dtale version 3.10.0 is vulnerable to an authentication bypass and remote code execution (RCE) due to improper input validation. The vulnerability arises from a hardcoded `SECRET_KEY` in the flask configuration, allowing attackers to forge a session cookie if authentication is enabled. Additionally, the application fails to properly restrict custom filter queries, enabling attackers to execute arbitrary code on the server by bypassing the restriction on the `/update-settings` endpoint, even when `enable_custom_filters` is not enabled. This vulnerability allows attackers to bypass authentication mechanisms and execute remote code on the server.

Affected packages

Ecosystem Package Introduced Fixed
PyPI dtale 0 32bd6fb4a63de779ff1e51823a456865ea3cbd13
PyPI dtale 0 No fix

Related vulnerabilities