skip to content

What does TLS_FALLBACK_SCSV in a client's retry after a failed handshake oblige the server to do?

level: seniorimportance: should knowfreq 46%

answer

  1. a retry, not a first attempt
  2. carried in the cipher suite list
  3. extensions are what the peer rejected
  4. fatal only if the server supports higher
  5. inappropriate_fallback(86) ends it

basics

~20 s

It declares that this hello is a retry offering less than the client's best version. A server that supports a version higher than the one offered answers with a fatal inappropriate_fallback(86) alert instead of completing the handshake.

solid answer

~40 s

`TLS_FALLBACK_SCSV {0x56, 0x00}` of `RFC 7507` is a signalling value carried in the ClientHello's cipher suite list — not an extension, deliberately, because the retry happens precisely when something rejected the previous hello. Its meaning is "this hello does not offer the highest version I support; I am retrying lower." The server's rule is conditional: if it sees the value **and** supports a version above the one this hello offers, it sends a fatal `inappropriate_fallback(86)` alert and abandons the handshake, because a legitimate peer would have completed at the higher version. If the offered version is already the server's highest, the value is informational and the handshake continues normally. It detects an attacker who forces retries by killing handshakes; it does nothing about tampering inside a single handshake.

code

pseudocode · 6 lines
pseudocode
client:
    attempt the handshake offering the highest version supported
    if the attempt failed before a ServerHello arrived:
        retry, offering a lower version
        add TLS_FALLBACK_SCSV to the cipher suite list of the retry
        # it names no cipher and is never selected; it is a statement

go deeper

for a junior

Remember that the value marks a hello as a retry offering less than the client's best version, and that the server may refuse such a retry.

for a middle

State the condition exactly: the fatal alert is warranted only when the server supports a version above the one the hello offers, otherwise the handshake proceeds.

for a senior

Explain why the signal lives in the cipher suite list rather than an extension, and what an observed alert tells you about the path between you and that counterparty.

for a principal

Weigh the estate consequence: enforcing it converts silent weakening into hard failures for counterparties with fragile paths, so the rollout needs notice and a way to tell attack from breakage.

## The problem it addresses Version negotiation inside one handshake is protected: the final handshake messages bind the transcript, so a peer that edited the version fields is detected before application data flows. The gap `RFC 7507` closes is outside that. Some clients, faced with a handshake that failed for any reason at all, retry with a lower version offered. An attacker who can drop or reset connections can therefore drive a client down the version ladder without touching a single handshake message — each individual handshake is honest, and the downgrade happens between them. That retry behaviour existed because peers on the network genuinely did reject hellos they did not understand. The dance was a compatibility workaround, and it turned into a downgrade lever. ## The signal `TLS_FALLBACK_SCSV {0x56, 0x00}` is a **signalling cipher suite value**: an entry the client adds to the ClientHello's cipher suite list which names no cipher and is never selected. Carrying it there rather than in an extension is the whole design point. The fallback is happening because something on the path or at the server choked on the previous hello, and extensions are exactly what such a peer is likely to choke on. A cipher suite list entry is parsed by anything that parses a hello at all. Its meaning is narrow and precise: *this hello is a retry, and it offers less than the highest version I support*. A client sends it only on a retry, never on a first attempt at its best version. ## The server's rule, and the condition on it The rule has two branches, and getting the condition right is the whole question: 1. The server sees the signalling value **and** supports a protocol version higher than the one this hello offers. A genuine peer offering less than the server's best, having just failed, is the signature of an induced downgrade — so the server sends a fatal `inappropriate_fallback(86)` alert and abandons the handshake. 2. The server sees the signalling value and the hello already offers the highest version the server supports. Nothing is wrong: the client stepped down from a version this server never had. The handshake continues normally. The second branch is why the alert exists as a condition rather than as a reflex. A server that fired on the mere presence of the value would break every client that legitimately fell back to the server's own best version. ## What it buys, and what it does not | threat | covered by | |---|---| | version fields edited inside one handshake | the handshake transcript check in the final messages | | a client driven down the ladder by repeated killed handshakes | `TLS_FALLBACK_SCSV` and `inappropriate_fallback(86)` | | a server that genuinely supports nothing higher | not a downgrade at all; a configuration limit | | a client that never retries at a lower version | needs no signal; it has no ladder to be pushed down | The last row is worth stating in an interview, because it is the honest conclusion: the strongest form of this defence is a client that does not perform an insecure retry in the first place. The signalling value is what makes the retry survivable for clients that do. ## Related prohibitions The fallback question is also settled at the version level for the retired protocols. `RFC 7568` prohibits SSL 3.0 and prohibits falling back to it from any version of TLS, which means a downgrade that ends at SSL 3.0 is refused by the version rule independently of any signalling value. ## Operating it on a long-lived bus On a settlement bus with counterparties that upgrade on their own timetable, the operational questions are: - **Does your client library retry at a lower version on failure at all?** If it does, the signalling value must be present on those retries, or the retry is an unmonitored downgrade path. - **Does your server enforce the condition?** An `inappropriate_fallback(86)` alert observed in logs is information, not noise: something caused a peer's first handshake to fail. That is either an attacker or a broken path element, and both are worth finding. - **What does a counterparty see when you enforce it?** A peer whose first attempt fails for an unrelated reason — a path problem, a stale configuration — will now get a hard failure on the retry rather than a quiet, weaker connection. That is the intended behaviour, and it must be explainable to the counterparty before it happens at month end. The summary an auditor wants is that the signal turns a silent weakening into a visible refusal, and that the refusal is conditional on the server genuinely having had something better to offer.

  • Why is the value carried in the cipher suite list instead of in a TLS extension?
    Because the fallback happens exactly when a peer rejected the previous hello, and an unfamiliar extension is a common reason for that rejection. A signalling entry in the cipher suite list is parsed by anything that parses a hello, so the statement survives the very conditions that caused the retry.
  • A server supporting up to TLS 1.2 receives a hello offering TLS 1.2 that carries the signalling value. What should it do?
    Continue the handshake. The condition in `RFC 7507` is that the server supports a version *higher* than the one offered; here it does not. The client stepped down from something this server never had, so there is nothing to refuse and firing the alert would break a legitimate peer.
  • Does this mechanism protect version negotiation inside a single handshake?
    No, and it does not need to. Edits to the version fields within one handshake are caught by the transcript check bound into the final handshake messages. The signalling value covers the gap between handshakes, where a client's own retry logic is the thing being manipulated.
  • What should an operator conclude from seeing inappropriate_fallback(86) in server logs?
    That a peer's first handshake failed and it retried lower. That is either an attacker killing connections to force a step down, or a genuinely broken element on the path. Both are worth investigating; neither is normal traffic, so the alert is a signal rather than noise.

A caller who says "I'm ringing back on the old line because the new one wouldn't connect": the operator who knows the new line works can conclude someone cut it.

saying these in an interview costs you the question

  • Says the server must send the alert whenever the value appears
  • Calls it a TLS extension rather than a cipher suite value
  • Thinks it protects version fields inside one handshake
  • Believes the client sends it on every hello
  • Assumes it prevents rather than detects the downgrade