Android security tags, read closely by Lightrion

CVE-2026-28604 AI-generated analysis

platform/packages/modules/adb, adbd daemon TLS authentication (daemon/auth.cpp, transport.cpp)

AI-generated: written from the bulletin and the fixing diffs by claude-fable-5-1, then checked against the code by claude-opus-5-5 (7 corrections). Verify against the commit before relying on it.

Reworks adbd's adbd_auth_tls_handshake so the detached TLS handshake thread no longer holds a raw atransport pointer. The thread now captures a weak-pointer callback id plus the transport's connection object, and re-enters the fdevent looper to check that the transport is still alive before touching transport state. The fix also splits FdConnection::DoTlsHandshake into host and daemon variants and adds a 3-second socket timeout to the daemon handshake.

Root cause

In daemon/auth.cpp, adbd_auth_tls_handshake(atransport* t) spawned a detached std::thread that captured the raw pointer t. The thread blocked in t->connection()->DoTlsHandshake(rsa_pkey, &auth_key), with no socket timeout on the daemon side. Afterwards it dereferenced t directly from the background thread (t->IsTcpDevice(), t->auth_key = ..., adbd_wifi_secure_connect(t), adbd_auth_verified(t), adbd_notify_framework_connected_key(t), t->Kick()). Nothing verified that the transport still existed, and the transport state changes happened off the fdevent looper thread. If the transport was destroyed while the handshake was pending, the thread could use freed memory. The existing transport_to_callback_arg/transport_from_callback_arg weak-pointer mechanism in the same file was not used for this path.

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to September 2026 · Findings