xclow3n

  1. 2026 5 posts Slots 01–05

    1. 32 min Smuggling Shouldn't Exist Anymore, Right? Four ways a connection changes owners while it still owes the previous request’s bytes.CVE-2026-56866
    2. 33 min The Validator Can Lie: SSRF Beyond URL Validation changedetection.io, GitLab and Mealie approve one host while the fetcher dials another.
    3. 23 min The URL Parser Cheatsheet What fourteen pinned URL parsers return for one crafted input, across eight languages.
    4. 16 min Testing AI for Vulnerability Research: 4 Approaches & Where I Failed Four AI-assisted workflows, one of them across 23 proxies and backends. One produced 14 confirmed bugs, another nothing I could report.
    5. 11 min Breaking Pingora: HTTP Request Smuggling & Cache Poisoning in Cloudflare's Reverse Proxy Three smuggling bugs and a cache key that ignores Host, all in Pingora’s default configuration.CVE-2026-2835
  2. 2024 4 posts Slots 06–09

    1. 2 min HTML Sanitize Bypass Using MXSS Mutation XSS through sanitize-html, where htmlparser2 and the browser disagree on style and math.
    2. 3 min Email Parser Discrepancy in Nodemailer Two address-parsing bugs that misroute mail. Patched in v6.9.16 and v7.0.7.GHSA-mm7p-fcc7-pg87
    3. 3 min ctf Intergalactic Bounty: HTB University CTF 2024 Intended solution: a Nodemailer parser discrepancy to MXSS to RCE by prototype pollution.
    4. 3 min ctf EncoDecept: HTB University CTF 2024 Intended solution: web cache deception through a Rails path delimiter, then a Django ORM leak.
Slot 01 / 9

Smuggling Shouldn't Exist Anymore, Right?

Connection reuse is a trust decision, and ten products make it on a connection where the previous request is not finished. Reuse is not the defect: turning it off takes the crossings to zero and leaves every one of them in place. Four mechanisms: pre-grant write, unproven-drain reuse, promise-credited framing, reset-with-debt. Wire traces, origin logs and a control for each. CVE-2026-56866.

Four ways a connection changes owners while it still owes the previous request’s bytes.

CVE-2026-56866CVE-2026-71324GHSA-xg5r-v2fg-97hhCVE-2026-73548GHSA-8xjx-55xw-h6h6GHSA-wg54-m423-h45rCVE-2026-78605CVE-2026-74848

Affected Go net/httpTraefikCaddyEnvoynghttpxHAProxyJettyAPISIXNettyElasticsearch
Open 32 min read
Slot 02 / 9

The Validator Can Lie: SSRF Beyond URL Validation

A URL validator approves one representation; resolution, redirects and authority emission can each replace it after the check. I ran a differential oracle across eight languages: sixteen validators against five clients, 1,855 verdicts, then looked for those disagreements in shipped code. Mealie checked the A record and dialled AAAA; changedetection.io’s backslash-`@` reached live IMDS.

Some were fixed. Others came back duplicate or won’t-fix, and a few I never reported.

changedetection.io, GitLab and Mealie approve one host while the fetcher dials another.

Affected changedetection.ioGitLabMealie
Open 33 min read
Slot 03 / 9

The URL Parser Cheatsheet

The raw measurements and negative results behind The Validator Can Lie: fourteen pinned URL parsers across eight languages, and the bug families indexed by the pipeline stage where two components can legally disagree. One oracle run emits 1,855 verdicts over sixteen validators and five clients.

Eight of the fifteen families have a product finding. The map separately ranks fifteen gap cells and publishes them as open problems.

What fourteen pinned URL parsers return for one crafted input, across eight languages.

Open 23 min read
Slot 04 / 9

Testing AI for Vulnerability Research: 4 Approaches & Where I Failed

I tested four AI-assisted vulnerability-research workflows over roughly one week. The strongest run found 14 confirmed bugs in one target in 20 minutes; another approach produced many parser bugs but nothing I could report as a vulnerability. Across all four, the models were useful for coverage, hypothesis generation, and code analysis, but consistently overstated impact and produced unreliable validation. I still had to verify each finding and build every exploitable chain manually.

Four AI-assisted workflows, one of them across 23 proxies and backends. One produced 14 confirmed bugs, another nothing I could report.

Open 16 min read
Slot 05 / 9

Breaking Pingora: HTTP Request Smuggling & Cache Poisoning in Cloudflare's Reverse Proxy

Between December 2025 and January 2026 I found three request-smuggling bugs in Cloudflare’s Pingora and one cache-poisoning bug: `CacheKey::default()` keys on the URI path alone, so evil.com and victim.com share a cache entry for the same path. All four work under Pingora’s default configuration.

Cloudflare’s own CDN stack sits behind upstream layers; direct Pingora deployments are exposed. Fixed in Pingora 0.8.0, $5,000 in bounties.

Three smuggling bugs and a cache key that ignores Host, all in Pingora’s default configuration.

CVE-2026-2835

Open 11 min read
Slot 06 / 9

HTML Sanitize Bypass Using MXSS

I went looking for sanitizer bypasses to harden a CTF challenge, and found one in sanitize-html. htmlparser2 parses everything inside `<style>` as raw text, so `<math><style><img/src=x onerror="alert(1)"` passes through; the browser then closes both tags per HTML5 and leaves a live `img` with the handler attached.

It needs `style` and `math` in `allowedTags`; the library already warns about `style`. At the time of testing, v2.13.1 still behaved this way.

Mutation XSS through sanitize-html, where htmlparser2 and the browser disagree on style and math.

Affected sanitize-htmlhtmlparser2
Open 2 min read
Slot 07 / 9

Email Parser Discrepancy in Nodemailer

Nodemailer’s address parser splits at the first `@` outside a properly recognized quoted local-part, so `"test@0xhexr4.htb"@google.com` loses `google.com` as its domain. I found that first case while building a CTF challenge; Nodemailer called it a regular bug and fixed it in v6.9.16 without credit.

A second payload, `"xclow3n@gmail.com x"@internal.domain`, routed to gmail.com instead. I reported that one as a security advisory, GHSA-mm7p-fcc7-pg87, patched in v7.0.7.

Two address-parsing bugs that misroute mail. Patched in v6.9.16 and v7.0.7.

GHSA-mm7p-fcc7-pg87

Open 3 min read
Slot 08 / 9 ctf

Intergalactic Bounty: HTB University CTF 2024

The intended solution to my Intergalactic Bounty challenge from HTB University CTF 2024, in four stages. A Nodemailer parser discrepancy gets past a registration gate that only accepts interstellar.htb, then MXSS through sanitize-html with `math`, `style` and `svg` allowed steals the admin cookie.

From there a `mergedeep` prototype pollution sets needle’s `output` option to overwrite a template file, and a crash-restart runs it as RCE.

Intended solution: a Nodemailer parser discrepancy to MXSS to RCE by prototype pollution.

Open 3 min read
Slot 09 / 9 ctf

EncoDecept: HTB University CTF 2024

My intended solution to EncoDecept, HTB University CTF 2024. The challenge’s Nginx caches by file extension and Rails treats `.` as a path delimiter, so `/settings.ico` poisons the cache. With no charset declared, a JIS X 0208 1978 differential turns a markdown bio into XSS in Chrome.

Running as `contract_manager`, a Django ORM leak brute-forces the admin password, then a controller merging request params over its `Marshal` payload gives RCE.

Intended solution: web cache deception through a Rails path delimiter, then a Django ORM leak.

Open 3 min read