CVE-2026-106439
Executive Summary
Hydra, the Python framework for configuring complex applications via hierarchical YAML/structured configs, stores legacy instantiate target blocklists and related execution-policy collections in mutable module-level state from version 1.3.4. An attacker who controls multiple sibling target entries in a config can resolve the module-level discard method through instantiate(), remove a denied target from the policy set, and then invoke that previously blocked target because sibling nodes are processed in insertion order against the same mutated, process-global policy structure. The result is weakening of an application-defined execution restriction and potential code execution with the application's own privileges.
The issue is fixed in Hydra 1.3.7 and 1.4.0.dev10. Because the vulnerable mechanism depends on an attacker's ability to influence Hydra config content that reaches instantiate(), the primary affected audience is any application that accepts configuration input from a semi-trusted source and relies on Hydra's legacy blocklist to constrain which targets may be instantiated.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The CWE classification is CWE-470, "Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')." The root defect is not an injection of untrusted bytes into a parser, but a policy-integrity failure: a security control that the framework exposes as mutable, process-global Python state can be modified through the same generic instantiation pathway that the control is supposed to govern.
Hydra's instantiate() API resolves configuration nodes into live Python objects by resolving a _target_ key (a class or callable reference) and invoking it with resolved parameters. Permissions around which targets may be instantiated are held in legacy module-level collections, specifically the blocklist hydra._internal.target_policy.UNCONTROLLED_EXECUTION_TARGETS. This set is a normal Python set object held at module scope, which means it is shared across every caller and every invocation for the lifetime of the process.
Because the set is mutable and reachable as an attribute of an importable module, a config node can name the set's discard method as its instantiate target, with the denied target supplied as the bound argument. When sibling nodes in a config group or list are processed in insertion order, an early sibling can carry that mutation and later siblings run after the policy has already been weakened. A following sibling that names a target removed from the blocklist will then resolve successfully, even though that target would have been denied had the policy been evaluated in an unmodified process.
The description notes one important limitation: a "narrow execution whitelist supplied by trusted Python code is not bypassed by the reported direct mutation path." In other words, the reported technique defeats the legacy denied-target mechanism, but a separately configured, code-controlled allowlist remains an effective boundary. This makes the practical severity highly dependent on deployment: applications that rely solely on the legacy blocklist are exposed, while applications that additionally enforce an allowlist defined in their own trusted code are substantially protected. The mutation is persistent — once a target is discarded from the process-global set, that effect survives across subsequent instantiate() calls in the same process, so a single successful config evaluation can degrade the control for all later operations in that process. NVD has not published a CVSS score for this CVE, and no EPSS score has been assigned.
Exploitation Scenarios
No public proof-of-concept is available for CVE-2026-106439, and no exploit code has been observed. The attack chain below is inferred from the vulnerability class and the mechanism described in the NVD entry; it deliberately avoids asserting implementation details not present in the source description.
Reconnaissance and target identification. The attacker needs to identify an application that (a) runs a Hydra version between 1.3.4 and 1.3.6 or before 1.4.0.dev10, (b) calls
instantiate()on configuration content influenced by the attacker, and (c) relies on Hydra's legacy instantiate target blocklist as its control against unwanted target execution. This is a configuration-content attack surface rather than a network service banner: the reachable condition is a config ingestion path, such as a configuration file, config submission field, or plugin descriptor that an application parses and then instantiates.Triggering the specific flaw class. The attacker supplies a config in which sibling target entries are processed in a defined order. The first sibling names the blocklist's
discardoperation — reachable ashydra._internal.target_policy.UNCONTROLLED_EXECUTION_TARGETS.discard— with the denied target as its argument. Because sibling nodes are processed in insertion order against the same mutated, process-global policy, this node executes before the later entry that needs the removed target. The effect is deletion of one entry from the deny set, not a crash or an injected payload.Payload/execution method at the vulnerability-class level. With the denied target removed, the subsequent sibling config entry can name that target and have
instantiate()resolve and invoke it. This is the CWE-470 pattern: externally controlled configuration selects code to be executed by the framework. Execution occurs with the privileges of the application process; Hydra itself is a Python library, so the executed target is Python-level code reachable in that interpreter's environment. No memory corruption, deserialization gadget chain, or shell metacharacter injection is required — the mechanism is abuse of a legitimate instantiation API against a weakened policy.Post-exploitation impact. Because the mutation lives in process-global state and persists, subsequent instantiation within the same process continues to see the weakened policy. An application that dynamically loads or re-instantiates config could therefore retain the exposure after the initial malicious config is gone. Impact is bounded by three things the attacker must obtain: influence over config content that reaches
instantiate(), the presence of a sensitive or otherwise restricted target in the process, and the absence of a code-defined allowlist. Where a trusted-code allowlist is in force, the description states the reported mutation path does not bypass it, and exploitation of that hardened configuration should be treated as unlikely.
Impact Assessment
Concrete business impact depends on what targets a deployment has placed on the legacy blocklist and what privileges the Hydra-using process holds. In the worst case, an attacker who influences config content can instantiate a target that the application explicitly intended to deny, gaining execution at the application's privilege level — potentially access to credentials, data stores, internal services, or host facilities reachable from that process. In containerized or service-account contexts this may translate into lateral movement or data exfiltration paths, depending on adjacent permissions.
The blast radius is constrained by the preconditions rather than by the flaw's mechanism. This is not a remote, unauthenticated, network-facing bug in the framework itself; it is exploitable only where configuration input is attacker-influenced and reaches instantiate(). CVSS subscores are estimated here because NVD has not published a vector or base score: the attack is network-reachable in the general sense (AV:N) but requires a high degree of specific deployment conditions (AC:H), typically requires the ability to contribute config content (PR:L), needs no user interaction (UI:N), and affects only the vulnerable process (S:U). Confidentiality, integrity, and availability impacts are assessed High because successful instantiation of a denied target generally means arbitrary code execution within the application's authority — but these are estimates, not vendor-published figures, and should not be cited as an official CVSS score for this CVE. Hydra is widely used for machine-learning experiment configuration and complex application configuration, meaning the population of affected applications is broad in reach though narrow in exposure per deployment. CVE-2026-106439 is not listed in CISA KEV, and no in-the-wild exploitation has been reported in the provided data.
Detection Guidance
Detection for this vulnerability is difficult at the network layer because the attack surface is usually a configuration document, not an HTTP request with distinctive syntax. The most reliable detections are at the host and application layer.
Sigma Rule
title: Hydra Instantiate Target Blocklist Mutation via Config
id: 3f9c1a44-hydra-cve-2026-106439
status: experimental
description: Detects Python process command lines or child processes consistent with
abuse of Hydra instantiate() where config content mutates the legacy denied-target policy.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-106439
author: valtersit.com Threat Intelligence
date: 2026/01/01
logsource:
category: process_creation
product: linux
detection:
selection_hydra:
CommandLine|contains:
- 'hydra._internal.target_policy'
- 'UNCONTROLLED_EXECUTION_TARGETS'
- 'instantiate('
selection_discard:
CommandLine|contains:
- '.discard'
condition: selection_hydra and selection_discard
falsepositives:
- Developers debugging Hydra target policy internals in lower environments
level: medium
tags:
- attack.execution
- attack.t1059
- cve.2026.106439
This rule is a heuristic: legitimate Hydra debugging sessions can match the hydra._internal.target_policy / .discard combination. Tune allowlists for developer workstations and CI pipelines before deploying at high volume.
YARA Rule
rule CVE_2026_106439_Hydra_Target_Policy_Mutation
{
meta:
description = "Detects config or source artifacts referencing Hydra blocklist mutation pattern (CVE-2026-106439)"
author = "valtersit.com Threat Intelligence"
date = "2026-01-01"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-106439"
severity = "medium"
strings:
$policy = "hydra._internal.target_policy" ascii wide
$blocklist = "UNCONTROLLED_EXECUTION_TARGETS" ascii wide
$discard = ".discard" ascii wide
$target = "_target_" ascii wide
$inst = "instantiate" ascii wide
condition:
(uint16(0) == 0x0A0D or uint16(0) == 0x0A0A or true) and
$policy and $blocklist and $discard and
any of ($target, $inst)
}
This is an artifact-scanning rule for configuration files and Python source, not a memory rule. It will fire on files that reference the internal policy module alongside a discard invocation — a strong indicator of either malicious config or deliberate testing.
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-106439 Hydra Instantiate Target Blocklist Mutation Attempt"; flow:established,to_server; http.request_body; content:"hydra._internal.target_policy"; nocase; content:"UNCONTROLLED_EXECUTION_TARGETS"; nocase; content:"discard"; nocase; distance:0; reference:cve,2026-106439; reference:url,nvd.nist.gov/vuln/detail/CVE-2026-106439; classtype:attempted-user; sid:2026106439; rev:1;)
Applicability caveat: this rule only helps where config content transits HTTP request bodies to a Hydra-based service. Deployments that ingest configs from files or message queues will not generate matching traffic, and generic config APIs will produce false negatives.
Elastic Detection
process where process.name : ("python", "python3", "python3.*") and
process.command_line : "*hydra._internal.target_policy*" and
process.command_line : "*.discard*"
Companion query for file-based config ingestion, using Elastic's file event categories:
file where event.action : ("creation", "modification") and
file.name : ("*.yaml", "*.yml", "*.json") and
file.path : "*" and
process.command_line : "*hydra*"
The second query is broad and will require tuning to specific configuration directories used by the Hydra application in scope.
Splunk SPL Query
index=app_logs OR index=endpoint
| eval cmd=coalesce(process_command_line, CommandLine)
| where match(cmd, "hydra\._internal\.target_policy") AND match(cmd, "UNCONTROLLED_EXECUTION_TARGETS")
| eval mutation=if(match(cmd, "discard"), "blocklist_mutation", "policy_reference")
| stats count min(_time) as first_seen max(_time) as last_seen values(mutation) as behaviors by host, user, cmd
| where behaviors="blocklist_mutation"
| convert ctime(first_seen) ctime(last_seen)
| sort - count
Wazuh OSSEC Rule
<group name="hydra,cve-2026-106439,">
<rule id="100439" level="10">
<decoded_as>json</decoded_as>
<field name="command_line">hydra\._internal\.target_policy</field>
<field name="command_line">UNCONTROLLED_EXECUTION_TARGETS</field>
<description>CVE-2026-106439: Possible Hydra instantiate target blocklist mutation (policy discard pattern) observed.</description>
<mitre>
<id>T1059</id>
</mitre>
<group>cve_2026_106439,execution,</group>
</rule>
<rule id="100440" level="12">
<if_sid>100439</if_sid>
<field name="command_line">\.discard</field>
<description>CVE-2026-106439: Hydra denied-target discard invocation detected - high confidence policy mutation attempt.</description>
<mitre>
<id>T1059</id>
</mitre>
</rule>
</group>
Both Wazuh rules depend on command-line capture in JSON-decoded events and should be validated against the deployment's decoder chain before production use.
Mitigation & Patch Guidance
Patch confidence: 0/4 (UNPATCHED — no patch evidence from any tracked source). The NVD description identifies fixed versions, but no vendor advisory, OSV entry, or tracked patch source corroborates the fix, so treat all remediation as verification-dependent: confirm the installed version and confirm the fix in your own environment.
Immediate mitigations.
- Upgrade to Hydra 1.3.7 or 1.4.0.dev10 or later; these are the versions the NVD description states contain the fix. Verify the installed version after upgrade rather than relying on manifest declarations.
- Until upgrade is possible, remove or restrict any pathway by which untrusted or semi-trusted input becomes Hydra configuration content that is passed to
instantiate(). The mutation requires attacker-influenced config, so cutting that path closes the exposure. - Enforce a code-defined execution allowlist in trusted Python code. The NVD description explicitly states the reported direct mutation path does not bypass a narrow execution whitelist supplied by trusted Python code, making an application-owned allowlist the strongest available compensating control.
- Where config ingestion is unavoidable, validate that submitted configs do not reference internal module paths (for example, anything under
hydra._internal) before instantiation.
Patch/upgrade steps.
- Pin Hydra to
>=1.3.7(stable line) or>=1.4.0.dev10(development line) in dependency manifests, and rebuild container images so the fixed version propagates. - Audit transitive dependencies for Hydra version ranges; a direct dependency pin does not protect you if a library pins an older Hydra.
- Re-run configuration-loading test suites after upgrade to confirm no legitimate target resolution regressed.
- Pin Hydra to
Long-term hardening.
- Treat any deny-list that is enforced through mutable, process-global state as an unreliable control, and migrate security-critical instantiation restrictions to allowlists defined in trusted application code.
- Isolate config interpretation from sensitive process privileges so that a policy bypass does not immediately equate to broad authority.
- Add monitoring for repeated
instantiate()failures or policy-related anomalies in Hydra-based services so attempts surface even when they are blocked. - Track the CVE record for a vendor advisory and a published CVSS vector; neither was available in the source data, and the vector given in this report is an estimate.
References
- NVD — CVE-2026-106439: https://nvd.nist.gov/vuln/detail/CVE-2026-106439 (primary source for mechanism, affected versions, and fixed releases).
- Hydra project repository and release notes for 1.3.7 / 1.4.0.dev10 — verify the fix commit and behavior change in the maintained codebase.
- CWE-470 — Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection'): https://cwe.mitre.org/data/definitions/470.html
- FIRST EPSS — no score assigned for CVE-2026-106439 at time of writing; consult https://www.first.org/epss/ for updates.
- CISA Known Exploited Vulnerabilities catalog — CVE-2026-106439 is not listed; verify current status at https://www.cisa.gov/known-exploited-vulnerabilities-catalog.
No threat actor campaigns or exploit-in-the-wild evidence are associated with CVE-2026-106439 in the available data. No public proof-of-concept or Nuclei template exists; the exploitation scenarios above are inferred from the vulnerability class and the mechanism described in the NVD entry.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.