Skip to content
VITI Security

How Vexta Detects HTTP Request Smuggling and Race Conditions

by VITI Security TeamSep 26, 2026

Request smuggling and race conditions both come down to two systems disagreeing about timing or framing. Vexta tests CL.TE/TE.CL/H2.CL desyncs and uses single-packet and last-byte-sync techniques to make races reproducible.

How Vexta Detects HTTP Request Smuggling and Race Conditions - VITI Security

HTTP request smuggling detection is testing whether a front-end proxy and a back-end server disagree about where one HTTP request ends and the next one begins, a desync that lets one crafted request get spliced into another user's connection. Vexta tests specifically for CL.TE, TE.CL and H2.CL desync patterns, and pairs that with race condition testing that uses HTTP/2 single-packet and HTTP/3 last-byte synchronization to make timing-based bugs reproducible on demand rather than a matter of luck.

Why smuggling and races are both hard to find by hand

Request smuggling depends on two different systems, typically a front-end proxy or CDN and a back-end application server, parsing the exact same bytes differently. Finding that requires sending precisely malformed requests and reading subtle differences in how the target responds, not the kind of thing that turns up from normal manual testing.

Race conditions have a different but related problem: the bug is real, but network jitter means two requests meant to arrive at the same instant usually do not, so a manual tester sending requests from separate tabs might see the flaw trigger once in twenty tries and conclude it does not reproduce reliably enough to report.

What are CL.TE, TE.CL and H2.CL desyncs?

These three labels describe which header two systems disagree about when determining where a request ends. In a CL.TE desync, the front-end server uses the Content-Length header to decide how much of the request belongs to this message, while the back-end uses Transfer-Encoding: chunked instead; the mismatch lets an attacker hide a second request inside what the front end thinks is just body content. TE.CL is the mirror image: the front end honors Transfer-Encoding, the back end trusts Content-Length, with the same splicing effect in the other direction.

H2.CL is the version that shows up when a gateway downgrades an incoming HTTP/2 request to HTTP/1.1 before forwarding it to the back end. HTTP/2 does not need a Content-Length header to know where a request ends, since its own framing already carries the length, but the downgraded HTTP/1.1 request has to have one added, and if that added value disagrees with what the back end expects, the same desync opens up. This pattern has become more relevant as more infrastructure fronts services with HTTP/2 and translates to HTTP/1.1 behind the scenes.

Vexta tests for all three patterns directly rather than relying on generic timing anomalies, and any resulting finding goes through Vexta's proof-of-exploitation step before it is reported as confirmed.

How does Vexta make race conditions reproducible?

A classic race condition, like redeeming the same discount code twice or withdrawing more than a balance allows, depends on two requests being processed close enough together that a check-then-act sequence runs twice before either write commits. Sent as two ordinary requests over a normal connection, network jitter usually spaces them out enough that the race does not trigger consistently.

Vexta's race condition testing uses two techniques built to close that timing gap. Over HTTP/2, it sends multiple request streams within a single TCP packet, so they arrive at the server effectively simultaneously rather than as separate network events with their own jitter. Over HTTP/3, it holds back the final byte of several requests and releases them together, a last-byte synchronization approach that achieves the same effect on a transport that does not stream over TCP the same way HTTP/2 does.

The payoff is that a race condition either genuinely does not exist, or Vexta's testing triggers it reliably enough to prove it, rather than leaving a hunter guessing whether twenty failed manual attempts mean the bug is not there.

Why reproducibility is the whole point

A vulnerability a triager cannot reproduce is a vulnerability that gets marked informative or closed as unable to verify, regardless of how real the underlying flaw is. Both request smuggling and race conditions have historically suffered from exactly that problem: real bugs that were hard to demonstrate consistently enough to convince a skeptical reviewer.

Making the trigger reliable is also what lets Vexta's proof-of-exploitation engine do its job on these classes. A verifier that has to safely confirm a finding needs a technique that reproduces the condition on demand, not one that works occasionally, and single-packet and last-byte-sync approaches are built for exactly that reliability.

Where this fits in an authorized engagement

Both smuggling and race condition checks are safe confirmation techniques meant for targets inside an authorized program's scope or a signed engagement, not general-purpose tools for disrupting a service. A confirmed smuggling desync in particular can affect other users sharing the same connection pool, which is exactly why it belongs in a controlled test with the program's rules in place, not an unscoped probe.

Findings in both classes carry a Vexta Confidence Score and go through the same proof, refuted, or unproven pipeline as everything else Vexta detects. Availability of specific checks depends on the license; see plans on the pricing page.

  • Vexta tests three specific request smuggling patterns: CL.TE, TE.CL and H2.CL, each describing which header (Content-Length vs Transfer-Encoding) two systems disagree about.
  • H2.CL desyncs specifically target gateways that downgrade HTTP/2 requests to HTTP/1.1, where an added Content-Length value can disagree with the back end's expectation.
  • Race condition testing uses an HTTP/2 single-packet technique, sending multiple request streams in one TCP packet to remove normal network jitter.
  • For HTTP/3, Vexta uses last-byte synchronization, holding back the final byte of several requests and releasing them together.
  • Both techniques exist to make timing-dependent bugs reproducible on demand, which matters because an unreproducible finding rarely survives triage.

Frequently asked questions

What is HTTP request smuggling detection?
It is testing whether a front-end proxy and a back-end server disagree about where one HTTP request ends, a desync that can let one crafted request get spliced into another user's connection.
What is the difference between CL.TE and TE.CL smuggling?
CL.TE happens when the front end trusts Content-Length and the back end trusts Transfer-Encoding. TE.CL is the reverse: the front end trusts Transfer-Encoding while the back end trusts Content-Length.
What is an H2.CL desync?
It occurs when a gateway downgrades an HTTP/2 request to HTTP/1.1 and has to add a Content-Length header that disagrees with what the back-end server expects, opening the same kind of smuggling gap as CL.TE or TE.CL.
How does Vexta make race conditions reproducible?
It uses an HTTP/2 single-packet technique that sends multiple request streams in one TCP packet, and an HTTP/3 last-byte synchronization technique, both designed to eliminate the network jitter that normally makes races unreliable to trigger.
Are request smuggling and race condition tests safe to run against a live target?
They are meant to run as safe confirmation within an authorized program's scope or a signed engagement, since a confirmed smuggling desync in particular can affect other users sharing the same connection.
Does Vexta verify smuggling and race condition findings before reporting them?
Yes. Findings in both classes go through Vexta's proof-of-exploitation step and come back proven, refuted, or unproven, with a Confidence Score attached to confirmed results.

Find out if your stack desyncs

Run Vexta against a target in scope and see whether CL.TE, TE.CL or H2.CL smuggling and single-packet race condition testing turn up a reproducible finding.