feat(web-security): add HTTP desync tooling and smuggling skill - #125
Merged
GangGreenTemperTatum merged 1 commit intoAug 20, 2026
Conversation
Ports the http-desync-smuggling research (11 confirmed mechanism families
from PortSwigger's HTTP Terminator) into the capability as a Dreadnode
toolset plus a companion skill.
tools/desync.py — DesyncTools with four tools:
desync_fingerprint which body-framing primitives the stack accepts
(Server/CDN, TE chunked/identity/gzip, duplicate
Content-Length, CL on bodyless GET). Seven probes
run concurrently; a failed probe omits its field
rather than aborting the fingerprint.
desync_build_payload byte-exact raw HTTP/1.1 for 11 families. Content-
Length and chunk sizes are computed from the real
byte count, which is the bug agents hit when
hand-writing these.
desync_probe_cache cache-layer detection plus cache-key membership,
which decides whether a confirmed desync escalates
to cache poisoning.
desync_analyze_responses classify victim-response-theft captures (session
cookies, JWT, bearer, CSRF, PII) into a severity.
Values are redacted; full secrets never returned.
Changes from the source script: async with concurrent probes rather than
sequential blocking calls with sleeps; uniform null-omitted dict returns
instead of mixed dataclass/str; payload construction added (the source had
none — payloads were hand-written in the skill prose); proxy is a per-call
arg instead of a hardcoded Caido default, so the agent controls routing.
Verified each built payload over a raw TLS socket against a live server:
all eleven get a semantic parser response (400 on CL/TE conflict, 501 on
unknown TE, 405/200 otherwise) with no resets, confirming wire-correct
framing.
97 tests covering payload byte-correctness per family, redaction, severity
ordering, and probe behaviour against a mocked transport. Full capability
suite: 429 passed.
The skill documents the interleaved-victim validation algorithm including
the erratic-domain baseline check, which is the step that separates a real
desync from the false positives this class is notorious for.
GangGreenTemperTatum
added a commit
that referenced
this pull request
Aug 20, 2026
PR #125 (HTTP desync tooling) merged to main first and shipped 1.10.0, so this branch's own 1.10.0 bump collided. Resolution: version 1.10.0 -> 1.11.0, since 1.10.0 is already published on main. Both branches independently claimed 1.10.0; git auto-merged the identical strings without flagging it, so the bump would have silently republished a shipped version. description keeps both contributions — "HTTP desync/request smuggling" from #125 and the four-Caido-surfaces wording from this branch. Playbook count set to 82, the actual skill directory count on the merged tree (both sides were stale: "81" here, "80+" on main). No code conflicts: the two PRs touch disjoint files apart from the manifest. Verified on the merged tree: 479 tests pass (429 from main + 50 Caido tests from this branch), capability validates at 1.11.0 with 48 tools / 82 skills, and the caido_proxy "defined no tools" warning present on main is resolved by this branch's changes.
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ports the
http-desync-smugglingresearch (11 confirmed mechanism families from PortSwigger's HTTP Terminator) intoweb-securityas a Dreadnode toolset plus a companion skill.What's added
tools/desync.py—DesyncTools, four tools:desync_fingerprintContent-Length, CL on bodyless GET. Seven probes run concurrently; a failed probe omits its field rather than aborting the fingerprint.desync_build_payloadContent-Lengthand chunk sizes are computed from the real byte count.desync_probe_cachedesync_analyze_responsesskills/http-desync-smuggling/SKILL.md— the 11 families with per-familyfamilyslugs, tool-driven phases, the interleaved-victim validation algorithm, and a permutation table.Cross-refs added from
te0-request-smugglingandresponse-queue-poisoning; allChain Withtargets verified to exist.Changes from the source material
Content-Length: 50values that don't match their bodies. An agent copying those sends a malformed request and reads the resulting 400 as "not vulnerable." Lengths and chunk sizes now derive from real byte counts.sleep(1)between cache GETs. Fingerprint completes in ~0.4s.dictreturns instead of mixed dataclass/str, per the repo's tool-authoring rules.proxyis a per-call arg, not a hardcoded Caido default — a Toolset field would be unreachable to the LLM.feedback_loop.py/db_fingerprint.py. SQLite glue for HTTP Terminator's own campaign DB, no consumer here.Verification
just validateclean; tools 44 → 48, skills 81 → 82. Remaining warnings (caido-cli,burp,caido_proxy) are pre-existing onmain.Reviewer notes
unkeyed_headersis a lead, not a fact. The Age-differential heuristic can't distinguish "header isn't in the cache key" from "Age just didn't move." Acache_key_methodfield states this inline so an agent doesn't report it as confirmed.verify=Falseon probes is deliberate and documented in the module docstring: targets under test routinely present self-signed or expired certs, and a verification failure would mask the framing behaviour being measured.1.9.0→1.10.0(additive public surface).