Most Impactful: ===[ Winner: CVE-2023-4863, the WebP 0-day Technical details: https://blog.isosceles.com/the-webp-0day/ Comprehensive discussion in: https://www.openwall.com/lists/oss-security/2023/09/21/4 Links and materials at NVD: https://nvd.nist.gov/vuln/detail/CVE-2023-4863 ---[ Why we think this is important: Besides being absolutely everywhere, it underscores two crucial LangSec points: (1) Any input is a program. Huffman compression may sound like a fairly constrained algorithm, but it is still driven by the bits of the input. (2) Graphics formats are an attack surface. This attack surface needs to be minimized to machine-readable machine-checkable unambiguous definitions, from which safe parsers should be generated. Fuzzing is not a solution (as Ben Hawkes brilliantly points out). Sandboxing is not a solution. Algorithmic cleverness and subtlety is not a solution. ===[ Runner-up: "The Most Dangerous Codec in the World: Finding and Exploiting Vulnerabilities in H.264 Decoders", Willy R. Vasquez, Stephen Checkoway, Hovav Shacham, https://wrv.github.io/h26forge.pdf USENIX presentation: https://www.usenix.org/system/files/sec23_slides_vasquez.pdf The tool: https://github.com/h26forge/h26forge The h26forge tool suite is fabulous. It is probably the next best thing after a proper mechanized definition of the format. It comes close to beginning to empirically measure the cost of unmanaged complexity at the communication boundary---which, as the WebP example shows, is mind-boggling even for a single, modern implementation of a newly designed format. The complexity and effectiveness of this tool shows the true cost of "business as usual" in programming at the communication boundary. ===[ Aspirational: Ninja non-terminating parsing, low and slow, aspiring new bug class The bug: https://www.cloudfoundry.org/blog/usn-5328-1-openssl-vulnerability/ Some day when we are past due diligence in format definition and parsing, and no longer allow inputs to corrupt our memory, other classes of bugs will remain, which will need more mathematical, logical, and proof machinery to get right. Non-termination in parsing appears to be just such a problem. It is neither easily observed nor as easily connected to input grammars as memory corruption. Perhaps finding this bug should be taken up as an exemplary reaching goal for parser correctness. From the Turing machine halting problem, we know it is undecidable to determine whether an arbitrary program will terminate or wander through an infinity of loops and recursion. This general result did not prevent Tavis Ormandy's fuzzer from finding one particular instance of this problem, where a modular square root function BN_mod_sqrt() fails to terminate due to erroneous loop arithmetic conditions over the invalidly crafted elliptic curve. This underscores another LangSec point: fuzzing is really program analysis, although algorithmically randomized rather than sound and exhaustive, and implicit rather than explicit about the properties being analyzed. Yet it can and occasionally does rise to the higher program analysis mark, which is what we see here. Can we expand this to more bug classes? ----- Hardest to Fix: ===[ The Winner: LogoFAIL: https://binarly.io/posts/finding_logofail_the_dangers_of_image_parsing_during_system_boot/ https://binarly.io/posts/The_Far_Reaching_Consequences_of_LogoFAIL/ LogoFAIL is iconic in so many ways, including "you had one job" and "you parsed what where?" Yet the worst is that defenders are stuck protecting a terrain without a map. In a vast and arguably least well-instrumented supply chain landscape, it's not a good position to be in. This one truly bites. ===[ Runner-ups: "BatBadBut" Command Injection, CVE-2024-24576 https://insights.sei.cmu.edu/blog/what-recent-vulnerabilities-mean-to-rust/ This is another reminder that parser bugs go deeper than memory safety. This bug reminds us that we need to mind BOTH input AND output languages, both the caller and callee languages, both the unparsers and the parsers. The RustTLS bug has the same lesson: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-32650 Memory safety is beautiful and so is Rust; they are deep magic. Yet parser correctness is the deeper magic.[*] [*] Composition is deeper magic still: "Cross-Language Attacks", https://www.ndss-symposium.org/ndss-paper/auto-draft-259/, but we really do need to get our parsers right first! ----- Amazing Parser Differentials and where to find them: ===[ The Winner: https://gitlab.com/gitlab-org/gitlab/-/issues/437819, "Subsequently the verified devfile YAML is passed on to some Go binary in the devfile-gem. Due to YAML being a complex format the Ruby and the Go parser differ a bit and we can construct a YAML file which doesn't seem to have a parent key in Ruby but has one in Go." Two memory safe languages, both alike in dignity, are disagreeing here. It is a thing of beauty. It also drives home the point that no data format is so simple as to not need a mechanized definition, and formats considered to be "infrastructure as code" definitely should have one! ---[ Runner-up: Node.js + GCP/Akamai/ATS request smuggling vulnerability caused by differences in interpretation of carriage returns within optional whitespace in HTTP/1.1 chunk-extensions The details: https://youtube.com/watch?v=aKPAX00ft5s&t=9919s A brief PoC: https://langsec.org/spw24/Node_js_Parser_Differential.pdf This bug joins a long line of classic parser differentials in the clouds such as "HTTP2, The Sequel is Always Worse" (https://portswigger.net/research/http2). Perhaps the clouds are actually made of parser differentials? For a great review of cloud parser differentials, see this year's workshop's invited presentation by Bahruz Jabiyev. ------ The Weirdest machine: ===[ The Winner: This award goes to Ian Beer, Ben Hawkes, and Samuel Groß for decyphering and illuminating weird machines in the wild, including the most recent ones such as OffensiveCon'24, "Blasting Past Webp" by Ian Beer and the classic https://googleprojectzero.blogspot.com/2021/12/a-deep-dive-into-nso-zero-click.html It is clear that there is a growing gap between private capabilities and public ones. Given that private entities do not share their mindset, learnings, or scientific structure of their thinking, reversing and re-discovering these things are tremendously needed. ---[ Runner-up: "EPF: Evil Packet Filter", Di Jin, Vaggelis Atlidakis, and Vasileios P. Kemerlis Paper: https://www.usenix.org/system/files/atc23-jin.pdf, USENIX Annual Technical Conference (ATC) 2023 Tools: https://gitlab.com/brown-ssl/epf Domain-specific virtual machines are a marvelous pattern for managing complexity. DSL-focused designs that use virtual machines make it possible to change running production systems at datacenter scales where an equivalent change in C would be unthinkable. These designs are also arguably the most proof-friendly, with clearer small-step semantics and properties than most alternatives. This work reminds us that, even so, these designs are input-driven, capable machines that can get very weird indeed. Informal clarity was great to get this pattern going, but will not be enough, especially as more and more infrastructure is based on them.