<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Nightjar</title>
  <link href="https://nightjar.blog/feed.xml" rel="self"/>
  <link href="https://nightjar.blog/"/>
  <id>https://nightjar.blog/</id>
  <updated>2026-08-24T15:51:08Z</updated>
  <entry>
    <title>Slipping an extra request through Cloudflare Pingora on a close-delimited body</title>
    <link href="https://nightjar.blog/pingora-request-smuggling/"/>
    <id>tag:nightjar.blog,2026:pingora-request-smuggling</id>
    <updated>2026-06-07T09:00:00Z</updated>
    <summary>Pingora could not recognise a comma-separated Transfer-Encoding, so it read the request body until the socket closed.</summary>
  </entry>
  <entry>
    <title>Same digest, different files: ZIP parser differentials in uv and pip</title>
    <link href="https://nightjar.blog/uv-zip-parser-disagreement/"/>
    <id>tag:nightjar.blog,2026:uv-zip-parser-disagreement</id>
    <updated>2026-05-01T09:00:00Z</updated>
    <summary>A ZIP with one digest that expands into two different packages depending on which installer opens it.</summary>
  </entry>
  <entry>
    <title>Overflowing the DjVuLibre MMR decoder with zero-length runs</title>
    <link href="https://nightjar.blog/djvulibre-scanruns/"/>
    <id>tag:nightjar.blog,2026:djvulibre-scanruns</id>
    <updated>2026-03-25T09:00:00Z</updated>
    <summary>A fax-coding decoder writes one run-length entry per code and never checks it is still inside the buffer.</summary>
  </entry>
  <entry>
    <title>A request header made Next.js cache private per-user responses</title>
    <link href="https://nightjar.blog/nextjs-cache-poisoning/"/>
    <id>tag:nightjar.blog,2026:nextjs-cache-poisoning</id>
    <updated>2026-02-16T09:00:00Z</updated>
    <summary>One internal header flips an SSR response into an SSG one, and the Cache-Control header follows it.</summary>
  </entry>
  <entry>
    <title>Escaping a root directory with Windows device paths in Go&#x27;s path/filepath</title>
    <link href="https://nightjar.blog/go-windows-path-handling/"/>
    <id>tag:nightjar.blog,2026:go-windows-path-handling</id>
    <updated>2026-01-10T09:00:00Z</updated>
    <summary>Go&#x27;s path cleaner did not know that \??\c:\x is another spelling of c:\x, and the fix for that needed a fix of its own.</summary>
  </entry>
  <entry>
    <title>Out-of-bounds write in libcue from a negative INDEX number</title>
    <link href="https://nightjar.blog/libcue-track-index/"/>
    <id>tag:nightjar.blog,2025:libcue-track-index</id>
    <updated>2025-12-04T09:00:00Z</updated>
    <summary>atoi has no way to report failure, and track_set_index only checked one end of the array.</summary>
  </entry>
  <entry>
    <title>What does the Squid request smuggling patch actually fix?</title>
    <link href="https://nightjar.blog/squid-chunked-parsing/"/>
    <id>tag:nightjar.blog,2025:squid-chunked-parsing</id>
    <updated>2025-10-28T09:00:00Z</updated>
    <summary>The advisory says &#x27;chunked decoder lenience&#x27; and stops; the commit says 0x prefixes, bare LFs and a bad rewind point.</summary>
  </entry>
  <entry>
    <title>Type confusion in OpenSSL&#x27;s X.400 address handling (CVE-2023-0286)</title>
    <link href="https://nightjar.blog/openssl-x400-type-confusion/"/>
    <id>tag:nightjar.blog,2025:openssl-x400-type-confusion</id>
    <updated>2025-09-21T09:00:00Z</updated>
    <summary>A public header said ASN1_TYPE, the ASN.1 template produced an ASN1_STRING, and one comparison function stood between the two.</summary>
  </entry>
  <entry>
    <title>Traversing a path into the Home Assistant Supervisor API without a token</title>
    <link href="https://nightjar.blog/home-assistant-supervisor-auth/"/>
    <id>tag:nightjar.blog,2025:home-assistant-supervisor-auth</id>
    <updated>2025-08-15T09:00:00Z</updated>
    <summary>An unauthenticated allow-list matched a string while a proxy client normalised a path, three times in a row.</summary>
  </entry>
  <entry>
    <title>A second root element: SAML signature bypass in passport-saml</title>
    <link href="https://nightjar.blog/passport-saml-signature-bypass/"/>
    <id>tag:nightjar.blog,2025:passport-saml-signature-bypass</id>
    <updated>2025-07-09T09:00:00Z</updated>
    <summary>An XML signature covers an element, not a file, and passport-saml picked its element two different ways.</summary>
  </entry>
  <entry>
    <title>Non-responsive delegation: CPU exhaustion in Unbound and BIND 9 resolvers</title>
    <link href="https://nightjar.blog/nrdelegation-resolver-attack/"/>
    <id>tag:nightjar.blog,2025:nrdelegation-resolver-attack</id>
    <updated>2025-06-02T09:00:00Z</updated>
    <summary>The referral cap everyone added after NXNSAttack turns into a loop when the nameservers exist but never answer.</summary>
  </entry>
  <entry>
    <title>Pointing Cargo&#x27;s .cargo-ok write at a file outside the crate directory</title>
    <link href="https://nightjar.blog/cargo-crate-extraction/"/>
    <id>tag:nightjar.blog,2025:cargo-crate-extraction</id>
    <updated>2025-04-26T09:00:00Z</updated>
    <summary>Cargo wrote &quot;ok&quot; into a marker file after unpacking a crate, and the crate got to decide what that marker was.</summary>
  </entry>
  <entry>
    <title>Turning a 27-byte IP fragment into an arbitrary write in U-Boot</title>
    <link href="https://nightjar.blog/uboot-ip-defragmentation/"/>
    <id>tag:nightjar.blog,2025:uboot-ip-defragmentation</id>
    <updated>2025-03-20T09:00:00Z</updated>
    <summary>U-Boot stores its IP reassembly hole list inside the holes, and a 27-byte fragment lands right on top of it.</summary>
  </entry>
  <entry>
    <title>Proof of nothing: TLS 1.3 authentication bypasses in wolfSSL</title>
    <link href="https://nightjar.blog/wolfssl-state-machine/"/>
    <id>tag:nightjar.blog,2025:wolfssl-state-machine</id>
    <updated>2025-02-11T09:00:00Z</updated>
    <summary>How a black-box state machine learner found two ways to skip the only part of TLS 1.3 that proves who you are.</summary>
  </entry>
  <entry>
    <title>Space in a token: request smuggling in mitmproxy&#x27;s HTTP/1.1 parser</title>
    <link href="https://nightjar.blog/mitmproxy-request-smuggling/"/>
    <id>tag:nightjar.blog,2025:mitmproxy-request-smuggling</id>
    <updated>2025-01-05T09:00:00Z</updated>
    <summary>mitmproxy split header lines on the first colon and kept whatever came before it, whitespace included.</summary>
  </entry>
  <entry>
    <title>Namespace separator injection in libexpat (CVE-2022-25236)</title>
    <link href="https://nightjar.blog/expat-namespace-separator/"/>
    <id>tag:nightjar.blog,2024:expat-namespace-separator</id>
    <updated>2024-11-29T09:00:00Z</updated>
    <summary>libexpat packed three strings into one buffer with a delimiter you chose, and never checked whether the delimiter turned up in the data.</summary>
  </entry>
  <entry>
    <title>Last write wins: an ext_authz authorization bypass in Envoy</title>
    <link href="https://nightjar.blog/envoy-ext-authz-bypass/"/>
    <id>tag:nightjar.blog,2024:envoy-ext-authz-bypass</id>
    <updated>2024-10-23T09:00:00Z</updated>
    <summary>Envoy packed request headers for its external authorizer into a protobuf map, so a repeated header arrived with only its last value.</summary>
  </entry>
  <entry>
    <title>Reflected public keys: recovering the six digits of Bluetooth Passkey Entry</title>
    <link href="https://nightjar.blog/bluetooth-passkey-reflection/"/>
    <id>tag:nightjar.blog,2024:bluetooth-passkey-reflection</id>
    <updated>2024-09-16T09:00:00Z</updated>
    <summary>Bluetooth Passkey Entry spends a bit of the passkey per round so it can never be brute-forced offline. Reflect the initiator&#x27;s public key back at it and it hands over one bit per round instead.</summary>
  </entry>
  <entry>
    <title>Arbitrary file write in node-tar through a stale directory cache</title>
    <link href="https://nightjar.blog/node-tar-path-normalisation/"/>
    <id>tag:nightjar.blog,2024:node-tar-path-normalisation</id>
    <updated>2024-08-10T09:00:00Z</updated>
    <summary>node-tar skipped a symlink check whenever its directory cache said the path was fine, and two ways of spelling a path could make the cache lie.</summary>
  </entry>
  <entry>
    <title>Running commands from RDoc by starting a filename with a pipe</title>
    <link href="https://nightjar.blog/rdoc-command-injection/"/>
    <id>tag:nightjar.blog,2024:rdoc-command-injection</id>
    <updated>2024-07-04T09:00:00Z</updated>
    <summary>RDoc sniffed the first hundred bytes of any file called &#x27;tags&#x27; to see whether it was a ctags index, and used the one Ruby function that treats a leading pipe as a command.</summary>
  </entry>
  <entry>
    <title>Python&#x27;s parse_qsl treated semicolons as separators, enabling web cache poisoning</title>
    <link href="https://nightjar.blog/python-parse-qsl-semicolon/"/>
    <id>tag:nightjar.blog,2024:python-parse-qsl-semicolon</id>
    <updated>2024-05-28T09:00:00Z</updated>
    <summary>A standard-library parser that separated parameters on &#x27;;&#x27; as well as &#x27;&amp;&#x27;, and the cache poisoning that followed when the proxy in front disagreed.</summary>
  </entry>
  <entry>
    <title>A fifth length byte: integer overflow and a signed syscall compare in Zephyr RTOS</title>
    <link href="https://nightjar.blog/zephyr-mqtt-syscall/"/>
    <id>tag:nightjar.blog,2024:zephyr-mqtt-syscall</id>
    <updated>2024-04-21T09:00:00Z</updated>
    <summary>A greater-than that should have been a greater-than-or-equal lets a remote MQTT packet pick any 32-bit length it likes, and a signed branch instruction lets a user thread pick any function pointer it…</summary>
  </entry>
  <entry>
    <title>Half-blind: SSRF in Kubernetes dynamic provisioning via StorageClass parameters</title>
    <link href="https://nightjar.blog/kubernetes-ssrf-storageclass/"/>
    <id>tag:nightjar.blog,2024:kubernetes-ssrf-storageclass</id>
    <updated>2024-03-15T09:00:00Z</updated>
    <summary>kube-controller-manager will connect to any address you write into a StorageClass, and until 2020 it read the response back to you in a PersistentVolumeClaim event.</summary>
  </entry>
  <entry>
    <title>Smuggling requests past HAProxy with a vertical tab in Transfer-Encoding</title>
    <link href="https://nightjar.blog/haproxy-vertical-tab-smuggling/"/>
    <id>tag:nightjar.blog,2024:haproxy-vertical-tab-smuggling</id>
    <updated>2024-02-07T09:00:00Z</updated>
    <summary>How a vertical tab in a Transfer-Encoding header made HAProxy and its backend disagree about where a request ended, opening an HTTP request smuggle.</summary>
  </entry>
  <entry>
    <title>Who asked for this file? Previous mode confusion in Windows kernel drivers</title>
    <link href="https://nightjar.blog/windows-access-mode-mismatch/"/>
    <id>tag:nightjar.blog,2024:windows-access-mode-mismatch</id>
    <updated>2024-01-01T09:00:00Z</updated>
    <summary>Windows stores one previous-access-mode value per thread and uses it to answer two unrelated questions, and the workaround for that leaks straight into driver code.</summary>
  </entry>
</feed>
