Finding
The renderer QUIC client trusts any server certificate. build_client_config() installs InsecureVerifier, whose verify_server_cert unconditionally returns ServerCertVerified::assertion() and whose TLS 1.2/1.3 signature checks unconditionally return HandshakeSignatureValid::assertion(). No certificate, fingerprint, or signature is ever validated. A code comment defers the fix to a "prompt 124" that is not present in this code.
Evidence
crates/archon/src/render/tls.rs:50:
.with_custom_certificate_verifier(Arc::new(InsecureVerifier))
crates/archon/src/render/tls.rs:69 — InsecureVerifier::verify_server_cert returns Ok(ServerCertVerified::assertion()) for any presented certificate, and its signature-verification methods likewise assert validity unconditionally.
Why this matters
LAN-adjacent attackers are in scope. With no server authentication, an attacker who can reach the renderer can impersonate the harmonia server, complete the QUIC handshake, intercept the audio stream, and inject a forged SessionAccept carrying attacker-chosen sample_rate/channels. The blanket signature acceptance also defeats downgrade and replay detection. Active MITM of all renderer-server control and media traffic is possible from any host on the network.
Desired correction
Replace InsecureVerifier with a ServerCertVerifier that pins the server leaf-certificate SHA-256 fingerprint stored in credentials.toml (server_fingerprint). On first run with no stored credential, TOFU-pin the observed fingerprint immediately. Reject any connection whose leaf DER fingerprint does not match the pinned value with CertificateError::ApplicationVerificationFailure. InsecureVerifier must be unreachable in production builds.
Done when: build_client_config() verifies the leaf DER fingerprint against the stored value, returns CertificateError::ApplicationVerificationFailure on mismatch, and a unit test confirms a mismatched certificate is rejected.
Finding
The renderer QUIC client trusts any server certificate.
build_client_config()installsInsecureVerifier, whoseverify_server_certunconditionally returnsServerCertVerified::assertion()and whose TLS 1.2/1.3 signature checks unconditionally returnHandshakeSignatureValid::assertion(). No certificate, fingerprint, or signature is ever validated. A code comment defers the fix to a "prompt 124" that is not present in this code.Evidence
crates/archon/src/render/tls.rs:50:crates/archon/src/render/tls.rs:69—InsecureVerifier::verify_server_certreturnsOk(ServerCertVerified::assertion())for any presented certificate, and its signature-verification methods likewise assert validity unconditionally.Why this matters
LAN-adjacent attackers are in scope. With no server authentication, an attacker who can reach the renderer can impersonate the harmonia server, complete the QUIC handshake, intercept the audio stream, and inject a forged
SessionAcceptcarrying attacker-chosensample_rate/channels. The blanket signature acceptance also defeats downgrade and replay detection. Active MITM of all renderer-server control and media traffic is possible from any host on the network.Desired correction
Replace
InsecureVerifierwith aServerCertVerifierthat pins the server leaf-certificate SHA-256 fingerprint stored incredentials.toml(server_fingerprint). On first run with no stored credential, TOFU-pin the observed fingerprint immediately. Reject any connection whose leaf DER fingerprint does not match the pinned value withCertificateError::ApplicationVerificationFailure.InsecureVerifiermust be unreachable in production builds.Done when:
build_client_config()verifies the leaf DER fingerprint against the stored value, returnsCertificateError::ApplicationVerificationFailureon mismatch, and a unit test confirms a mismatched certificate is rejected.