This is leaving the warehouse door open because the lock used to be optional and the loading bay faces the street
This finding is not a neat version-bounded code bug; it is an exposure condition. Any self-managed Elasticsearch node or cluster that is remotely reachable and has security disabled can leak cluster metadata and, in many deployments, the indexed data itself over the HTTP API. The risk is concentrated in older operational patterns: versions before 8.0 did not auto-enable security, and versions before 6.8.0 / 7.1.0 did not include core security features in the free tier, so insecure deployments were historically common. Even on 8.x, you can still end up exposed if security auto-configuration was skipped or explicitly disabled.
Tenable calling this MEDIUM underrates what actually happens on a reachable host. The exploit is not sophisticated at all: if the service answers unauthenticated requests, the attacker can enumerate indices and often dump sensitive data with curl or standard Elasticsearch tooling. The real friction is reachability—you must be on a network path to the node—but once that condition is met, this behaves more like a ready-made data breach than a garden-variety informational finding.
4 steps from start to impact.
Find a reachable node
masscan sweeps to identify hosts speaking Elasticsearch on TCP/9200 or on alternate HTTP ports. Because the service advertises itself clearly, fingerprinting is easy once a TCP path exists.- The Elasticsearch HTTP interface is reachable from the attacker's network position
- A firewall, proxy, or load balancer forwards requests to the node
- By default Elasticsearch binds to
localhost, so someone had to intentionally expose it - A modern NGFW, private VPC design, or VPN-only access usually kills this step
101025 all cover this class well when the scanner has network reachability.Confirm missing authentication
curl or a browser to endpoints like /, /_cluster/health, or /_cat/indices. If the server returns 200 and cluster data instead of 401, the lock is off.- Security is disabled, misconfigured, or anonymous access is effectively over-permissive
- HTTP requests reach the Elasticsearch API directly
- Reverse proxies can require auth even if Elasticsearch itself does not
- Some deployments leak only metadata while blocking broader index reads
/_cat/* or /_search requests are high-signal. Vulnerability scanners detect the open condition, but not always the full blast radius.Enumerate and read data
curl, httpie, or elasticdump, the attacker lists indices, mappings, shard state, and then pulls documents via _search, scroll APIs, or bulk export tooling. In logging and observability stacks, that often means credentials, tokens, internal hostnames, PII, or operational telemetry are one API call away.- The exposed node stores sensitive indices or permits cluster-wide reads
- The attacker can issue standard Elasticsearch read APIs
- Least-privilege proxy rules, IP allowlists, or segmentation can limit accessible data
- Large clusters may slow bulk exfiltration and create noisy traffic
_search, scroll, _mget, _cat/indices, or atypical data volumes from unknown source IPs. DLP and egress monitoring help here; many vuln scanners stop at exposure confirmation.Exploit the business impact
- Read access exists for exfiltration, or write/delete access exists for destruction
- The stored data has operational, privacy, or credential value
- Snapshot backups and immutable logging reduce the damage from wiping
- Network egress controls and alerting can interrupt bulk theft
DELETE on indices, sudden index count drops, unexpected snapshot actions, and abnormal outbound transfer from the cluster or proxy tier.The supporting signals.
| In-the-wild status | Yes, exposed Elasticsearch is a repeatedly exploited target. CERT-EU documented automated wiping activity against internet-exposed Elasticsearch starting 2020-03-24, and noted earlier destructive/extortion patterns as well. |
|---|---|
| Proof-of-concept availability | Trivial; no exploit kit required. A browser or curl is enough to verify the condition, and common tooling like elasticdump can export data at scale. |
| EPSS | N/A. This is not tied to a single CVE, so there is no authoritative EPSS entry. |
| KEV status | Not KEV-listed. There is no CVE-backed KEV entry for this exposure condition, but that does not mean low operational risk. |
| Vendor severity / CVSS | Tenable: MEDIUM. No CVSS vector or score is published on the plugin page, which is part of why the default label undersells the breach potential. |
| Affected versions | Any self-managed Elasticsearch deployment that is reachable and does not enforce authentication. Practically, older fleets are riskier: pre-8.0 did not auto-enable security, and pre-6.8.0 / 7.1.0 lacked free core security features in the default distribution. |
| Fixed version / backports | No single fixed build. This is primarily a configuration exposure. Elastic made core security free in 6.8.0 and 7.1.0, and enables security automatically on first start in 8.0+. |
| Scanning / exposure reality | Broad exposure history. Shodan's own guidance says searching for the Elasticsearch service by port yields nearly a million results, and Shadowserver classifies open Elasticsearch exposure as HIGH severity. |
| Disclosure / publication | Tenable lists the vulnerability publication date as 2017-06-01 and published plugin 101025 on 2017-06-23. |
| Reporting / research context | Detection is documented by Tenable; broader exposure and abuse patterns are documented by Elastic, Shadowserver, Censys, and CERT-EU. |
noisgate verdict.
The deciding factor is exploit simplicity after reachability: if an attacker can hit the HTTP API, this often collapses straight into data exposure with no exploit development, no credentials, and sometimes no special tooling beyond curl. I did not push this to CRITICAL because the main prerequisite—network reachability to Elasticsearch—removes a large fraction of real enterprise deployments from direct attack, especially where clusters are private or fronted by controls.
Why this verdict
- Upgrade from MEDIUM: once reachable, the attacker often needs nothing more than unauthenticated HTTP requests to enumerate and read data
- Real-world amplifier: Elasticsearch frequently contains logs, telemetry, PII, tokens, internal hostnames, and other high-value material that accelerates lateral movement
- Internet-exposed population is non-trivial: Shadowserver actively reports open Elasticsearch and Shodan has historically shown enormous exposure volume
- Exploit chain is short: no memory corruption, gadget chain, or auth bypass research is needed; this is direct API abuse
- Active abuse history matters: exposed Elasticsearch has been hit by automated wipe and extortion campaigns, so this is not a theoretical red-team-only condition
- Downward pressure applied: the attacker still needs network position to the API, which means private VPC placement, VPN gating, and firewalling materially reduce exposure
Why not higher?
This is not a universal unauthenticated internet RCE. The attacker needs a route to the Elasticsearch HTTP interface, and well-run enterprises usually keep clusters off the public internet or behind access controls. Also, some exposed nodes leak metadata more readily than full document contents, so the blast radius is deployment-dependent.
Why not lower?
Scoring this as MEDIUM treats it like a mild informational leak, which is not how these incidents play out. On a reachable cluster, the path from detection to bulk data theft is short, cheap, and historically abused at scale.
What to do — in priority order.
- Block direct access to the HTTP API — Put Elasticsearch behind private networking, security groups, or an allowlist-only reverse proxy and remove broad reachability to port
9200. Because there is active exploitation history against exposed Elasticsearch, do this immediately, within hours, not on the normal HIGH timeline. - Enforce authentication — Enable
xpack.securityand require authenticated access for all API calls unless a narrowly defined anonymous profile is absolutely required. Treat this as the primary compensating control and deploy immediately, within hours. - Require TLS and authenticated proxies — Terminate only through a controlled proxy or load balancer that enforces auth, source restrictions, and logging before traffic reaches Elasticsearch. Deploy within hours as a fast containment layer if native security cannot be turned on the same day.
- Audit for data exposure and destructive APIs — Review HTTP/API logs for unauthenticated
/_cat/*,_search, scroll, snapshot, andDELETEactivity, and alert on unknown source IPs. Start the hunt immediately because prior exposure may already have resulted in silent reads. - Snapshot and harden backups — Create verified snapshots and ensure backup storage is separately protected so a wipe or ransom event does not become an outage crisis. For a HIGH verdict this should be completed within 30 days, but exposure containment still comes first within hours.
- A WAF alone does not solve this if Elasticsearch is directly exposed or reachable on alternate paths; the API is legitimate HTTP and easy to abuse.
- Host EDR alone won't stop data reads through valid REST endpoints; this is an application exposure problem, not a malware signature problem.
- Relying on obscurity or non-default ports fails because scanners fingerprint the service, not just
9200. - Only patching the OS or Java runtime does nothing here if authentication remains off and the API is still reachable.
Crowdsourced verification payload.
Run this on an auditor workstation or scanner host that has the same network path an attacker would have; that matters more than local shell access. Invoke it as bash check_es_open.sh http://es-node.example.com:9200 or against https:// if applicable. No root is required; the script performs only unauthenticated read-only HTTP checks and prints VULNERABLE, PATCHED, or UNKNOWN.
#!/usr/bin/env bash
# check_es_open.sh
# Read-only exposure check for unauthenticated Elasticsearch access.
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN, 3=USAGE
set -u
TARGET="${1:-}"
if [[ -z "$TARGET" ]]; then
echo "Usage: $0 <http[s]://host:port>"
exit 3
fi
CURL_OPTS=(--silent --show-error --location --max-time 10 --connect-timeout 5)
TMP_BODY="$(mktemp)"
trap 'rm -f "$TMP_BODY"' EXIT
request() {
local url="$1"
local code
code=$(curl "${CURL_OPTS[@]}" -o "$TMP_BODY" -w '%{http_code}' "$url" 2>/dev/null) || return 99
echo "$code"
return 0
}
looks_like_es_root() {
grep -Eq 'cluster_name|cluster_uuid|version|tagline' "$TMP_BODY"
}
# 1) Root endpoint: tells us whether the API is exposed and if auth is enforced.
code=$(request "$TARGET/")
rc=$?
if [[ $rc -ne 0 ]]; then
echo "UNKNOWN - could not connect to $TARGET/"
exit 2
fi
if [[ "$code" == "401" || "$code" == "403" ]]; then
echo "PATCHED - root endpoint requires authentication or is blocked ($code)"
exit 0
fi
if [[ "$code" == "200" ]] && looks_like_es_root; then
# 2) Try a common read endpoint to confirm unauthenticated data/metadata access.
code2=$(request "$TARGET/_cat/indices?format=json")
rc2=$?
if [[ $rc2 -eq 0 && "$code2" == "200" ]]; then
echo "VULNERABLE - unauthenticated Elasticsearch API access confirmed; _cat/indices returned 200"
exit 1
fi
code3=$(request "$TARGET/_cluster/health")
rc3=$?
if [[ $rc3 -eq 0 && "$code3" == "200" ]]; then
echo "VULNERABLE - unauthenticated cluster metadata access confirmed; _cluster/health returned 200"
exit 1
fi
# Root exposed but deeper reads blocked: still an exposure condition, but impact may be reduced.
echo "VULNERABLE - Elasticsearch root endpoint is accessible without authentication; deeper read endpoints were not confirmed"
exit 1
fi
if [[ "$code" == "301" || "$code" == "302" || "$code" == "307" || "$code" == "308" ]]; then
echo "UNKNOWN - request redirected; retest the final URL or proxy target"
exit 2
fi
if [[ "$code" == "000" ]]; then
echo "UNKNOWN - no HTTP response received"
exit 2
fi
echo "UNKNOWN - unexpected response code $code from $TARGET/"
exit 2
If you remember one thing.
Sources
- Tenable Plugin 101025
- Elastic Docs - Minimal security setup
- Elastic Docs - Networking settings
- Elastic Blog - Security for Elasticsearch is now free
- Elastic Docs - Automatic security setup
- Shadowserver - Open Elasticsearch Report
- Censys - How to Make Sure Your Elasticsearch Databases Aren’t Exposed
- CERT-EU Threat Memo - Attacks on Elasticsearch databases
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.