This is a bad lock on an internal vault door, not a front-door deadbolt failure
Tenable plugin 121227 is a rollup for Oracle MySQL 5.6.x < 5.6.43, fixed in the January 2019 CPU and released as MySQL 5.6.43 on 2019-01-21. The bundle includes multiple flaws, but the meaningful ones for 5.6 are mostly *authenticated network* bugs in Server: Replication, Server: Optimizer, Server: PS, and related paths. The highest-impact representative issue is CVE-2019-2534 (CVSS 7.1), which can let a low-privileged attacker with MySQL protocol access read sensitive data and modify some data; others in the same bundle are primarily repeatable crash / hang conditions.
Oracle's top score in this set is technically fair in a lab, but it overstates enterprise urgency in the field. The chain starts with PR:L, which means the attacker already has a valid MySQL account and network reachability to the server; in a real estate of 10,000 hosts, that usually means *post-initial-access* or a compromised app/service account, not anonymous internet exploitation. No KEV listing, no strong public weaponization signal, and no RCE path keeps this out of the top patch queue unless the database listener is internet-exposed or shared broadly across sensitive apps.
4 steps from start to impact.
Reach the MySQL listener
3306, using a standard client such as mysql or any libmysqlclient-based tool. This is the first big friction point: most enterprise MySQL deployments are internal-only, behind security groups, VPN, bastions, or app-tier segmentation.- Target runs Oracle MySQL
5.6.42or earlier - Attacker can route to the MySQL listener over the network
- The listener is exposed beyond the local app tier
- Well-run environments do not expose MySQL directly to the internet
- DB firewalls, cloud SGs, and host ACLs often limit source IPs to app servers only
- Managed services and proxies may front the database instead of exposing raw MySQL
121227 itself is version-only and does not exploit the flaw.Obtain a low-privileged MySQL account
5.6 require at least PR:L, meaning a valid authenticated database user. In practice that usually comes from stolen app credentials, dumped config files, SSRF into an internal app tier, or an already-compromised workload using embedded DB credentials.- Valid MySQL username and password or equivalent authenticated access
- Account can reach the vulnerable code path over the MySQL protocol
- This is not unauthenticated exploitation
- Credential rotation, secret managers, and network separation shrink the reachable population
- Some accounts are heavily permission-scoped to one schema or one application
Trigger the vulnerable server path with crafted protocol traffic
mysql client or a custom PoC using libmysqlclient, the attacker sends crafted SQL / prepared-statement / replication-related requests that hit the affected code path. For CVE-2019-2529 and CVE-2019-2482, the likely operational outcome is a hang or repeatable crash; for CVE-2019-2534, the outcome can include unauthorized data access and limited data modification.- Target request reaches the vulnerable parser/optimizer/replication/PS logic
- Server remains on an affected build with no backported fix
- Oracle did not publish turn-key exploit steps in the advisory
- Different flaws in the bundle affect different subcomponents; not every authenticated user will hit every path cleanly
- Backported distro fixes can invalidate naive version assumptions
Land impact inside the database trust zone
CVE-2019-2534 path: access to sensitive records and some unauthorized write capability inside the same MySQL server. More commonly, the bundle behaves like availability abuse against a reachable database service. Either way, the blast radius is bounded by the database's own trust plane rather than turning into host-level code execution.- Compromised account has access to valuable schemas or replication-related functionality
- Database availability matters to upstream applications
- No host RCE is described in the relevant
5.6January 2019 issues - Schema-level permissions can sharply limit what stolen app creds can touch
- HA failover, clustering, or app retry logic can blunt pure DoS outcomes
The supporting signals.
| In-the-wild status | No authoritative evidence of active exploitation found in the sources reviewed, and the representative CVEs are not listed in CISA KEV. |
|---|---|
| Public PoC availability | I found no mainstream public GitHub/Exploit-DB weaponization tied to the 5.6.43 January 2019 MySQL issues. Practical abuse would use a normal mysql client or custom libmysqlclient requests rather than a turnkey exploit kit. |
| EPSS | FIRST publishes EPSS daily via API; third-party mirrors for representative CVEs in this bundle show low, sub-1% exploit-likelihood signals, which lines up with the lack of KEV and lack of public weaponization. |
| KEV status | Not KEV-listed in the CISA Known Exploited Vulnerabilities Catalog. |
| Highest vendor-rated path | CVE-2019-2534 carries the highest score in the 5.6 subset at CVSS 7.1 with vector AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N — network reachable, but requires authenticated access. |
| Affected versions | Oracle lists MySQL Server 5.6.42 and prior as affected for the key 5.6 January 2019 issues; Tenable scopes the plugin to MySQL 5.6.x < 5.6.43. |
| Fixed versions | Upstream fix is MySQL 5.6.43. Ubuntu addressed the broader January 2019 MySQL issue set by updating supported releases to 5.7.25. Percona rolled the same upstream fixes into Percona Server for MySQL 5.6.43-84.3. |
| Scanner / detection reality | Tenable explicitly says the plugin did not test exploitation and relied on the application's self-reported version. Treat findings on distro builds carefully because vendor backports can make version-only checks noisy. |
| Exposure population | This only turns ugly when MySQL is directly reachable. Internet exposure of port 3306 still exists at scale, but in mature enterprises the more common pattern is internal-only DB exposure, which materially narrows reachable attack surface. |
| Timeline | CVE records were published on 2019-01-16; Oracle shipped the fixed MySQL 5.6.43 release on 2019-01-21. |
noisgate verdict.
The decisive friction is the authenticated attacker requirement: the relevant 5.6 issues need MySQL protocol access plus at least a low-privileged account, which usually implies the attacker is already inside your environment or has already stolen app credentials. That sharply reduces the exposed population versus a true unauthenticated service-edge flaw, even though the top vendor CVSS reaches 7.1.
Why this verdict
- Downward adjustment: requires authenticated DB access —
PR:Lmeans the attacker already has MySQL credentials, which usually implies prior compromise of an app tier, stolen secrets, or insider reach. That is classic post-initial-access friction and the biggest reason this is not a HIGH in real enterprise operations. - Downward adjustment: reachable population is narrower than the CVSS implies — the attack only starts if the adversary can talk directly to the MySQL listener. In modern estates, many databases are internal-only and reachable only from app subnets, bastions, or proxies, so the practical attack surface is far smaller than an internet-edge service bug.
- Downward adjustment: no host takeover path — the meaningful
5.6issues here are data-plane abuse or DoS inside MySQL, not operating-system RCE. Even the strongest path,CVE-2019-2534, stays inside the database trust boundary.
Why not higher?
There is no evidence in the reviewed sources of KEV status, active exploitation, or broad public weaponization. More importantly, this is not unauthenticated remote code execution; the attacker must already be able to reach the DB and authenticate to it, which is a hard break from internet-scale wormable behavior.
Why not lower?
This is still a real security issue, not backlog lint. If an exposed or internally reachable MySQL server is using reusable app credentials, CVE-2019-2534 can turn that foothold into unauthorized access to sensitive data and some unauthorized writes, and the DoS issues can take application dependencies offline.
What to do — in priority order.
- Restrict
3306to known app sources — Collapse the reachable population with host firewalls, cloud security groups, or DB-tier ACLs so only approved app servers and admin jump points can talk to MySQL. For a MEDIUM verdict there is no mitigation SLA — treat this as hardening and go straight to remediation within 365 days unless the listener is internet-exposed. - Rotate and scope application DB credentials — These flaws become materially worse when the attacker can reuse broad service-account credentials. Reduce each app account to the minimum schemas and verbs it needs, rotate secrets out of flat files where possible, and complete this during normal hardening because there is no mitigation SLA for a MEDIUM verdict.
- Turn on DB audit and restart monitoring — You want visibility into unusual logins, odd prepared-statement activity, replication anomalies, and mysqld restart/crash behavior, because public scanner validation is weak here. For MEDIUM, deploy as part of routine control improvement while planning the actual version upgrade inside the remediation window.
- Prefer upgrade off the
5.6branch entirely — If you still have Oracle MySQL5.6, the security problem is bigger than this one plugin because the branch is long past current support expectations. Use the plugin as a forcing function to inventory holdouts and move them to a supported branch during the ≤365 day remediation window.
- A WAF does not help; this traffic is MySQL protocol, not HTTP.
- Relying on version-only scanner output is not enough on distro or vendor-backported builds; it can overstate exposure or miss package-level fixes.
- Assuming network isolation alone solves it is wrong if attackers already sit on an app server subnet or can reuse embedded service credentials.
Crowdsourced verification payload.
Run this on the target MySQL host. Invoke it as bash verify_mysql_5643.sh /usr/sbin/mysqld or simply bash verify_mysql_5643.sh if mysqld is in PATH; no root is required to read the binary version, but package metadata checks may return better results when run with standard local shell access.
#!/usr/bin/env bash
# verify_mysql_5643.sh
# Determine whether an Oracle/Percona-style MySQL 5.6 server is below 5.6.43.
# Outputs one of: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
TARGET="${1:-mysqld}"
have_cmd() {
command -v "$1" >/dev/null 2>&1
}
version_lt() {
# returns 0 if $1 < $2, else 1
local a b i
IFS='.' read -r -a a <<< "$1"
IFS='.' read -r -a b <<< "$2"
for ((i=0; i<3; i++)); do
local ai="${a[i]:-0}"
local bi="${b[i]:-0}"
if ((10#$ai < 10#$bi)); then
return 0
elif ((10#$ai > 10#$bi)); then
return 1
fi
done
return 1
}
extract_version() {
local out="$1"
# Handles strings like:
# /usr/sbin/mysqld Ver 5.6.42 for Linux on x86_64 ...
# mysql Ver 14.14 Distrib 5.6.42, for Linux ...
if [[ "$out" =~ Distrib[[:space:]]([0-9]+\.[0-9]+\.[0-9]+) ]]; then
echo "${BASH_REMATCH[1]}"
return 0
fi
if [[ "$out" =~ Ver[[:space:]]([0-9]+\.[0-9]+\.[0-9]+) ]]; then
echo "${BASH_REMATCH[1]}"
return 0
fi
if [[ "$out" =~ ([0-9]+\.[0-9]+\.[0-9]+) ]]; then
echo "${BASH_REMATCH[1]}"
return 0
fi
return 1
}
BIN=""
if [[ -x "$TARGET" ]]; then
BIN="$TARGET"
elif have_cmd "$TARGET"; then
BIN="$(command -v "$TARGET")"
elif have_cmd mysqld; then
BIN="$(command -v mysqld)"
else
echo "UNKNOWN: mysqld binary not found"
exit 2
fi
RAW="$($BIN --version 2>/dev/null || true)"
if [[ -z "$RAW" ]]; then
echo "UNKNOWN: unable to execute $BIN --version"
exit 2
fi
VER="$(extract_version "$RAW" || true)"
if [[ -z "$VER" ]]; then
echo "UNKNOWN: could not parse version from: $RAW"
exit 2
fi
# Package-manager heuristic: distro backports can make version-only checks unreliable.
# If this looks like a distro package string without an obvious Oracle/Percona upstream build,
# return UNKNOWN rather than falsely calling it vulnerable.
if echo "$RAW" | grep -Eiq '(ubuntu|deb|el[0-9]|fc[0-9]|suse|red hat|debian)'; then
if [[ "$VER" == 5.6.* ]]; then
echo "UNKNOWN: distro-packaged MySQL 5.6 detected ($VER); verify vendor backports before trusting version-only results"
exit 2
fi
fi
case "$VER" in
5.6.*)
if version_lt "$VER" "5.6.43"; then
echo "VULNERABLE: MySQL version $VER is below 5.6.43"
exit 1
else
echo "PATCHED: MySQL version $VER is 5.6.43 or later"
exit 0
fi
;;
5.7.*|8.*|9.*)
echo "PATCHED: host is not on the affected 5.6.x branch (detected $VER)"
exit 0
;;
*)
echo "UNKNOWN: detected version $VER is outside expected MySQL version patterns"
exit 2
;;
esac
If you remember one thing.
5.6.x MySQL instances from Tenable and your CMDB, then separate internet-reachable / broadly reachable listeners from app-internal ones and validate whether findings are upstream builds or distro-backported packages. My call is MEDIUM, so there is noisgate mitigation SLA — go straight to the 365-day remediation window; use that time to upgrade anything still on Oracle MySQL 5.6.42 or earlier to at least 5.6.43, and preferably off the 5.6 branch entirely, completing the actual patch/upgrade inside the noisgate remediation SLA of ≤365 days.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.