← Back to Feed CACHED · 2026-06-29 22:58:09 · CACHE_KEY CVE-2026-9267
CVE-2026-9267 · CWE-125 · Disclosed 2026-06-29

Eclipse tinydtls before commit b3efd41ad111a4920f599f51ffa4f5e9f1e72221 contains an out-of-bounds read…

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

A constrained-IoT DTLS library reads a few bytes past a buffer while parsing a server certificate handshake message

Eclipse tinydtls is a small-footprint DTLS implementation designed for constrained IoT devices — think CoAP endpoints, Zephyr/RIOT/Contiki sensors, the kind of node where mbedTLS or OpenSSL are too heavy. The flaw lives in check_server_certificate(), the client-side routine that validates an ECDSA certificate received during the DTLS handshake (ServerCertificate/ServerKeyExchange). A malformed cert message lets the parser walk past the end of the input buffer, producing a CWE-125 out-of-bounds read. All commits before b3efd41 are affected; the fix is in tip-of-trunk.

There is no vendor CVSS for this CVE — tinydtls is an Eclipse research-grade library and the advisory does not carry a scored vector. An out-of-bounds *read* in a handshake-time cert parser is genuinely on the low-to-moderate end: it's reachable pre-auth on the client side, but the realistic impact is a crash (DoS of one IoT device) or, on platforms with side-channel-readable memory, a small information leak. There is no documented path to RCE, no heap corruption, and the affected role — a sensor or CoAP client talking to a malicious DTLS server — is a narrow, low-value target. *LOW* is the honest assessment.

"Out-of-bounds *read* in a niche IoT DTLS stack's cert parser — no RCE, no auth bypass, blast radius is one constrained device per chain."
02 · The Attack Path

3 steps from start to impact.

STEP 01

Attacker stands up a malicious DTLS server

The bug is in *client-side* certificate validation, so the attacker must induce a vulnerable tinydtls client to initiate a DTLS handshake against attacker-controlled infrastructure. This means either running a rogue CoAPs endpoint the device is configured to talk to, or sitting on-path between the device and its legitimate server (UDP, so trivially spoofable in the absence of source-address validation). Tooling: a patched openssl s_server -dtls or a custom scapy/tinydtls-fork harness that emits a crafted ServerCertificate.
Conditions required:
  • Attacker controls a DTLS endpoint the client will connect to, OR has on-path position on the UDP flow
  • Client is configured to use ECDHE-ECDSA cipher suite (the cert-bearing path)
Where this breaks in practice:
  • Most tinydtls deployments use PSK (pre-shared key), not raw-public-key/ECDSA — the vulnerable code path is never reached
  • Devices typically only talk to a hardcoded backend over a known network path; arbitrary internet exposure is rare for constrained IoT
Detection/coverage: No commercial scanner fingerprints tinydtls clients; SBOM tools (Syft, Snyk SBOM) will flag the library if vendored. Network IDS has no signature for the malformed handshake.
STEP 02

Send malformed ServerCertificate to trigger OOB read

During the handshake the attacker delivers a ServerCertificate (or ServerKeyExchange) record whose length fields lie about the embedded ECDSA structure, so check_server_certificate() advances its parse pointer past the message boundary. Weaponization is a few dozen bytes of malformed ASN.1/raw-public-key payload — proof-of-concept territory, no published exploit.
Conditions required:
  • The malicious server completes enough of the handshake to reach the certificate exchange step
  • Client invokes the vulnerable parse routine
Where this breaks in practice:
  • Many embedded targets have MPU/MMU memory protection that will trap a read past a region boundary as a fault rather than leak
  • Compiler hardening (-fstack-protector, _FORTIFY_SOURCE) doesn't help here — this is heap/static OOB, not stack smash
Detection/coverage: AddressSanitizer or Valgrind catches it in dev/CI; nothing catches it in production firmware.
STEP 03

Outcome: device crash or small information leak

Best case for the attacker: the OOB read returns adjacent bytes that happen to influence subsequent handshake output (extremely unlikely with tinydtls's data layout) and leak a fragment of memory. Realistic case: the device faults or returns a handshake error, and the DTLS session is aborted. There is no write primitive, no control-flow hijack, and no documented path to code execution.
Conditions required:
  • Attacker has a side channel to observe leaked bytes (timing, repeated handshakes with differing payloads)
Where this breaks in practice:
  • DTLS clients typically retry on handshake failure — repeated failures get noticed; flooding leaks is detectable
  • Most embedded targets have no useful secrets adjacent to the parse buffer
Detection/coverage: Handshake-failure rate anomalies in CoAP gateway logs.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone known. No KEV entry, no public exploit, no IR firm has reported abuse.
Public PoCNo public weaponized PoC. Fix commit b3efd41 on the Eclipse tinydtls repo serves as the only technical reference.
EPSSNot yet scored (CVE published 2026-06-29). Class-prior for CWE-125 client-side parsers is typically <0.5% in the first 90 days.
CISA KEVNot listed.
CVSS*No vendor/authority CVSS published.* Plausible CVSS:3.1 vector: AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:L4.8 — reflecting unauth, network, but high attack complexity and limited impact.
Affected versionsAll Eclipse tinydtls commits prior to b3efd41ad111a4920f599f51ffa4f5e9f1e72221. Library is unversioned in trunk; downstream distros (Zephyr modules, Contiki-NG, RIOT pkg) may pin older snapshots.
Fixed versionEclipse tinydtls main branch at commit b3efd41 or later. No tagged release — vendor projects must re-vendor.
Exposure dataShodan/Censys do not fingerprint tinydtls clients (clients don't listen). Server-side CoAPs deployments on UDP/5684 number in the low thousands globally per Shodan — but the *server* code path is not where this bug lives.
Disclosed2026-06-29 via Eclipse Foundation / GitHub Advisory Database.
ReporterNot publicly credited in the advisory metadata at time of disclosure.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to LOW (3.7/10)

The single most decisive factor is impact ceiling: this is a client-side out-of-bounds *read* in a cert-parse path with no write primitive and no documented RCE chain — the realistic outcome is a per-device crash. Compounded by a niche library (constrained-IoT only) and the fact that most tinydtls deployments use PSK and never reach the affected ECDSA code path, LOW is the honest first assessment.

HIGH Impact ceiling is information disclosure / DoS, not RCE
MEDIUM Real-world reachability (depends on cipher-suite configuration in unknown downstream firmware)
LOW Exact installed-base distribution across PSK vs ECDHE-ECDSA configurations

Why this verdict

  • No write primitive: CWE-125 is read-only OOB. Without a corruption primitive, RCE chains require an additional bug that has not been published.
  • Client-side trigger only: The attacker must lure the device into handshaking with malicious infrastructure. Most constrained IoT devices talk to one hardcoded backend over a controlled network path — exposure population is tiny.
  • Dominant cipher-suite mode unaffected: tinydtls's flagship use case is PSK for sensor fleets; the vulnerable check_server_certificate() is only invoked in ECDHE-ECDSA / raw-public-key mode, which is a minority configuration.
  • Role multiplier — low-value target: Affected role is a *constrained sensor / CoAP client*. Blast radius is a single device. Even on fleets, each handshake is independent — no lateral movement, no pivot.
  • Role multiplier — no high-value role: tinydtls is explicitly *not* used in identity providers, hypervisors, PAM, CI/CD, backup, or kernel-mode agents. There is no canonical high-value deployment role to floor the verdict against.
  • No KEV, no PoC, no campaigns: EPSS-class prior is <0.5%; nothing in the wild.

Why not higher?

MEDIUM/HIGH would require either a credible RCE chain (none published, and CWE-125 alone cannot produce one) or a high-value deployment role (tinydtls has none — it is a research-grade library for sensors). Network-reachable cert-parse bugs sound severe in OpenSSL or mbedTLS because of installed base; tinydtls's installed base is sensor firmware, not infrastructure.

Why not lower?

IGNORE is wrong because the bug *is* network-triggerable pre-auth, and a determined attacker on-path with a constrained-IoT client population could cause sustained DoS or harvest small memory fragments. SBOM-tracked firmware should still re-vendor at the next release cycle.

05 · Compensating Control

What to do — in priority order.

  1. Inventory firmware SBOMs for tinydtls — Run syft or your firmware-SBOM tool against built images and grep for tinydtls / dtls.c checksum. This is hygiene — no mitigation SLA applies to a LOW verdict, so this can ride the standard 365-day remediation window.
  2. Pin DTLS clients to PSK cipher suites where the use case allows — PSK mode (TLS_PSK_WITH_AES_128_CCM_8) does not invoke check_server_certificate() and is unaffected. If your fleet's threat model permits PSK, this eliminates exposure entirely. Apply during the next firmware revision.
  3. Restrict outbound UDP/5684 from IoT VLANs to known backend IPs — Egress allowlisting on the CoAP/DTLS port denies the attacker the rogue-server scenario. Network-tier change, no firmware update required.
  4. Re-vendor tinydtls at commit b3efd41 or later in the next firmware build — There is no tagged release. CI/build pipeline owners must bump the git pin and rebuild. noisgate remediation SLA for LOW is treat-as-backlog hygiene — fold into the next routine firmware cycle, not an emergency.
What doesn't work
  • WAF / network IDS — DTLS is encrypted UDP and the malformed payload lives inside the handshake; no L7 inspector parses this in flight.
  • TLS interception / decryption proxies — they don't sit between IoT sensors and their backends in any meaningful enterprise deployment.
  • Stack canaries / FORTIFY_SOURCE — this is heap/static OOB read, not stack smash; compiler hardening does not catch it.
  • EDR — constrained IoT has no EDR, and even hosted variants don't introspect DTLS handshake parsers.
06 · Verification

Crowdsourced verification payload.

Run on a Linux build host or CI runner that has the firmware source tree checked out. Invoke as ./check-tinydtls.sh /path/to/firmware/src (no privileges required). The script grep-walks for vendored tinydtls and compares its dtls.c against the fix commit.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check-tinydtls.sh — detect Eclipse tinydtls pre-b3efd41 in a source tree
# Usage: ./check-tinydtls.sh <path-to-source-tree>
# Exit: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN/NOT FOUND
set -u

ROOT="${1:-.}"
FIX_COMMIT="b3efd41ad111a4920f599f51ffa4f5e9f1e72221"
FIX_SHORT="b3efd41"

if [[ ! -d "$ROOT" ]]; then
  echo "UNKNOWN: $ROOT is not a directory"
  exit 2
fi

# Find candidate tinydtls trees (dtls.c + dtls.h colocated)
mapfile -t HITS < <(find "$ROOT" -type f -name dtls.c 2>/dev/null | while read -r f; do
  d=$(dirname "$f")
  [[ -f "$d/dtls.h" && -f "$d/peer.c" ]] && echo "$d"
done)

if [[ ${#HITS[@]} -eq 0 ]]; then
  echo "UNKNOWN: no tinydtls source tree found under $ROOT"
  exit 2
fi

STATUS=0
for d in "${HITS[@]}"; do
  echo "[*] tinydtls candidate: $d"
  if [[ -d "$d/.git" || -f "$d/.git" ]]; then
    if git -C "$d" merge-base --is-ancestor "$FIX_COMMIT" HEAD 2>/dev/null; then
      echo "    PATCHED (fix $FIX_SHORT is ancestor of HEAD)"
    else
      echo "    VULNERABLE (fix $FIX_SHORT not in history)"
      STATUS=1
    fi
  else
    # No git metadata — fall back to source-level fingerprint of the fix
    if grep -qE 'check_server_certificate' "$d/dtls.c"; then
      # Heuristic: the post-fix code adds an explicit length-bound check before ECDSA parse
      if grep -qE 'data_length\s*<\s*sizeof.*ecdsa|bounds.*server.*cert' "$d/dtls.c"; then
        echo "    LIKELY PATCHED (bounds check present)"
      else
        echo "    LIKELY VULNERABLE (no post-fix bounds check fingerprint)"
        STATUS=1
      fi
    else
      echo "    UNKNOWN (check_server_certificate symbol missing — atypical fork)"
      [[ $STATUS -eq 0 ]] && STATUS=2
    fi
  fi
done

case $STATUS in
  0) echo "RESULT: PATCHED";;
  1) echo "RESULT: VULNERABLE";;
  2) echo "RESULT: UNKNOWN";;
esac
exit $STATUS
07 · Bottom Line

If you remember one thing.

TL;DR
This is backlog hygiene, not a fire drill. Per the noisgate mitigation SLA, LOW carries no mitigation deadline — skip straight to the noisgate remediation SLA 365-day window and fold the tinydtls bump (to commit b3efd41 or later) into the next routine firmware build for any product that vendors the library. While you're there, audit whether your IoT fleet actually needs ECDHE-ECDSA — most tinydtls deployments do fine on PSK and would not be reachable by this bug at all. Do *not* page anyone, do *not* pull engineers off other work, and do *not* let this CVE jump the queue above your real HIGH/CRITICAL backlog.

Sources

  1. Eclipse Foundation — Known Vulnerabilities
  2. Eclipse tinydtls — Gitiles repository (dtls.c)
  3. cvedetails — Eclipse Tinydtls product page
  4. cve.report — tinydtls
  5. GitHub Advisory Database (unreviewed)
  6. CWE-125: Out-of-bounds Read
  7. MITRE CVE keyword search — out-of-bounds memory
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.