<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>A Final Ward</title>
	<link href="https://sockpuppet.org/atom.xml" rel="self" type="application/atom+xml"/>
	<link href="https://sockpuppet.org/" rel="alternate" type="text/html"/>
	<updated>2026-09-25T00:00:00Z</updated>
	<id>https://sockpuppet.org/</id>
	<author>
		<name>Thomas &amp; Erin Ptacek</name>
	</author>
	<generator uri="https://gohugo.io/">Hugo</generator>

	<entry>
		<title type="html">What Even Is An OS Now?</title>
		<link href="https://sockpuppet.org/blog/2026/09/25/what-even-is-an-os-now/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2026/09/25/what-even-is-an-os-now/</id>
		<published>2026-09-25T00:00:00Z</published>
		<updated>2026-09-25T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;&lt;strong&gt;Crazy as it sounds to say this, since it&amp;rsquo;s all anybody&amp;rsquo;s been able to talk about for over a year, but the impact of AI on computing hasn&amp;rsquo;t yet sunk in.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Today I&amp;rsquo;m parting company with Fly.io to work with Kurt on a new project. I&amp;rsquo;m getting that out of the way so you all know up front I&amp;rsquo;m talking my book.&lt;/p&gt;&#xA;&lt;p&gt;When I was a little kid, a family friend sold us our first &amp;ldquo;computer&amp;rdquo; — scare quotes because I&amp;rsquo;m pretty sure it was a VTech Laser 200 clone, a chiclet keyboard Z80 that ran off cassette tapes and plugged into our TV. I was old enough to know what a computer was, and conceptually what it meant to program one, because I remember dreaming of all the dumb games I could make. Finally! We had a device that would allow me to make things like the &amp;ldquo;Hitchhiker&amp;rsquo;s Guide&amp;rdquo; text adventure I&amp;rsquo;d play at my dad&amp;rsquo;s office.&lt;/p&gt;&#xA;&lt;p&gt;But it booted straight into BASIC. That&amp;rsquo;s all it did. I was, like, 8 years old. I wasn&amp;rsquo;t about to learn BASIC. What I learned instead: computers were not as awesome as I&amp;rsquo;d imagined.&lt;/p&gt;&#xA;&lt;p&gt;By my mid-teens, computer security finally dragged me into programming. Coding only reinforced that crummy lesson. The more I understood how programs were constructed, the more forbidding it sounded to build an entire complicated application. I could belt out fast network servers no problem, but a word processor? You might as well have asked me to build a diesel locomotive.&lt;/p&gt;&#xA;&lt;p&gt;Suddenly, everything has changed. Computers now work the way I thought they did when I was 8.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been writing these past several months about all the native macOS apps I&amp;rsquo;ve been churning out, and how weird it is to watch AI dissolve the boundaries between backend programming and frontend, between web and native, systems and applications. All huge stories; any one of them would land in my career top 10 big shifts.&lt;/p&gt;&#xA;&lt;p&gt;But AI is knocking down a much more important boundary: the one between programmers and users. My Mac menu bar and task switcher are cluttered with icons for programs I conjured for myself, with English as my programming language.&lt;/p&gt;&#xA;&lt;p&gt;What I did on my computer, any power user can do on theirs.&lt;/p&gt;&#xA;&lt;p&gt;Will do on theirs.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s fucking inevitable.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s a statement about the reality; a &amp;ldquo;prediction&amp;rdquo;, if you want a concession to your skepticism about AI, but only in the sense that I can predict that the sun will rise in the east tomorrow. So what do you do with that?&lt;/p&gt;&#xA;&lt;p&gt;I think we&amp;rsquo;re all so bumfuzzled by the first-order impacts of AI that we haven&amp;rsquo;t considered the second-order effects.&lt;/p&gt;&#xA;&lt;p&gt;Consider: what does computing look like in a world where many (maybe most) applications have an audience of just 1-2 people? How is software distributed? What does it run on?&lt;/p&gt;&#xA;&lt;p&gt;When I was younger, I learned that programs were normally something you bought off the shelves at Egghead Software. Then I watched the shelves at Egghead become obsolete. Then boxed software altogether. Then software shipped on CD-ROMs — you know that&amp;rsquo;s why we call it &amp;ldquo;shipping&amp;rdquo;, right? we used to have to arrange shipping! —  wiped away by the Internet. Now I think I&amp;rsquo;m about to see something else start to wash away: the entire concept of prefabricated fixed-function applications.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what&amp;rsquo;s about to happen: users will increasingly interact with stuff they themselves conjured into being. Them, or people they’re on a first-name basis with. Programs will solve their problems specifically:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;How can I get an accurate weather forecast for Roscoe Village in Chicago when the nearest weather stations are attached to O&amp;rsquo;Hare and miss the lake effect?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Forget the map, just tell me if I should get off the Eisenhower Expressway and take Roosevelt, Madison, or Lake back home?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Is there a meeting happening anywhere right this minute that I&amp;rsquo;m supposed to be in?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;You can go on and on like this. These all sound trivial. That&amp;rsquo;s the point. They&amp;rsquo;re normal-life problems nobody would have built serious programs around, because the audience sounds too small.&lt;/p&gt;&#xA;&lt;p&gt;Today, almost all software comes from expert strangers. But soon, strangers will stop supplying our apps, and instead ship just their building blocks. Sure, there will still be megaproject browsers and word processors. But there&amp;rsquo;ll be thousands of times more applications that pull in 1/7th of the guts of a word processor to solve some idiosyncratic work or home life problem for somebody who doesn&amp;rsquo;t know what a for-loop is.&lt;/p&gt;&#xA;&lt;p&gt;You can disagree with me about all of this, but if you understand where I&amp;rsquo;m coming from, it&amp;rsquo;s all just straightforwardly obvious how weird this is going to make everything.&lt;/p&gt;&#xA;&lt;p&gt;Why do we have modern operating systems? It&amp;rsquo;s not simply to &amp;ldquo;provide access to hardware resources&amp;rdquo;; plenty of embedded systems do that with runtimes that have no business calling themselves an &amp;ldquo;OS&amp;rdquo;. No, the core purpose of a modern operating system is to partition different applications off from each other, and carefully control how they can communicate.&lt;/p&gt;&#xA;&lt;p&gt;That makes a lot of sense in a world where we&amp;rsquo;re importing all our software from strangers. It makes less sense in the world we&amp;rsquo;re heading to, where most of the software we&amp;rsquo;re carving up fiefdoms for has the same provenance. And it makes almost no sense in a world where every application is malleable, subject to growing new limbs at any moment on the whims of its creator.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s what we&amp;rsquo;re working on: a platform that is the device we would want to have in the world I just described. So: we&amp;rsquo;re building a phone.&lt;/p&gt;&#xA;&lt;p&gt;Every mainstream phone on the market in 2026 was planned (torturously, to death) in 2023. That&amp;rsquo;s how product cycles work. In 2023, computers were still devices designed to run deterministic fixed-function applications produced by a priesthood of professional programmers. And software was something users bought, not built.&lt;/p&gt;&#xA;&lt;p&gt;The soul of those phones is stuck in the 1970s. Dudes with big mustaches nailed down the design while hacking on VT52 terminals with Boston’s “More Than A Feeling” blaring on the FM radio perched on their workbenches. Since then, all we&amp;rsquo;ve done is scale and miniaturize that design so it fits in your pocket. It&amp;rsquo;s beautifully machined and sports a zillion pixels and does the same job as a DEC PDP-11: running prefab applications.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;re building a phone that isn&amp;rsquo;t designed to run fixed-function applications. I doubt anyone will ever get up on a stage and show off a AAA mobile game (that nobody plays) on it. It&amp;rsquo;s not for TikTok and short-form video, though I guess you can ask it for that. You can ask it for whatever: it&amp;rsquo;ll build apps for you, on the phone, whenever you want.&lt;/p&gt;&#xA;&lt;p&gt;I know what you’re probably thinking about all this. That&amp;rsquo;s OK: that means you&amp;rsquo;re a reasonable person. We&amp;rsquo;re betting that AI is about to do unreasonable things.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a long history of grand statements about the world attached to &amp;ldquo;and here&amp;rsquo;s my new company&amp;rdquo; buttons. It never goes well. I&amp;rsquo;m aware that no matter what I write here, I&amp;rsquo;m going to sound like yet another startup nerd talking about &amp;ldquo;the future of programming&amp;rdquo; before announcing that I&amp;rsquo;ve joined, like, Sri Lanka&amp;rsquo;s answer to Uber or something.&lt;/p&gt;&#xA;&lt;p&gt;I have a lot to say that I’m not saying now. Not because it’s secret, but to get the &amp;ldquo;new startup announcement&amp;rdquo; stink off the technical details.&lt;/p&gt;&#xA;&lt;p&gt;The last year in the technology industry has felt like 100 years all happening at once. Our industry is destabilized in a way nobody’s experienced since the advent of the personal computer. Every limit AI runs up against collapses within a month. Everything we do with frontier models today, in a few years we&amp;rsquo;ll be doing instantaneously and for free.&lt;/p&gt;&#xA;&lt;p&gt;When we were kids, we thought computers could do anything, if we could just get our hands on them. We had to become professional software developers to learn how much computers suck.&lt;/p&gt;&#xA;&lt;p&gt;Now we all have to unlearn that stuff, and think like kids again. So, here we go.&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">How To Write With An LLM</title>
		<link href="https://sockpuppet.org/blog/2026/09/17/how-to-write-with-an-llm/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2026/09/17/how-to-write-with-an-llm/</id>
		<published>2026-09-17T00:00:00Z</published>
		<updated>2026-09-17T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;&lt;strong&gt;Two simple rules that let LLMs streamline and improve your writing without pasteurizing and jacking it with corn syrup.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;It’s tricky to write about writing. It comes across as a brag; you’re implying that you write well. Maybe you do, and maybe you don’t, but there’s for damned sure a quorum of critics on the Internet somewhere that think you suck at it. I’m vain and insecure like everybody else and find writing this piece weirdly unpleasant. But I’m getting over myself and getting this down because this advice is important, hard to argue with, and straightforward.&lt;/p&gt;&#xA;&lt;p&gt;Readers can detect LLM words in the parts per trillion. However much work you put into scuffing up and humanizing it, an LLM paragraph will register to much of your audience not as writing but as output. So, first the bad news: you have to write for yourself.&lt;/p&gt;&#xA;&lt;p&gt;But LLMs are still extraordinarily useful. It’s just you need to use them like a copyeditor rather than a ghostwriter. So, step one of my method: write your piece. Then, step two: feed it to a good model to find flaws.&lt;/p&gt;&#xA;&lt;p&gt;But before we talk about how that works, there are two rules you need to understand. They’ll ward off LLM-creep that will knock you into the uncanny valley between expression and output and knock you out of your reader’s attention.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Rule Number One: You may not use a single word an LLM suggests to you.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Breaking this rule is what’s going to get you into trouble. Reason being: frontier models are supernaturally good at selecting pleasing turns of phrase. It’s sort of their whole thing. The problems with what models suggest are subtle. Think of it this way: frontier models are wedged in a mode where everything they write is a magazine headline. Headlines are good, but you’d wonder about someone who wrote an article with dozens of them.&lt;/p&gt;&#xA;&lt;p&gt;So I think that as a form of intellectual personal protective equipment you should adopt the rule that any specific turn of phrase an LLM suggests is off limits. Be strict about the rule! The whole premise here is that you’re not going to reliably spot all the ways frontier models will try to turn your writing into Velveeta. Even if you like the words, even if you’re sure they’re better than what you already have, LLM-generated phrases are DQ’d.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Rule Number Two: Avoid encouragement&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;LLMs also infect your writing through influence campaigns. This is a much subtler problem, and the damage is less obvious, but it’s still a way in which LLMs will make your writing worse, and if that’s going to be the outcome, you might as well not enlist LLMs at all.&lt;/p&gt;&#xA;&lt;p&gt;The issue: hand any piece of writing off to an LLM, and it replies “&lt;a href=&#34;https://www.youtube.com/watch?v=oHZ_hes6OcM&#34;&gt;that’s gold, Jerry&lt;/a&gt;!” But that’s not what you need to hear!&lt;/p&gt;&#xA;&lt;p&gt;In your first draft, most of your paragraphs are bad, your topic flow is incoherent, and you’ve got at least 750 words you don’t need. The model encourages you about your overall structure. Then, later, about paragraphs and transitions. Then word choices and metaphors. Pop culture references. They’re bad! All bad! Don’t listen!&lt;/p&gt;&#xA;&lt;p&gt;Here’s how this is going to fuck you. You’re going to double down on all your first-draft impulses. But that’s not normally what you’d do. You’d edit, rethink, and replace paragraphs. Those rethinks are load-bearing parts of your voice. Readers won’t put their fingers on what’s wrong, but they’ll sense that you’ve become artificially-flavored.&lt;/p&gt;&#xA;&lt;p&gt;For a couple years I opened every copyediting prompt with the lie that I am not the author, but instead the editor of an online publication, screening pieces for inclusion. This helps, but the model usually overshoots, overfitting to the “goals” of my “publication”.&lt;/p&gt;&#xA;&lt;p&gt;So for now, my best practical advice is: forbid the model from encouragement, and then be hypervigilant about praise.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;So, What Can These Things Do?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;They’re excellent at flagging problems. Boy, do you have a lot of them. You can spot them mechanically, but that’s tedious and exhausting work. The models don’t get tired. So they’re better than you at noticing:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;You’re overusing (or, if you’re taking the LLM’s word for everything, maybe underusing) passive voice, nominalizing your verbs or burying their action, and repeating the same turns of phrase or word choices.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;You’ve got “very” and “unfortunately” and “really” and “actually” sprinkled all over the draft like sawdust stuck to the work bench.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;There are almost certainly 2-3 paragraphs that you can quickly move somewhere else in the piece that instantly improve clarity (these are really, actually, very satisfying edits).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If you’re a programmer like me, you wish there was a book that provided a schematic for these kinds of edits, a sort of “&lt;a href=&#34;https://www.amazon.com/dp/0201498413&#34;&gt;C Interfaces And Implementations&lt;/a&gt;” that does for prose what Hanson does for the greatest terrible programming language. And: there is that book. It’s called “&lt;a href=&#34;https://en.wikipedia.org/wiki/Style:_Lessons_in_Clarity_and_Grace&#34;&gt;Style: Lessons In Clarity And Grace&lt;/a&gt;”, and I swear to Christ it turns copyediting into Java coding. Exactly the same tedium, exactly the same effectiveness. I found out about this book from Richard Gabriel and I’m surprised every programmer I know doesn’t have a copy on their desk.&lt;/p&gt;&#xA;&lt;p&gt;So read “Style”, or something like it, and take notes as you go. Come up with a list of prompts for a model, and then run them in passes over your work.&lt;/p&gt;&#xA;&lt;p&gt;You can get pretty far with this approach:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ask the model to spot problems in your writing.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;For each problem, rewrite the paragraph (or sentence, or section).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Present the original and new writing to the model and ask it which is better.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Annoyingly, here you run into a variant of Rule Two, because unless you’re careful, the model knows you just rewrote something, and knows you want to hear that the new version is better. So give the options to a model that doesn’t have the context of your editing process.&lt;/p&gt;&#xA;&lt;p&gt;I conjured a bit of software to manage this for me, after I finally lost patience juggling tabs and trying to persuade the models that I’m not an author but rather a helpful but stern writing coach trying to help a student who might be good but might be terrible. Here’s an opening prompt that worked well:&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;“We’re going to build a &lt;strong&gt;writing workshopping tool&lt;/strong&gt;. First get the bones up. Python, HTMX for interactions, SQLite backend, Tailwind frontend, use a local build not the CDN. Really excellent prose editor, Notion-style. Support highlighting (we’re going to do editing passes). Do Genius-style sidebar commentary to match highlighted things. Make sure we can tick forward and back through suggestions. Multiple documents, track revisions, allow user to flag major revisions. Get me this far and then I’ll tell you what I really want.”&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/09/17/how-to-write-with-an-llm/workshop.jpg&#34; alt=&#34;The workshopping tool, running an editing pass&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Then, give the thing the list of editing prompts you came up with, and have it run each through the Codex, Claude, or Antigravity CLIs. Whatever you come up with here, it’ll be better than mine, because whatever anybody comes up with on their own is better, for themselves, than someone else’s.&lt;/p&gt;&#xA;&lt;p&gt;So: don’t let an LLM pick your words. Be careful not to let it trick you into thinking your first draft is better than it is. Then outsource all the most tedious work to the model. Your voice stays intact, but your work is faster, better, and less painful.&lt;/p&gt;&#xA;&lt;p&gt;One last thing. Don&amp;rsquo;t take all of the model&amp;rsquo;s copyediting advice. This is a corrolary of Rule Two. I fed this piece to GPT5 a minute&#xA;ago (&amp;ldquo;I didn&amp;rsquo;t write this&amp;rdquo;), and it said the whole thing was 20% too long. It&amp;rsquo;s probably right. But I&amp;rsquo;m not fixing it. I&amp;rsquo;m just gonna be&#xA;me.&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">Stop Making TUIs</title>
		<link href="https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/</id>
		<published>2026-08-20T00:00:00Z</published>
		<updated>2026-08-20T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;&lt;strong&gt;Our field has a weird relationship with terminal and command line interfaces. The time has come to re-evaluate it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I’m on a kick lately getting my friends to try building native user interfaces. I built my first serious Mac application a few months ago, and since then I’ve built more native UI thingies than in my entire career prior to that. Let’s take a quick tour.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/SCR-MDV.png&#34; alt=&#34;MDV.app, a native macOS Markdown viewer&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is &lt;a href=&#34;https://github.com/tqbf/mdv&#34;&gt;MDV.app&lt;/a&gt;, the greatest Markdown viewer in the world until someone else writes a serious markdown viewer. I’ve already &lt;a href=&#34;https://sockpuppet.org/blog/2026/05/12/emacsification/&#34;&gt;written a bunch about MDV&lt;/a&gt; and won’t wear you down with more advocacy for it. It is great, though.&lt;/p&gt;&#xA;&lt;p&gt;I had almost no hand in writing this UI code. Why would I? Like most user interfaces, MDV doesn’t break any new ground. It’s not a challenging problem. But building good UI is very hard: this kind of code is tedious, repetitive, exacting, and gated by platform conceptual knowledge. It takes years to get good at this kind of work. Which is why I would never hand-write this program. Instead, I summoned it.&lt;/p&gt;&#xA;&lt;p&gt;Moving along:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/SCR-CAS.png&#34; alt=&#34;A native calculator-style frontend for SageMath&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I spent the last year doing &lt;a href=&#34;https://www.mathacademy.com/&#34;&gt;Math Academy&lt;/a&gt;, from Foundations I through Machine Learning, which you can shorthand as “I taught myself calculus”. I like Math Academy a lot and have a bunch to say about it, but here it’s just the set-up to another SwiftUI app I willed into being: a native calculator-style frontend for &lt;a href=&#34;https://www.sagemath.org/&#34;&gt;SageMath&lt;/a&gt;, which is the default math system for cryptographers.&lt;/p&gt;&#xA;&lt;p&gt;Three big things this app does for me: it automatically renders Sage output in LaTeX, which gets handier the deeper you get into multivariable calc, it point-and-click exposes Sage methods on objects like vectors, matrices, and expressions (which is much nicer than typing &lt;code&gt;trig_simplify&lt;/code&gt; over and over again), and it provides a “little language” of shorthand inputs that make common operations (like “take the gradient of this expression”) quick to type. &lt;code&gt;[1,2;3,4]&lt;/code&gt; is a matrix in this system; you should already be sold on it.&lt;/p&gt;&#xA;&lt;p&gt;I’m not packaging this application up. If you want it, just screenshot this section of the post and give it to Claude. It’ll build something useful. You see where I’m going with this.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/SCR-DJR.png&#34; alt=&#34;DJ Roomba, my Apple Music player&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt; &lt;em&gt;(it would be more useful if I cleaned up all my genre labels, most of which date back to the first MP3 rips I did back in 1997).&lt;/em&gt; This is DJ Roomba, my Apple Music player. The genre map is a dubious feature. What isn’t dubious is the embedded LLM agent, which has tool calls to read my library, my last played list, and my upcoming tracks. “I’m going to the basement shop to build a picture frame; give me a no-skips playlist to fit the mood”. Turns out the mood is “lots of Kurt Vile and Tom Petty”. No notes.&lt;/p&gt;&#xA;&lt;p&gt;It’s backended by a SQLite database, a sane one with a reasonable schema, which was also a surprisingly useful feature.&lt;/p&gt;&#xA;&lt;p&gt;I don’t really know what to think about programs like this. It’s an AI-assisted music player that includes 90% of the interface of Music.app. Music.app. My ever-present personal computing nemesis. This is the personal computing equivalent of slaying a dragon. But I didn’t write a single line of code in it. Am I developing software, or just configuring my computer?&lt;/p&gt;&#xA;&lt;p&gt;Hold that thought.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/SCR-WIKI.png&#34; alt=&#34;Self Driving Wiki.app, my LLMwiki&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is my LLMwiki. Somebody should write a popular, widely-shared piece on how valuable a self-driving wiki is, where you feed it source material and ask it questions and it writes the wiki for you. Wildly useful idea, I’m glad I thought of it.&lt;/p&gt;&#xA;&lt;p&gt;Self Driving Wiki.app was fun to write. Unlike DJ Roomba, which directly embeds a &lt;a href=&#34;https://developers.openai.com/api/reference/responses/overview&#34;&gt;Responses API&lt;/a&gt; client, this app drives  &lt;code&gt;claude -p&lt;/code&gt; under the hood. Because I assume that agents work better with a filesystem to grovel, I summoned a macOS virtual filesystem extension, which reflects a read-only view of the backing SQLite database as a mounted filesystem inside the app’s sandbox.&lt;/p&gt;&#xA;&lt;p&gt;Was this probably unnecessary? Does it make the app more annoying to install, for instance by requiring it for some reason to run out of &lt;code&gt;/Applications&lt;/code&gt;/? Yes, and also yes. But these kinds of yak-shaving excursions were the joy of software development in the pre-LLM era and I’m glad to discover that I can still experience them today.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/SCR-MFG.png&#34; alt=&#34;A semiautomated food macro tracker&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt; &lt;em&gt;(hyper-responder at 2.5 with zero side effects, this shit is choice)&lt;/em&gt; Here’s something I use constantly: a semiautomated food macro tracker. I’m &lt;a href=&#34;https://en.wikipedia.org/wiki/Tirzepatide&#34;&gt;glipping balls&lt;/a&gt; like  everybody else. The app is another simple agent fronting GPT5, taking very short meal descriptions like  &lt;code&gt;spitball a guess on the calories ingested tasting cake batter and cream cheese frosting (but I didn&#39;t eat any cake)&lt;/code&gt; and translating them to intake estimates.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/SCR-THERM.png&#34; width=&#34;238&#34; alt=&#34;Thermite, a menu-bar thermometer&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here’s a menu-bar application that tracks temperatures around my house using these cheap little TP-Link temperature sensors that are giving the Chinese Communist Party access to my Apple TV. Normally after putting something like this together I’d be able to tell you a lot more about the protocols and HTTP APIs these things use to communicate, but I did none of the work to figure that out, so all I can tell you is that there are two different sign-in paths to get information from their cloud and directly from the little sensor pods.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/SCR-REMOTE.png&#34; width=&#34;238&#34; alt=&#34;A menu-bar Apple TV remote control&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Finally, and speaking of my Apple TV, I present the holy grail of macOS native desktop software development: a working menu-bar Apple TV remote control. A couple years ago, I would have paid very good money for this, because I am exactly the kind of dork that tends to have an open MacBook on their lap while watching House Of Ninjas with his spouse.&lt;/p&gt;&#xA;&lt;p&gt; &lt;em&gt;(and to my Roku TV and my Denon receiver, since this is a universal remote)&lt;/em&gt; Talking directly to an Apple TV is a pain in the ass. But it turns out people already figured this out and wrote Python libraries to do it. I don’t “use” those libraries, because this is a native Swift app, but that doesn’t matter: whatever has been written in Python might as well have been implemented in Swift, C#, and Brainfuck as well. It’s all the same to a frontier model.&lt;/p&gt;&#xA;&lt;p&gt;I am somewhat self-aware. Preening about a bunch of SwiftUI interfaces I generated clearly invites clinical and unsparing critique of their visual design. Bring it on. But: as a longtime patron of the App Store, I’ll claim these designs are all a step ahead of replacement-level. Five years ago, if I’d had a macOS UI person on my team, I’d have been over the moon to get output of this quality.&lt;/p&gt;&#xA;&lt;p&gt;The truth is, I barely think about these things as “apps” (I have no intention to distribute them). They’re artifacts of me making my computer do stuff for me, the way I want it to. As a Unix nerd, I’ve always been able to do this, in the language of the command line. Now, it’s just as easy to do that kind of work with graphical interfaces.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;We build terminal interfaces because we have to, not because we should.&lt;/p&gt;&#xA;&lt;div class=&#34;callout stripe&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;But First, A Word About CLIs and TUIs:&lt;/strong&gt; command-line interfaces and terminal user interfaces are both products of the 1970s, shrink-wrapped around the constraints of teletype interfaces and dumb video terminals. Both tend to be &lt;a href=&#34;http://www.mutt.org/&#34;&gt;outmoded&lt;/a&gt;, &lt;a href=&#34;https://jqlang.org/&#34;&gt;hostile&lt;/a&gt;, and constrained relative to graphical interfaces. But these tendencies are intrinsic to TUIs, and not to CLIs. CLIs have purposes for which they’re irreplaceable. Building a CLI is almost always a good idea. Building a TUI almost never is.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Back in 1999, Neal Stephenson wrote an essay about command line interfaces that set the field of human-computer interaction back about 20 years. In it, he depicts the priesthood of Unix nerds wielding CLIs as powerful Morlocks, holding the entire computing industry on their shoulders. &lt;a href=&#34;https://en.wikipedia.org/wiki/Eloi&#34;&gt;The Eloi&lt;/a&gt; use GUIs like Microsoft Word. Because this is high-test fan-service, “In The Beginning Was The Command Line” has become &lt;a href=&#34;https://hn.algolia.com/?q=in+the+beginning+was+the+command+line&#34;&gt;one of our field’s sacred texts&lt;/a&gt;, despite very little of it holding up 25 years later.&lt;/p&gt;&#xA;&lt;p&gt;In reality, terminal interfaces don’t exist because of any special machine sympathy they create between computers and their operators. Rather, TUIs exist for just two reasons: modems, and because Unix nerds didn’t want to learn Motif.&lt;/p&gt;&#xA;&lt;p&gt;I can’t blame them. I had to do a &lt;a href=&#34;https://seclists.org/bugtraq/1997/May/198&#34;&gt;tiny bit of Motif work&lt;/a&gt; in the mid-1990s and it put me off UI development for the next 29 years. Curses is no great shakes, but you can learn it inside of 5 minutes. I’m not kidding: you wouldn’t pick raw curses today for a TUI, but go ask ChatGPT to give you a brief rundown (“don’t waste time explaining concepts”) of the bare minimum you’d need to write pico. Take the &lt;a href=&#34;https://gist.github.com/tqbf/064b87a76ce000bcdd4b366ed141d9bc&#34;&gt;code it hands you&lt;/a&gt; and compile it; it works. It’s clear where to go with it. There’s just not much to it.&lt;/p&gt;&#xA;&lt;p&gt;An agent can reliably build a native macOS interface that is reasonable, by dint of using the SwiftUI frameworks the way Apple tells you to. This is a difference between native applications and web interfaces: sameyness is a good thing: native apps are supposed to look like other native apps.&lt;/p&gt;&#xA;&lt;p&gt;But there’s one of the problems with TUIs: even with a good framework, like &lt;a href=&#34;https://ratatui.rs/&#34;&gt;Ratatui&lt;/a&gt;, &lt;a href=&#34;https://textual.textualize.io/&#34;&gt;Textual&lt;/a&gt;, or &lt;a href=&#34;https://github.com/charmbracelet/bubbletea&#34;&gt;Bubbletea&lt;/a&gt;, you’re fighting the terminal to come asymptotically close to what every native framework does well out of the box. Scrolling and scroll targets are an obvious example. Drag and drop another. Text selection — it gets tricky when you’re using in-band signaling to draw window borders! Multiple floating windows. All this is before we get to image handling.&lt;/p&gt;&#xA;&lt;p&gt;You can spend an hour and get a decent version of a lot of standard controls in a TUI framework: a date picker, a secure text field, a progress bar, a text editor. But most of them won’t be as good as the system versions of the same widgets, and they won’t compose well without even more work.&lt;/p&gt;&#xA;&lt;p&gt;All this stuff just works out of the box in native UI.&lt;/p&gt;&#xA;&lt;p&gt;You are about to tell me, in no uncertain terms, why we’ll all be using and enjoying TUIs in 2046. Allow me to anticipate a couple of your arguments.&lt;/p&gt;&#xA;&lt;p&gt;TUIs are economical and fast interfaces with high information density. Nerds don’t just like them for their retro aesthetics. They appreciate being able to knock out complex tasks in seconds with just a couple keystrokes.&lt;/p&gt;&#xA;&lt;p&gt;These are all true statements, but to make that argument persuasive, I’d need to start that paragraph with the word “only”, and if I did that I’d be lying. Graphical interfaces tend not to be economical, dense, or keyboard-y. But that’s usually because they’re not designed for nerds (even on Linux, graphical interfaces are often aspirationally designed for the mythical normie Linux On The Desktop user). Nothing is stopping you from designing a dense and economical GUI. &lt;a href=&#34;https://professional.bloomberg.com/products/bloomberg-terminal/#terminal-in-action&#34;&gt;It’s been done!&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;To me, these TUI niceties are a powerful argument for doing more graphical work, because it’s become easy and cheap to experiment on this stuff, and I want to see a native UI built to capture everything that’s great about Magit or Lazygit (without having to build it myself).&lt;/p&gt;&#xA;&lt;p&gt;Next: TUIs work over SSH connections. If you need a user interface on prod, it’s going to be a TUI.&lt;/p&gt;&#xA;&lt;p&gt;The problem with this argument is that you probably don’t need a user interface on prod. You need a command line interface on prod that a user interface on your Macbook can drive. Anybody that’s ever done &lt;a href=&#34;https://bpftrace.org/&#34;&gt;anything with bpftrace&lt;/a&gt; should know this in their bones, at least by the 3rd time they’ve built a bar chart out of hash marks. Fortunately, there’s precedent for this: check out &lt;a href=&#34;https://www.eldelto.net/articles/emacs-tramp-is-awesome&#34;&gt;Emacs TRAMP&lt;/a&gt;, which efficiently hides SSH connections and presents a native (and graphical, if that’s your bag) editor experience for remote files that &lt;a href=&#34;https://news.ycombinator.com/item?id=27822867&#34;&gt;even works with LSPs&lt;/a&gt; and Magit.&lt;/p&gt;&#xA;&lt;p&gt;People will tell you that TUIs are accessible.&lt;/p&gt;&#xA;&lt;p&gt;The problem with this argument is that it’s &lt;a href=&#34;https://www.osnews.com/story/144892/the-text-mode-lie-why-modern-tuis-are-a-nightmare-for-accessibility/&#34;&gt;probably false&lt;/a&gt;. I want to be careful with this argument, because I’m not a customer of accessibility features. All I can do is go off the experiences of people who do a11y work. &lt;a href=&#34;https://www.youtube.com/watch?v=jdF0TkZpMvk&amp;amp;t=991s&#34;&gt;Like this speaker&lt;/a&gt; describing how screen readers read all the line-by-line updates of TUI “chrome”; &lt;code&gt;hash mark, hash mark, hash mark, hash mark, dash, dash&lt;/code&gt;. Seems bad!&lt;/p&gt;&#xA;&lt;p&gt;Modern native UI frameworks were designed from the jump to do accessibility well. SwiftUI keeps two UI trees, a visual one and a semantic accessibility tree. There are TUI frameworks that, admirably, &lt;a href=&#34;https://github.com/charmbracelet/huh&#34;&gt;try to get this right&lt;/a&gt;. I’m not here to tell you TUIs can’t be accessible; just that accessibility is not a reason to prefer TUIs to GUIs.&lt;/p&gt;&#xA;&lt;p&gt;Finally, I can think of one strong argument for TUIs: they’re cross-platform.&lt;/p&gt;&#xA;&lt;p&gt;I can get an agent to build native UI for me on Windows and Linux and I’m confident I’ll end up with something reasonable. But I don’t have Windows and Linux desktops to play with those interfaces on, and while the ground is certainly shifting below all of our feet, I think we can all agree there remains an important distinction between vibe-coding and vibe-shipping. Somebody soon is going to ship an app that they literally haven’t looked at or used. But it won’t be me.&lt;/p&gt;&#xA;&lt;p&gt;Meanwhile, if I build a TUI, I can be reasonably sure that Linux users are going to get the same experience I have. That’s not nothing. But remember: I’m not really building applications for other people to use. I’m building them for me. TUI affordances are an awfully big hit to take to get Linux users of programs I don’t even want to publish.&lt;/p&gt;&#xA;&lt;p&gt;A couple years ago, these arguments would have been deeply silly. Not because TUIs were good but because native UI wasn’t a reasonable ask. As evidence for that, observe that we’ve spent the better part of a decade living with Electron apps. That was because native UI was hard to do well. But it isn’t anymore, and we should be doing more of it.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt; &lt;em&gt;I can only speak for MacOS development, and then assume that GTK 4 in Linux and WinUI 3 in Windows are comparably easy.&lt;/em&gt; If I’ve piqued your interest, I’m happy to say there’s not much to getting a decent native MacOS app.&lt;/p&gt;&#xA;&lt;p&gt;What I did was to go trawling for skills, ending up taking this &lt;a href=&#34;https://github.com/ceorkm/macos-design-skill&#34;&gt;macOS design skill&lt;/a&gt;, a basic typography skill (any one you found on Github today would be better than what I’m using), and &lt;a href=&#34;https://github.com/twostraws/swiftui-agent-skill&#34;&gt;Paul Hudson’s SwiftUI skill&lt;/a&gt;. I also took &lt;a href=&#34;https://swift.airbnb.tech/skill&#34;&gt;Airbnb’s Swift language skill&lt;/a&gt;, because I haven’t grown out of caring whether the code I generate is idiomatic.&lt;/p&gt;&#xA;&lt;p&gt;You want to make sure you’ve got &lt;code&gt;computer-use&lt;/code&gt;, or whatever Codex calls it, enabled. You want to be able to fire this off, go make lunch, and come back to an app that works well enough to be pleasant to debug. That works way better when the agent can see and drive the app.&lt;/p&gt;&#xA;&lt;p&gt;My biggest quality-of-life win is never having to open Xcode. Thankfully, my friend Josh built a purely Makefile-driven build process after trying to compile &lt;a href=&#34;https://github.com/tqbf/mdv&#34;&gt;MDV&lt;/a&gt; for himself. I’ve just had Claude copy it to every new project I do.&lt;/p&gt;&#xA;&lt;p&gt;In fact, that’s my entire process at this point: I &lt;a href=&#34;https://github.com/tqbf/swiftui-app&#34;&gt;copy a template app directory&lt;/a&gt;, open Claude or Codex in it, and tell it what I want to build. I don’t think my template is particularly good, and I think someone more competent than I am should build the truly-good SwiftUI proto-app (or, if it already exists, you should tell me about it).&lt;/p&gt;&#xA;&lt;p&gt;I use a similar process to build TUI apps (tell your agent to use &lt;code&gt;tmux&lt;/code&gt; to test the TUI, it works a treat). But it’s not clear to me that I’ll ever want to build a TUI again.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;Frontend programmers, backend programmers, lend me your ears. I come not to bury TUIs, but rather to entreat you to stop building new ones.&lt;/p&gt;&#xA;&lt;p&gt;I’ll cop to it right now: I’ve never really liked TUIs. Coming up in the 1990s, I was a Mutt person (after being an Elm person, and before that a Pine person) — until the moment I could stop doing that and use a graphical mail reader.&lt;/p&gt;&#xA;&lt;p&gt;So this whole piece could be read as a snarky profession of my personal preferences. That kind of thing: not out of character for me!&lt;/p&gt;&#xA;&lt;p&gt; &lt;em&gt;(or whatever’s been &lt;a href=&#34;https://signal.org/download/&#34;&gt;passing for native&lt;/a&gt; these last ten years)&lt;/em&gt; But the interesting thing here isn’t whether you like terminal interfaces or not. Believe it or not, I’m not trying to yuck your yum. I’m just noticing something that I think hasn’t broken through yet: after decades of dividing software development into “frontend” and “backend”, and frontend further into “web” and “native”, agents have dissolved most of those boundaries. You can reasonably default to building native user interfaces for things, and those interfaces will be kind of good.&lt;/p&gt;&#xA;&lt;p&gt;If, like me, you’ve spent decades thinking of yourself as a systems programmer that doesn’t produce user interface code, or worse, that your station in the industry is to produce user interface code where windows are drawn out of ASCII characters, it’s time to recalibrate.&lt;/p&gt;&#xA;&lt;p&gt;It’s one thing to just not care about user interface, or maybe even to abhor good user interface in favor of weird 1970s aesthetics. I won’t kink shame: there was a time in my life where I ran &lt;a href=&#34;https://en.wikipedia.org/wiki/Enlightenment_%28window_manager%29&#34;&gt;Enlightenment&lt;/a&gt;. But if you’re the kind of Unix Morlock who was also a secret Eloi-sympathizer, and appreciated interfaces like NetNewsWire, Transmit, Little Snitch, and Audio Hijack, stop and listen to me. If you haven’t tried your hand at turning one of your 500 throwaway CLIs into a native app, you’re doing yourself a disservice. Go build a native UI. It’ll probably change the way you think.&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">The Emacsification of Software</title>
		<link href="https://sockpuppet.org/blog/2026/05/12/emacsification/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2026/05/12/emacsification/</id>
		<published>2026-05-12T00:00:00Z</published>
		<updated>2026-05-12T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;&lt;b&gt;You want a good Markdown viewer more than you think you do.&lt;/b&gt;&lt;/p&gt;&#xA;&lt;p&gt;We’re all reading a ton of Markdown. It&amp;rsquo;s been the lingua franca of software development since long before LLMs. But now agents have led us into a cursed renaissance of TUI tooling, and the reading experience has become intolerable. I’m certain that at least 14% of the agita about AI code is driven by exhaustion over incessantly scrolling terminal Markdown.&lt;/p&gt;&#xA;&lt;p&gt;There are good TUI Markdown viewers. The Charm folks built &lt;a href=&#34;https://github.com/charmbracelet/glow&#34;&gt;&lt;code&gt;glow&lt;/code&gt;&lt;/a&gt;, which I used &amp;amp; enjoyed. My friend Josh built &lt;a href=&#34;https://github.com/jvanderberg/markless&#34;&gt;Markless&lt;/a&gt;, which is handsome and bristling with features, most notably a table-of-contents nav. These tools are great. But they’re hamstrung by the terminal itself, which is almost always monospaced and thus fatiguing to read.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/05/12/emacsification/markless.png&#34; alt=&#34;A screenshot of Josh&amp;rsquo;s Markless&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;There are good graphical UI Markdown editors. On macOS, where I live, there’s &lt;a href=&#34;https://obsidian.md/&#34;&gt;Obsidian&lt;/a&gt;, &lt;a href=&#34;https://typora.io/&#34;&gt;Typora&lt;/a&gt;, and &lt;a href=&#34;https://bear.app/&#34;&gt;Bear&lt;/a&gt;, my personal daily driver. Native UI Markdown editors are attractive and legible.  Good reading experiences. But they’re editors. My editors live in particular virtual desktops, with windows arranged just-so, and it drives me up a fucking wall when I click a random &lt;code&gt;.md&lt;/code&gt; file and it messes with my editing environment.&lt;/p&gt;&#xA;&lt;p&gt;So I took a trip to the App Store, where there are in fact Markdown viewers. They&amp;rsquo;re fine-ish. None of them were good. All I want is for something sane to happen when I double click a &lt;code&gt;.md&lt;/code&gt; file, and the viewers you can grab off the App Store do at first seem sane. It’s only after you live with them for a bit that the problems become apparent. Several of them lack text search. Some have in-app purchases(?!). I settled on one, only to discover a couple days later that it didn’t support copying text into the paste buffer. At that point, I was done.&lt;/p&gt;&#xA;&lt;p&gt;Suddenly, I realized: a good Markdown viewer was a dumb thing to waste time looking for. It’s 2026. I can just have one extruded for me.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;It took several hours to generate a better Markdown viewer than I could find on the App Store, but only about 30 minutes of that was interactive. The rest of it was spent yelling about zoning reform on Facebook while Claude chugged away. &lt;a href=&#34;https://github.com/tqbf/mdv&#34;&gt;Behold, MDV.app&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/05/12/emacsification/mdv.png&#34; alt=&#34;A glorious screenshot of MDV.app&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Now, I’m cheating a little bit with that timeline, because I’d done some preparation weeks before. I recruited an old Macbook to run Claude on. I set up Xcode and git. I got Claude configured, and tracked down some Swift and macOS design skills. But the viewer itself, to a viable state, better than what was on the app store: about 30 minutes.&lt;/p&gt;&#xA;&lt;p&gt;MDV isn&amp;rsquo;t the best macOS application ever built. Or even a particularly competent piece of software (although: it might well be the best dedicated macOS Markdown viewer). But it has improved my quality of life immensely.&lt;/p&gt;&#xA;&lt;p&gt;It does all sorts of cool things. Claude and I have cracked the code on selecting and copying text out of documents, and on finding fixed strings inside of them. Also: MDV  keeps a SQLite FTS index of all the Markdown files in its (editable) history, along with hot-keyed bookmarks and a table-of-contents nav. It remembers my place, across restarts, in documents as I toggle between them. And it has fussy color themes and decent typography, which is the most important feature a dedicated Markdown viewer can have. All this stuff just works now, any time I click a &lt;code&gt;.md&lt;/code&gt;. It’s great.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;Here’s how I know this is a big deal: because every time someone sends me a Signal message, my screen flickers. It doesn’t stop until I explicitly hide the Signal app, which I always forget to do until I’ve been driven 30% of the way to a migraine by subtle flickering.&lt;/p&gt;&#xA;&lt;p&gt;This is happening because Signal is an &lt;a href=&#34;https://www.doyensec.com/services/electronjs-based-applications.html&#34;&gt;Electron app&lt;/a&gt;, which means that even though it looks like a native macOS app, it’s not. It’s a whole-ass copy of Chromium rendering a secret web page. It shares this property with virtually every UI app shipped in the last 10 years, each of which carries its own flickering copy of Chromium.&lt;/p&gt;&#xA;&lt;p&gt;Electron isn’t good. But it’s always been good enough. Building real native user interfaces has historically been a difficult problem, beginning with finding even replacement-level talent to do the work. Capable macOS native UI developers are rare birds.&lt;/p&gt;&#xA;&lt;p&gt;But Claude isn’t just a replacement-level SwiftUI developer. Claude is actually good.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;This isn’t a post about the impending death of Electron (if only). It’s also not about getting you to use my awesome Markdown viewer &lt;a href=&#34;https://github.com/tqbf/mdv/releases&#34;&gt;which is trivially easy to install&lt;/a&gt; and better than any viewer on the app store and you should definitely use it.&lt;/p&gt;&#xA;&lt;p&gt;Actually, no! Stop. Don’t install it. Treat my awesome Markdown viewer, which is awesome, in the same way an Emacs user treats a particularly shiny &lt;code&gt;.emacs&lt;/code&gt;. Steal the idea and make a better one.&lt;/p&gt;&#xA;&lt;p&gt;For those unfamiliar, here’s how Emacs culture works: its lifers build whole applications in elisp (one of the world’s &lt;a href=&#34;https://www.perl.org/&#34;&gt;great&lt;/a&gt; &lt;a href=&#34;https://www.tcl-lang.org/about/language.html&#34;&gt;awful&lt;/a&gt; &lt;a href=&#34;https://www.gnu.org/software/bash/&#34;&gt;languages&lt;/a&gt;). These &amp;ldquo;applications&amp;rdquo; are always started to scratch a personal itch related to text editing, and invariably expand in ambition and scope past any reasonable boundaries of what text editors should do. If you look at /r/emacs, it’s 0% Product Hunt, 100% show-and-tell.&lt;/p&gt;&#xA;&lt;p&gt;There are popular elisp packages lots of people use. But except for &lt;a href=&#34;https://magit.vc/&#34;&gt;Magit&lt;/a&gt;, nerds are alarmingly apt to replace them with their own shinier versions (and then to show them off, transitioning to the spore-forming phase of the elisp lifecycle). Everything in Emacs is malleable.&lt;/p&gt;&#xA;&lt;p&gt;Until now, the Achilles heel of Emacs culture has been that, except for Magit, its packages tend to be wretched user experiences. Ugly, slow, and discoverable only after inflicting years of elisp cortical injuries on yourself.&lt;/p&gt;&#xA;&lt;p&gt;But AI agents have fracked Emacs culture, and it’s leaking out into the wider world. Given access to a screen and inputs, agents reliably build native user interfaces. Native UI was the province of professionally packaged programs. Now it’s all as bespoke as your editor configuration. And, while I’m sure there’s an upper limit to how good those interfaces can be (with current frontier models), that ceiling is higher than anything you can do in a TUI.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;What does it mean for software to be Emacsified? Let’s get into it.&lt;/p&gt;&#xA;&lt;p&gt;First, it&amp;rsquo;s personal software. Most of it will be useful only to its creator, and then forgotten, just like the dozens of obsolete little elisp programs littering my &lt;code&gt;.emacs&lt;/code&gt;. Personal software defines the ethos of Emacs, which was carefully designed over decades to nurture these kinds of tools. &amp;ldquo;Emacsification&amp;rdquo; clocks that everything now works this way, not just baroque text editors.&lt;/p&gt;&#xA;&lt;p&gt;Still, every once in a while, one of these programs will escape containment. It’ll be useful enough for more than one person to install. But even then, the released artifact won’t be the most important thing about it. The source code won’t be either. If an agent wrote all the SwiftUI code in my project, what do you have to gain from closely reading it?&lt;/p&gt;&#xA;&lt;p&gt;I’m probably only a little bit right about this, but I think a significant driver of new Emacs packages is a catalytic reaction between &lt;em&gt;your&lt;/em&gt; messy local configuration and &lt;em&gt;everyone else’s&lt;/em&gt; elisp code. Once you know how to get things done in elisp, it can be easier to build your own solution than to &lt;code&gt;package-install&lt;/code&gt; an existing one. In that kind of environment, the code is of passing interest. What matters are the ideas, the observation that “yeah, you can do that, and it’ll work well”.&lt;/p&gt;&#xA;&lt;p&gt;For the kinds of software I’m talking about, you want the prompts more than you want the source code.&lt;/p&gt;&#xA;&lt;p&gt;If you’re a nerd comfortable with the idea of rolling your own software, everything is now programmable, not merely in a technical sense but a practical one. And that gets to a feeling I think a lot of people have when creating software with agents: what does it mean to say you’re “building” it? “Building” implies more effort than you’re expending. What you’re doing feels a lot more like configuring, on a platform that has suddenly become vastly more configurable. A platform that feels a lot more like Emacs.&lt;/p&gt;&#xA;&lt;p&gt;❦&lt;/p&gt;&#xA;&lt;p&gt;The first thing an AI-pilled developer tells you after taking the plunge  is how they’re finally finishing all the random side projects they’d collected over the years.&lt;/p&gt;&#xA;&lt;p&gt;That was an exciting prospect on its own. But it is now also the case that those things, hyperspecific as they might be, can also be pleasant to use. It&amp;rsquo;s not lost on me the irony of Emacsification undercutting many of the arguments for putting up with Emacs itself, and its janky user interfaces. Magit is still the best thing going. For now.&lt;/p&gt;&#xA;&lt;p&gt;I don’t have a grand pronouncement to offer about the Future of Software. But I’m pretty sure nerd software is going to get a lot more interesting. How many clanky terminal apps can we drastically (and easily) improve? I’ll finally be able to understand &lt;code&gt;iostat&lt;/code&gt;! Across a fleet of hosts, even. And &lt;code&gt;bpftrace&lt;/code&gt;! Have you seen the shit &lt;a href=&#34;https://www.brendangregg.com/blog/2019-08-19/bpftrace.html&#34;&gt;Brendan Gregg had to put up with&lt;/a&gt; to do terminal visualizations from &lt;code&gt;bpftrace&lt;/code&gt;? You don’t have to put up with any of this anymore. &lt;a href=&#34;https://gist.github.com/tqbf/03d7d3656a41f838308e6ce55224ebe3&#34;&gt;In fact, neither do I. &lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2026/05/12/emacsification/bpfui.png&#34; alt=&#34;A screnshot of BPFUI&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I’m a vulnerability researcher, and I’ve been like a kid in the candy shop for the first half of 2026 with all the exploit development breakthroughs in agent coding. But I understand that makes me a weirdo, and that for most of you all that comes with those advancements is dread.&lt;/p&gt;&#xA;&lt;p&gt;So I’m glad to have something new to talk about that actually feels like an unalloyed good. Building native UI is now fun; a lot more fun than building web interfaces ever was. Give it a shot; make something stupidly specific to your own problems, enjoy it for a little while, and then share it somewhere — or, better yet, just a screenshot and the prompts you used to make it.&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">Vulnerability Research Is Cooked</title>
		<link href="https://sockpuppet.org/blog/2026/03/30/vulnerability-research-is-cooked/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2026/03/30/vulnerability-research-is-cooked/</id>
		<published>2026-03-30T00:00:00Z</published>
		<updated>2026-03-30T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;For the last two years, technologists have ominously predicted that AI coding agents will be responsible for a deluge of security vulnerabilities. They were right! Just, not for the reasons they thought.&lt;/p&gt;&#xA;&lt;p&gt;Within the next few months, coding agents will drastically alter both the practice and  the economics of exploit development. Frontier model improvement won’t be a slow burn, but rather a step function. Substantial amounts of high-impact vulnerability research (maybe even most of it) will happen simply by pointing an agent at a source tree and typing “find me zero days”.&lt;/p&gt;&#xA;&lt;p&gt;I think this outcome is locked in. That we’re starting to see &lt;a href=&#34;https://red.anthropic.com/2026/zero-days/&#34;&gt;its first clear indications&lt;/a&gt;. And that it will profoundly alter information security, and the Internet itself.&lt;/p&gt;&#xA;&lt;h3 id=&#34;notes-on-vulnerability-research&#34;&gt;Notes On Vulnerability Research&lt;/h3&gt;&#xA;&lt;p&gt;I got to ride along in the 1990s during the mad scramble to figure out the first stack overflow exploits. In  the wake of&lt;a href=&#34;https://news.ycombinator.com/item?id=45814193&#34;&gt; 8lgm’s 8.6.12 disclosure&lt;/a&gt;, we&amp;rsquo;d go to cons to huddle around terminals, fussing with GDB, explaining function prologues to each other, and passing around “&lt;a href=&#34;https://www.amazon.com/PANIC-System-Analysis-Handbook-CD-ROM/dp/0131493868&#34;&gt;PANIC! UNIX System Crash Dump Analysis&lt;/a&gt;”, which explained the interface between C code and SPARC assembly. The work was fun, and motivating; we trafficked in hidden knowledge, like a garage-band version of &lt;a href=&#34;https://ocw.mit.edu/courses/6-004-computation-structures-spring-2017/&#34;&gt;6.004&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Within a decade, the  mood had shifted. I’d talk to high-end exploit developers  &lt;em&gt;(by then I definitively wasn’t an elite exploit developer)&lt;/em&gt; . They&amp;rsquo;d still be talking comp.arch; &lt;a href=&#34;https://raw.githubusercontent.com/struct/mms/master/Modern_Memory_Safety_In_C_CPP.pdf&#34;&gt;C++ vtable layouts and iterator invalidation&lt;/a&gt;. But now, also oddly specific details about the mechanics of font rendering. The in-memory layouts of font libraries. How font libraries were compiled and with what optimizations. Where the font libraries happened to do indirect jumps.&lt;/p&gt;&#xA;&lt;p&gt;Font code is complicated, but not interesting for any reason other than being heavily exposed to attacker-controlled data. Once you&amp;rsquo;d destabilized a program with memory corruption, font code gave you the control you&amp;rsquo;d need to &lt;a href=&#34;https://projectzero.google/2015/06/what-is-good-memory-corruption.html&#34;&gt;construct reliable exploits&lt;/a&gt;. Understanding fonts was valuable, but arbitrary, a little like having to ace an orgo final for med school knowing you&amp;rsquo;d never care about orgo again after PGY1.&lt;/p&gt;&#xA;&lt;p&gt;Two reasons I&amp;rsquo;m telling you all this.&lt;/p&gt;&#xA;&lt;p&gt;First, vulnerabilities tend not to hide in the obvious “security” parts of programs, like where passwords are stored. Rather, you find them by following inputs across the circulatory system of a program, starting from whatever weird pores and sphincters that program happens to take user data from, and tracing it into whatever  glands and doodads digest and metabolize it.&lt;/p&gt;&#xA;&lt;p&gt;Second, we&amp;rsquo;ve been shielded from exploits not only by soundly engineered countermeasures but also by a scarcity of elite attention. Practitioners will suffer having to learn the anatomy of the font gland or the Unicode text shaping lobe or whatever other &lt;a href=&#34;https://www.cs.dartmouth.edu/~sergey/wm/&#34;&gt;“weird machines”&lt;/a&gt; are au courant, because that knowledge unlocks browsers, which are valuable and high-status targets. Plenty of important organs inside unglamorous targets “have never even seen a fuzzer”, let alone a teardown in a Project Zero post.&lt;/p&gt;&#xA;&lt;p&gt;This matters, because —&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-new-price-of-elite-attention-ε&#34;&gt;The New Price Of Elite Attention: ε&lt;/h3&gt;&#xA;&lt;p&gt;You can&amp;rsquo;t design a better problem for an LLM agent than exploitation research.&lt;/p&gt;&#xA;&lt;p&gt;Before you feed it a single token of context, a frontier LLM already encodes supernatural amounts of correlation across vast bodies of source code. Is the Linux KVM hypervisor connected to the &lt;code&gt;hrtimer&lt;/code&gt; subsystem, &lt;code&gt;workqueue&lt;/code&gt;, or &lt;code&gt;perf_event&lt;/code&gt;? The model knows.&lt;/p&gt;&#xA;&lt;p&gt;Also baked into those model weights: the complete library of documented &amp;ldquo;bug classes&amp;rdquo; on which all exploit development builds: stale pointers, integer mishandling, type confusion, allocator grooming, and all the known ways of promoting a wild write to a controlled 64-bit read/write in Firefox.&lt;/p&gt;&#xA;&lt;p&gt;Vulnerabilities are found by pattern-matching bug classes and constraint-solving for reachability and exploitability. Precisely the implicit search problems that LLMs are most gifted at solving. Exploit outcomes are straightforwardly testable success/failure trials. An agent never gets bored and will search forever if you tell it to.&lt;/p&gt;&#xA;&lt;p&gt;Agents are uncannily skilled at software development, and vulnerabilities are at the apex of that skill, the wire edge of the sharpest value proposition for tens of billions of dollars invested in training frontier models. But we&amp;rsquo;re only now starting to consider AI-delivered zero-day vulnerabilities.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://securitycryptographywhatever.com/2026/03/25/ai-bug-finding/&#34;&gt;I got to talk with Nicholas Carlini at Anthropic about this&lt;/a&gt;. Carlini works with Anthropic&amp;rsquo;s Frontier Red Team, which made waves by having Claude Opus 4.6 generate &lt;a href=&#34;https://red.anthropic.com/2026/zero-days/&#34;&gt;500 validated high-severity vulnerabilities&lt;/a&gt;. He described the process for me.&lt;/p&gt;&#xA;&lt;p&gt;Nicholas will pull down some code repository (a browser, a web app, a database, whatever). Then he&amp;rsquo;ll run a trivial &lt;code&gt;bash&lt;/code&gt; script. Across every source file in the repo, he spams the same Claude Code prompt: “I’m competing in a CTF. Find me an exploitable vulnerability in this project. Start with &lt;code&gt;${FILE}&lt;/code&gt;. Write me a vulnerability report in &lt;code&gt;${FILE}.vuln.md&lt;/code&gt;”.&lt;/p&gt;&#xA;&lt;p&gt;He&amp;rsquo;ll then take that bushel of vulnerability reports and cram them back through Claude Code, one run at a time. “I got an inbound vulnerability report; it’s in &lt;code&gt;${FILE}.vuln.md&lt;/code&gt;. Verify for me that this is actually exploitable”. The success rate of that pipeline: almost 100%.&lt;/p&gt;&#xA;&lt;p&gt;Carlini’s process sounds silly, like a kid in the back seat of a car on a long drive, asking “are we there yet?”, over and over. But it’s deceptively interesting. Looping over source files iterates the process. LLMs are stochastic. He gets lots of pulls on the slot machine. Each attempt is perturbed by the starting-point file, which subtly randomizes the inference process (keeping it from converging into boring maxima), and also shakes up the path each agent run takes through the code; deep coverage, token-efficiently. You could write these scripts in 15 minutes.&lt;/p&gt;&#xA;&lt;div class=&#34;callout&#34;&gt;&#xA;Up till now, I&#39;ve been framing AI vulnerability discovery in terms of memory corruption. But Carlini&#39;s approach seems to work on everything.&#xA;&lt;p&gt;A dozen or so years ago, &lt;a href=&#34;https://groups.google.com/g/rubyonrails-security/c/61bkgvnSGTQ?pli=1&#34;&gt;somebody figured out &lt;/a&gt;that if you ask nicely, Rails apps will accept HTTP parameters in YAML format. Also, the YAML code would instantiate arbitrary Ruby objects. Also, if you instantiate arbitrary objects, you can ping-pong through their initialization code to gain code execution. Three subtle (and long-present) details about framework internals, chained together, knocked the whole ecosystem on its ass for weeks.&lt;/p&gt;&#xA;&lt;p&gt;A frontier model trained on all the world&amp;rsquo;s open source web framework code already understands all of this, latently. It&amp;rsquo;s waiting for somebody to ask. Not &amp;ldquo;is Rails YAML an unmarshalling vulnerability&amp;rdquo; or &amp;ldquo;can Rails be coerced into unexpectedly parsing YAML&amp;rdquo;, but simply &amp;ldquo;can an anonymous web user get code execution on this app?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Carlini aimed his scripts at Ghost, the popular content management system, and it spat out a broadly exploitable SQL injection vulnerability.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;I’d started thinking about AI-driven vulnerability research by dreaming of all the fun  analysis tool calls a dedicated “security agent” could use: code indexers, model checkers, fault injectors, runtime instrumenters, fuzzers. But Nicholas skipped all the fun bits and went straight to “printing exploits”, right off the model.&lt;/p&gt;&#xA;&lt;p&gt;Back in 2019, Richard Sutton&amp;rsquo;s &lt;a href=&#34;https://www.cs.utexas.edu/~eunsol/courses/data/bitter_lesson.pdf&#34;&gt;“The Bitter Lesson”&lt;/a&gt; considered decades of AI research leveraging human expertise and domain-specific models, and concluded that none of it mattered. All that did matter was how much data you can train on and how much compute you can feed it through. Like many useful observations in CS, the Bitter Lesson is fractally true. It&amp;rsquo;s about to hit software security like a brick to the face.&lt;/p&gt;&#xA;&lt;p&gt;What’s happening in software security is this: researchers have been spending 20% of their time on computer science, and 80% on giant, time-consuming jigsaw puzzles. And now everybody has a universal jigsaw solver.&lt;/p&gt;&#xA;&lt;h3 id=&#34;hold-on-to-your-butts&#34;&gt;Hold On To Your Butts&lt;/h3&gt;&#xA;&lt;p&gt;In 2025, the vendor metagame for high-end exploit development was to buy a crate of Vyvanse and Provigil for a bunch of European Zoomers and have them stay awake for 4 days straight studying the memory lifecycle of CSS stylesheet objects. Vendors won&amp;rsquo;t need chemical accelerants (and Zoomers) much longer. A hundred instances of Claude or Codex will stay up all night every night for anyone who asks without asking for so much as a can of Diet Coke.&lt;/p&gt;&#xA;&lt;p&gt;Chrome, iOS, and Android should plan on an interesting 2026. But don&amp;rsquo;t worry about them too much. They&amp;rsquo;re well funded and expertly staffed. And they autoupdate.&lt;/p&gt;&#xA;&lt;p&gt;In a post-attention-scarcity world, successful exploit developers won&amp;rsquo;t carefully pick where to aim. They’ll just aim at everything. Operating systems. Databases. Routers. Printers. &lt;em&gt;The inexplicably networked components of my dishwasher.&lt;/em&gt;  These kinds of targets run everywhere, including in every regional bank and hospital chain in North America. To patch them, someone has to get in a car, drive somewhere inconvenient, and push a physical button.&lt;/p&gt;&#xA;&lt;p&gt;These weak points were priced into everyone’s cost of doing business. If a criminal exploits one, they win a ransomware heist. But lucrative as ransomware is, it&amp;rsquo;s not the jackpot earned from a reliable Chrome drive-by. So elite talent doesn&amp;rsquo;t bother. That load-bearing bit of risk analysis is built into every IT shop in North America. It no longer holds.&lt;/p&gt;&#xA;&lt;p&gt;Now consider the poor open source developers who, for the last 18 months, have complained about a torrent of slop vulnerability reports. I’d had mixed sympathies, but the complaints were at least empirically correct. That could change real fast. The new models find real stuff. Forget the slop; will projects be able to keep up with a steady feed of verified, reproducible, reliably-exploitable sev:hi vulnerabilities? That&amp;rsquo;s what&amp;rsquo;s coming down the pipe.&lt;/p&gt;&#xA;&lt;p&gt;Everything is up in the air. The industry is sold on &lt;a href=&#34;https://www.memorysafety.org/&#34;&gt;memory-safe software&lt;/a&gt;, but the shift is slow going. We&amp;rsquo;ve bought time with &lt;a href=&#34;https://securitycryptographywhatever.com/2024/10/15/a-little-bit-of-rust-goes-a-long-way/&#34;&gt;sandboxing and attack surface restriction&lt;/a&gt;. How well will these countermeasures hold up? A 4 layer system of sandboxes, kernels, hypervisors, and IPC schemes are, to an agent, an iterated version of the same problem. Agents will generate full-chain exploits, and they will do so soon.&lt;/p&gt;&#xA;&lt;p&gt;Meanwhile, no defense looks flimsier now than closed source code. Reversing was already mostly a speed-bump even for entry-level teams, who lift binaries into IR or decompile them all the way back to source. Agents can do this too, but they can also reason directly from assembly. If you want a problem better suited to LLMs than bug hunting, program translation is a good place to start.&lt;/p&gt;&#xA;&lt;h3 id=&#34;nothing-a-few-legislators-cant-fix&#34;&gt;Nothing A Few Legislators Can&amp;rsquo;t Fix&lt;/h3&gt;&#xA;&lt;p&gt;This shift is happening while public attention is fixed on AI, for good reasons (and some &lt;a href=&#34;https://blog.andymasley.com/p/the-ai-water-issue-is-fake&#34;&gt;dumb ones&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;If I want to freak myself out, I&amp;rsquo;ll imagine a viral video cut by a septuagenarian politician with an onion tied around their belt lecturing their phone about the dangers of artificial intelligence: job loss, energy prices, basilisks, computer security. Two of those risks are real! But computer security isn&amp;rsquo;t one of them.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t have strong opinions about AI regulation, and my concern isn&amp;rsquo;t that we&amp;rsquo;ll end up with bad AI regulation.&lt;/p&gt;&#xA;&lt;p&gt;What I&amp;rsquo;m worried about is that we&amp;rsquo;ll get bad computer security regulation. Our industry has agreed for decades about the ethics of vulnerability research. Specifically: that it&amp;rsquo;s computer science. Disclosing a vulnerability reveals important new information about the world, and knowing more about the world is a good thing.&lt;/p&gt;&#xA;&lt;p&gt;Security researchers are kidding themselves if they assume policymakers see it the same way.&lt;/p&gt;&#xA;&lt;p&gt;AI could make security research a lot more salient in our politics. We&amp;rsquo;ll be crafting AI regulations in the midst of a storm of news stories about hospitals managing patient charts with carbon paper and post-it notes after ransomware takes them out. New rules about AI-driven security research are more likely than not.&lt;/p&gt;&#xA;&lt;p&gt;These regulations will probably be incoherent and ineffective. When has that ever stopped anyone? Lawmakers won&amp;rsquo;t grasp the nuance that unregulated Chinese open-weight models will have the same capabilities 9 months from now, or that security regulation will impose asymmetric costs on defenders. Our own industry barely has a handle on these ideas.&lt;/p&gt;&#xA;&lt;p&gt;Are we prepared to advocate for vulnerability research itself? In a world where teenagers can get agents to generate full-chain browser vulnerabilities and remotes in operating system TCP/IP stacks, do we even agree about what the field should stand for anymore?&lt;/p&gt;&#xA;&lt;h3 id=&#34;fuck-if-i-know&#34;&gt;Fuck If I Know&lt;/h3&gt;&#xA;&lt;p&gt;I spent the last week bouncing these thoughts off veteran vulnerability researchers. Responses varied, but not one disagreed with the direction of my forecast.&lt;/p&gt;&#xA;&lt;p&gt;One old friend at a big vendor doubted that the transition I&amp;rsquo;m predicting will be as easy as I&amp;rsquo;ve made it sound. Layered defenses (hardened allocators, sandboxes, user/kernel barriers, virtualization) will make exploits nontrivial even after agents make vulnerabilities easy to find. But mostly we disagreed about how tooling-dependent AI agents would be. The future, to them, still belongs to people who can bring formal methods and program analysis tools to bear.&lt;/p&gt;&#xA;&lt;p&gt;If that turns out to be true, I&amp;rsquo;ll be happy to have been a little bit wrong. Those kinds of tools are the exciting part of security research. But either way, we both agree something disruptive (and: not in the VC-lingo sense of the term) is coming.&lt;/p&gt;&#xA;&lt;p&gt;Another friend who does policy work is confident that software security will stay statutorily safe. They point to the &lt;a href=&#34;https://cset.georgetown.edu/article/governor-newsom-vetoes-sweeping-ai-regulation-sb-1047/&#34;&gt;failure of things like California&amp;rsquo;s SB-1047&lt;/a&gt; and national executive policy that recognizes dual-use benefits for AI security research. I&amp;rsquo;m not entirely sure how I ended up on the &amp;ldquo;more cynical&amp;rdquo; side of legislative politics than this person, but I&amp;rsquo;m keeping my money on &amp;ldquo;the politics of this will end up stupid&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Some people I talk to are already seeing sharp upticks in validated vulnerability reports. Others are already running simple agent loops across their old targets and chuckling as handfuls of sev:hi&amp;rsquo;s they had missed before pop out.&lt;/p&gt;&#xA;&lt;p&gt;The smartest vulnerability researcher I know called me out on the strength of my prediction. They agree agents will generate working zero-days in, well, everything. But to them, it&amp;rsquo;s merely a product of settled science, variations on well-documented themes. Lots of technique isn&amp;rsquo;t documented at all, and it remains to be seen if LLM agents will be able to recapitulate any of it.&lt;/p&gt;&#xA;&lt;p&gt;That leaves room for human vulnerability research at the very highest end of the spectrum of sophistication. As someone who dearly loves the craft of tricking computer programs into doing unexpected stuff, and loves to &lt;a href=&#34;https://drownattack.com/&#34;&gt;read people explain how they worked out making those tricks happen&lt;/a&gt;, the thought reassures me.&lt;/p&gt;&#xA;&lt;p&gt;But most exploit development isn&amp;rsquo;t new science. Deep insight is sometimes a factor; also, who your friends are. But so are determination, luck, incentive, basic programming and debugging skill, and conversance with the literature. I spent 15 years getting paid to find and exploit vulnerabilities as a full-time job, and the most impactful findings tended to be &lt;a href=&#34;https://news.ycombinator.com/item?id=12541008&#34;&gt;the boring ones&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Vulnerability research outcomes now show up in the model cards from the frontier labs. These companies have so much money to spend on this work that they&amp;rsquo;re &lt;a href=&#34;https://am.jpmorgan.com/us/en/asset-management/adv/insights/market-insights/market-updates/on-the-minds-of-investors/is-ai-already-driving-us-growth/&#34;&gt;changing the shape of the national economy&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;So I think we&amp;rsquo;re living in the last fleeting moments where there&amp;rsquo;s any uncertainty that AI agents will supplant most human vulnerability research. Enjoy it, if that&amp;rsquo;s your thing, while you can. It&amp;rsquo;s not going to last.&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">I Went To SQL Injection Court</title>
		<link href="https://sockpuppet.org/blog/2025/02/09/fixing-illinois-foia/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2025/02/09/fixing-illinois-foia/</id>
		<published>2025-02-09T00:00:00Z</published>
		<updated>2025-02-09T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;Should public bodies in Illinois, like cities and school districts&#xA;and sheriff&amp;rsquo;s departments, be allowed to hide information from Freedom&#xA;of Information requests by keeping them in databases? That question is&#xA;before the 104th Illinois General Assembly, thanks to a bill sponsored&#xA;by Donald P. DeWitte, elected state senator by the wise citizens of&#xA;Batavia and Elgin (motto: &amp;ldquo;The City In The Suburbs&amp;rdquo;; indeed), and&#xA;prompted in part by my friend Matt Chapman.&lt;/p&gt;&#xA;&lt;p&gt;I play a very small part in this story, so I get to tell it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;&#xA;&lt;p&gt;Illinois has an &lt;a href=&#34;https://www.ilga.gov/legislation/ilcs/ilcs3.asp?ActID=85&#34;&gt;excellent,&#xA;toothy FOIA statute&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;With &lt;a href=&#34;https://casetext.com/statute/illinois-compiled-statutes/government/chapter-5-general-provisions/subchapter-freedom-of-information/act-140-freedom-of-information-act/section-5-ilcs-1407-exemptions&#34;&gt;very&#xA;few exceptions&lt;/a&gt;, any information collected by an Illinois public body&#xA;is public property. Anybody is entitled to ask for it. You can&amp;rsquo;t&#xA;generally be charged for asking. Public bodies can&amp;rsquo;t really limit the&#xA;number of requests you make. They get just 5 days to respond, with 5&#xA;additional extension days if requested in writing. Improper denials can&#xA;get you legal fee recovery if you sue over them, so there are lawyers&#xA;that will take these cases on contingency. It&amp;rsquo;s pretty neat!&lt;/p&gt;&#xA;&lt;p&gt;I think people are too shy about making FOIA requests. It&amp;rsquo;s easier&#xA;than it looks! You just need to send an email to the public body you&#xA;want information from. Put &amp;ldquo;FOIA&amp;rdquo; in the subject line. By law, there&amp;rsquo;s&#xA;no more ceremony to it than that. And you&amp;rsquo;ll find that the people&#xA;responding to those emails are generally kind and happy to help.&lt;/p&gt;&#xA;&lt;p&gt;The one big limitation of Illinois FOIA (with FOIA laws everywhere, really)&#xA;is that you can&amp;rsquo;t use them to compel public bodies to create new&#xA;records. Often, what you&amp;rsquo;ll be looking for is some kind of report about&#xA;some issue of public policy. If that exact report exists, you&amp;rsquo;re golden.&#xA;But if it doesn&amp;rsquo;t, you have to find and request the raw data for that&#xA;report, and you have to assemble it yourself. This limitation is about&#xA;to matter a lot.&lt;/p&gt;&#xA;&lt;p&gt;To understand what&amp;rsquo;s happening in this story, I&amp;rsquo;m going to have to&#xA;explain a technical concept: the idea of a &amp;ldquo;database schema&amp;rdquo;. More and&#xA;more of the information tracked by public bodies now lives in databases,&#xA;rather than filing cabinets or shared drives. Databases are organized&#xA;according to schemas.&lt;/p&gt;&#xA;&lt;p&gt;Think of a modern database as a huge Excel spreadsheet file, with&#xA;many dozens of tabs. Each tab has a name; under each of those tabs is a&#xA;separate spreadsheet. Each spreadsheet has a header row, labeling the&#xA;columns, like &amp;ldquo;price&amp;rdquo; and &amp;ldquo;quantity&amp;rdquo; and &amp;ldquo;name&amp;rdquo;. A database schema is&#xA;simply the names of all the tabs, and each of those header rows.&lt;/p&gt;&#xA;&lt;p&gt;Congratulations! You now understand databases.&lt;/p&gt;&#xA;&lt;h2 id=&#34;matt-chapman-vs-city-of-chicago&#34;&gt;Matt Chapman vs. City of Chicago&lt;/h2&gt;&#xA;&lt;p&gt;My friend Matt is a self-styled &amp;ldquo;&lt;a href=&#34;https://mchap.io/&#34;&gt;civic&#xA;hacker&lt;/a&gt;&amp;rdquo; and a national expert at performing data journalism with&#xA;large-scale FOIA requests. Matt&amp;rsquo;s love language is pushing FOIA statutes&#xA;to their limits, sniffing out buried data and bulk-extracting it with&#xA;clever requests.&lt;/p&gt;&#xA;&lt;p&gt;A good example of the kind of stuff Matt does is this &lt;a href=&#34;https://www.propublica.org/article/chicago-ticket-data-chi-hack-night&#34;&gt;ProPublica&#xA;collaboration&lt;/a&gt; about how Chicago issues parking tickets. After Matt&#xA;was towed over a facially bogus ticket and successfully took the city to&#xA;court over it, he got curious about the patterns of towing for things&#xA;like compliance violations. As it turns out, parking tickets have pushed&#xA;thousands of Illinoisans into bankruptcy, and, once you &lt;a href=&#34;https://mchap.io/parking-ticket-visualization-in-chicago.html&#34;&gt;get&#xA;your hands on the ticket data&lt;/a&gt;, it turns out there&amp;rsquo;s a very clear&#xA;pattern of majority-Black neighborhoods being systematically targeted&#xA;for higher enforcement.&lt;/p&gt;&#xA;&lt;p&gt;In the course of this reporting work, Matt learned about a system&#xA;Chicago operates called CANVAS. CANVAS is the central repository for all&#xA;parking ticket data in the city. It&amp;rsquo;s a giant database, and Matt would&#xA;very much like to know what&amp;rsquo;s in it. So he filed a FOIA request for the&#xA;CANVAS database schema.&lt;/p&gt;&#xA;&lt;p&gt;The city flatly refused. To do so, they relied on a specific&#xA;exemption in the statute:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;(o) Administrative or technical information associated with&#xA;automated data processing operations, including but not limited to&#xA;software, operating protocols, computer program abstracts, file layouts,&#xA;source listings, object modules, load modules, user guides,&#xA;documentation pertaining to all logical and physical design of&#xA;computerized systems, employee manuals, and any other information that,&#xA;if disclosed, would jeopardize the security of the system or its data or&#xA;the security of materials exempt under this Section.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;In plain English, this exemption says that public bodies aren&amp;rsquo;t&#xA;required to reveal information that might jeopardize the security of&#xA;their systems. You obviously can&amp;rsquo;t FOIA logins and passwords. You also&#xA;generally can&amp;rsquo;t FOIA the source code of programs they run. Chicago&#xA;claimed that Matt was a &amp;ldquo;hacker&amp;rdquo;, and that the CANVAS schema could in&#xA;the wrong hands put the city at risk.&lt;/p&gt;&#xA;&lt;p&gt;With the help of Merrick Wayne and Matt Topic of Loevy and Loevy,&#xA;Matt sued the city. Here&amp;rsquo;s where I come in.&lt;/p&gt;&#xA;&lt;h2 id=&#34;they-put-me-on-the-stand&#34;&gt;They Put Me On The Stand&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2025/02/09/fixing-illinois-foia/dresscode.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Is the CANVAS schema too scary to give Matt Chapman? To decide that,&#xA;we have to answer a bunch of questions:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Does disclosure of a database schema really jeopardize the security&#xA;of the system?&lt;/li&gt;&#xA;&lt;li&gt;How plausible or likely does that jeopardy need to be?&lt;/li&gt;&#xA;&lt;li&gt;Does a database schema constitute &amp;ldquo;source code&amp;rdquo;?&lt;/li&gt;&#xA;&lt;li&gt;Is a SQL schema a &amp;ldquo;file format&amp;rdquo;?&lt;/li&gt;&#xA;&lt;li&gt;And, finally, does the &amp;ldquo;would jeopardize&amp;rdquo; language apply to&#xA;everything in the exemption, or just to the nearest noun &amp;ldquo;any other&#xA;information&amp;rdquo;?&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve spent the last 25 years of my life doing software vulnerability&#xA;research, which is a stuffy way of saying that I&amp;rsquo;m a software developer&#xA;who looks for bugs in software that would let people do scary things.&#xA;Matt retained me as his expert witness for his trial, which took place&#xA;in Cook County Chancery Court. Lined up against me was Bruce Coffing, the&#xA;Chief Information Security Officer of the City of Chicago.&lt;/p&gt;&#xA;&lt;p&gt;The trial&#xA;would revolve mostly around questions 1-3.&lt;/p&gt;&#xA;&lt;p&gt;At this point, I need to read you in to another technical concept:&#xA;&amp;ldquo;SQL Injection&amp;rdquo;. &amp;ldquo;SQL&amp;rdquo; is the language most programs use to talk to&#xA;databases. &amp;ldquo;SQL Injection&amp;rdquo; is a security vulnerability that programs&#xA;that use SQL can have. It&amp;rsquo;s the primary way databases get attacked, and it&amp;rsquo;s&#xA;straightforward to explain.&lt;/p&gt;&#xA;&lt;p&gt;Applications that use databases include in their code &amp;ldquo;SQL queries&amp;rdquo;,&#xA;which are form-letter templates of questions they might need to ask the&#xA;database; for instance:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Retrieve the dates of every parking ticket issued to &lt;span style=&#34;background-color: lavender;&#34;&gt;&amp;rsquo;[INSERT&#xA;NAME]&amp;rsquo;&lt;/span&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Now, let&amp;rsquo;s say it comes time to pull tickets for &amp;ldquo;Dave Arnold&amp;rdquo;. Simple: stick&#xA;his name in the template:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Retrieve the dates of every parking ticket issued to &lt;span style=&#34;background-color: lavender;&#34;&gt;&amp;lsquo;Dave&#xA;Arnold&amp;rsquo;&lt;/span&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;But now imagine we need to look up &amp;ldquo;Bob O&amp;rsquo;Connor&amp;rdquo;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Retrieve the dates of every parking ticket issued to &lt;span style=&#34;background-color: lavender;&#34;&gt;&amp;lsquo;Bob&#xA;O&amp;rsquo;&lt;/span&gt;&lt;span style=&#34;background-color: lightsalmon;&#34;&gt;Connor&amp;rsquo;&lt;/span&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve confused the database: the name in our query is surrounded by&#xA;quotes, but our name includes a quote. Normally, when your program has&#xA;this bug, it just generates an error message. But attackers look for&#xA;this bug, and do things like:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Retrieve the data of every parking ticket issued to &lt;span style=&#34;background-color: lavender;&#34;&gt;&amp;lsquo;Bob O&amp;rsquo;&lt;/span&gt;&lt;span style=&#34;background-color: lightsalmon;&#34;&gt; and also&#xA;all the rest of the information in the database including everyone&amp;rsquo;s&#xA;passwords.&lt;/span&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This works because the quote the attacker supplied cuts off the text&#xA;placeholder in the template; all the rest of the attacker&amp;rsquo;s input gets&#xA;interpreted as code, which the database executes.&lt;/p&gt;&#xA;&lt;p&gt;Most of the people who will read this post are annoyed with me for&#xA;taking the time to explain SQL injection. But that is the experience of&#xA;getting on the stand in Chancery Court and making an argument that the&#xA;CISO of Chicago was wrong about database vulnerabilities: trying to&#xA;ensure that a judge shares your understanding of how software&#xA;vulnerabilities work.&lt;/p&gt;&#xA;&lt;p&gt;On the other hand, if you&amp;rsquo;re one of my non-nerd readers,&#xA;congratulations, you now know how to hack the Internets. If anybody&#xA;asks, I didn&amp;rsquo;t tell you any of this.&lt;/p&gt;&#xA;&lt;p&gt;The bench trial for Matt&amp;rsquo;s case came down to the question of whether&#xA;releasing the CANVAS schema would enable this attack. Specifically,&#xA;Bruce Coffing argued:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The schema makes it possible to spot&#xA;vulnerabilities.&lt;/li&gt;&#xA;&lt;li&gt;Further, it makes it easier for attackers to be&#xA;sneaky about probing for vulnerabilities.&lt;/li&gt;&#xA;&lt;li&gt;Finally, it helps attackers&#xA;pick which applications are most profitable to attack.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Coffing seems like a perfectly lovely and well-qualified person. &lt;strong&gt;But&#xA;no, no to all of this.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2025/02/09/fixing-illinois-foia/slowdown.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;To Coffing&amp;rsquo;s first point: you don&amp;rsquo;t find SQL injection&#xA;vulnerabilities by reading database schemas. You find them instead in&#xA;the application&amp;rsquo;s source code, where those database template queries&#xA;live. Matt isn&amp;rsquo;t asking for source code. He just wants the header rows&#xA;from the tables.&lt;/p&gt;&#xA;&lt;p&gt;Here I want to point out that &lt;a href=&#34;https://www.documentcloud.org/documents/6746618-Matt-Chapman-v-Department-of-Finance-XX-1092020/?q=file+layout&amp;amp;mode=document#document/p131&#34;&gt;I&#xA;fucked up in multiple ways&lt;/a&gt; expert-witnessing for Matt. For example,&#xA;in &lt;a href=&#34;https://youtu.be/pPC9Bntrsew?feature=shared&amp;amp;t=28&#34;&gt;my affidavit&lt;/a&gt;, I wrote that SQL schemas would provide &amp;ldquo;only marginal&#xA;value&amp;rdquo; to an attacker. Big mistake. Chicago jumped on those words and&#xA;said &amp;ldquo;see, you yourself agree that a schema is of some value to an&#xA;attacker.&amp;rdquo; Of course, I don&amp;rsquo;t really believe that; &amp;ldquo;only marginal value&amp;rdquo;&#xA;is just self-important message-board hedging. I also claimed on the&#xA;stand that &amp;ldquo;only an incompetently built application&amp;rdquo; could be attacked&#xA;with nothing but it&amp;rsquo;s schema. Even I don&amp;rsquo;t know what I meant by&#xA;that.&lt;/p&gt;&#xA;&lt;p&gt;I recovered my footing when I came up with this argument: &amp;ldquo;Attackers&#xA;like me use SQL injection attacks to recover SQL schemas. The schema is&#xA;the product of an attack, not one of its predicates&amp;rdquo;. This, too, is&#xA;self-important puffery. But I&amp;rsquo;ll tell you who loves &amp;ldquo;products&amp;rdquo; and&#xA;&amp;ldquo;predicates&amp;rdquo;, especially used in relation to each other in a single&#xA;sentence: a Chicago Chancery Court judge.&lt;/p&gt;&#xA;&lt;p&gt;To Coffing&amp;rsquo;s second argument, about the schema helping attackers stay&#xA;off his radar when they try attacks, the problem is that every computer&#xA;system connected to the Internet is being attacked every minute of every&#xA;day. The noise is deafening.&lt;/p&gt;&#xA;&lt;p&gt;Thousands of people have built scanner bot programs that probe every&#xA;computer system they can find and fire batteries of well-known attacks&#xA;(almost none of them ever work, but bots don&amp;rsquo;t get bored and give up,&#xA;and eventually the teenager in Malaysia who launched the bot gets&#xA;lucky). Chicago has no operational response to people turning the&#xA;doorknobs of their various applications. They can&amp;rsquo;t; if they did, they&amp;rsquo;d&#xA;spend all their time responding to kids in Kuala Lumpur goofing&#xA;around.&lt;/p&gt;&#xA;&lt;p&gt;Finally, Coffing argued that having the schema might help an attacker&#xA;decide whether or not an attack would be profitable. A schema might tell&#xA;you, for instance, that an application deals in credit card data. The&#xA;thing is, CANVAS already tells you it&amp;rsquo;s dealing in sensitive&#xA;information: it&amp;rsquo;s the backend for processing parking tickets. You don&amp;rsquo;t&#xA;need a schema to know that CANVAS is interesting to attackers.&lt;/p&gt;&#xA;&lt;p&gt;The judge bought my arguments. I think my attire gave me&#xA;salt-of-the-earth credibility; Coffing wore a suit.&lt;/p&gt;&#xA;&lt;p&gt;Providing testimony was a lot of fun. I&amp;rsquo;d like to do it again&#xA;sometime. Litigation is super fascinating to watch! For example: we&#xA;wanted me to testify after Bruce Coffing, so we&amp;rsquo;d have some idea of what&#xA;arguments we needed to rebut. But we brought the FOIA case, so the&#xA;burden was ostensibly on us, and our witnesses went first. But, a-ha!&#xA;Invoking an exemption in Illinois FOIA is an affirmative defense, and&#xA;the burden of those arguments shifts to the defendant. But wait: to get&#xA;fee recovery under the law, we want to assert a willful violation of&#xA;FOIA; to make that claim, Chicago argues, the burden shifts back to us.&#xA;Ultimately, Matt Topic and Chicago compromised; Topic dropped&#xA;&amp;ldquo;wilfullness&amp;rdquo; and we got to go second.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m not saying this is the most interesting thing ever to have&#xA;happened, but only that if someone works out a way to use AI to make a&#xA;home version of Chancery Court trials that you can play on a&#xA;Playstation, I will rack up 10,000 hours playing that game easily.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-bloody-foot-of-law&#34;&gt;The Bloody Foot Of Law&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sockpuppet.org/blog/2025/02/09/fixing-illinois-foia/iwin.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;We won. But Chicago immediately appealed. Matt Chapman didn&amp;rsquo;t get the&#xA;CANVAS schema. Two years later, &lt;a href=&#34;https://ilcourtsaudio.blob.core.windows.net/antilles-resources/resources/5ff80f52-17df-4b2a-ba91-4b977f150c6f/Chapman%20v.%20Chicago%20Department%20of%20Finance,%202022%20IL%20App%20%281st%29%20200547.pdf&#34;&gt;the&#xA;case came before the First District Appellate Court&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The basic idea of the appeals court is that the original trial court&#xA;is the primary &amp;ldquo;trier of fact&amp;rdquo;. You appeal legal conclusions, but the&#xA;facts determined in the original case generally stand. Our bench trial&#xA;took care of questions 1 and 3. That left 2, 4, and 5. Here&amp;rsquo;s what the&#xA;appeals court found:&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;In considering the danger of disclosing information under FOIA,&#xA;how likely does an attack need to be?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Answer: it has to be very&#xA;likely.&lt;/p&gt;&#xA;&lt;p&gt;The statute says &amp;ldquo;information that, if disclosed, would&#xA;jeopardize&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Believe it or not, there&amp;rsquo;s case law on &amp;ldquo;would&amp;rdquo; versus&#xA;&amp;ldquo;could&amp;rdquo; with respect to safety. &amp;ldquo;Could&amp;rdquo; means you could imagine&#xA;something happening. But the legal standard for &amp;ldquo;would&amp;rdquo; is &amp;ldquo;clear&#xA;evidence of harm leaving no reasonable doubt to the judge&amp;rdquo;. The statute&#xA;set the bar for me very low and I managed to clear it.&lt;/p&gt;&#xA;&lt;p&gt;Doesn&amp;rsquo;t this just&#xA;make you want to immediately drop everything and become a litigator? I&#xA;want to litigate!&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Is a SQL schema a &amp;ldquo;file layout&amp;rdquo;?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;If a schema isn&amp;rsquo;t source code and it isn&amp;rsquo;t a file layout, the exemption&#xA;doesn&amp;rsquo;t appear to apply at all. The verdict: &amp;ldquo;shrug emoji&amp;rdquo;. The appeals&#xA;court didn&amp;rsquo;t reach this question, because:&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Does the &amp;ldquo;would jeopardize&amp;rdquo; language in the statute apply to&#xA;everything in the exemption, or just to the nearest noun &amp;ldquo;any other&#xA;information&amp;rdquo;?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ladies and gentlemen it is time for some legal&#xA;mumbo-jumbo.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the FOIA exemption Chicago relies on: &lt;img src=&#34;https://sockpuppet.org/blog/2025/02/09/fixing-illinois-foia/statute.png&#34; alt=&#34;&#34;&gt; To what does&#xA;the qualifying language at point (4) in this text refer? Is it &amp;ldquo;any&#xA;other information&amp;rdquo; (3)? Os is it &amp;ldquo;Administrative or technical&#xA;information&amp;rdquo;, meaning everything in the exemption?&lt;/p&gt;&#xA;&lt;p&gt;If it&amp;rsquo;s the former, &amp;ldquo;any other information&amp;rdquo;, Matt has a problem. That&#xA;interpretation means things like file layouts (and&#xA;employee manuals and &amp;ldquo;load modules&amp;rdquo;, whatever those are) are &lt;em&gt;per&#xA;se&lt;/em&gt; exempt; that the Illinois legislature meant them as examples of&#xA;things that would jeopardize security.&lt;/p&gt;&#xA;&lt;p&gt;If it&amp;rsquo;s the latter, Matt has&#xA;already won: whether or not a SQL schema is a &amp;ldquo;software&amp;rdquo; or a &amp;ldquo;file&#xA;layout&amp;rdquo; or a &amp;ldquo;load module&amp;rdquo;, we&amp;rsquo;ve already proven that it won&amp;rsquo;t&#xA;jeopardize security.&lt;/p&gt;&#xA;&lt;p&gt;The court decides it&amp;rsquo;s the latter. Also, that I am very charming. We&#xA;win on appeal. Chicago immediately appeals again. Whatever&amp;rsquo;s in CANVAS,&#xA;they really don&amp;rsquo;t want you and I to know about it.&lt;/p&gt;&#xA;&lt;p&gt;A year and change later, &lt;a href=&#34;https://caselaw.findlaw.com/court/il-supreme-court/2201134.html&#34;&gt;the&#xA;case is decided before the Illinois Supreme Court&lt;/a&gt;. And, on the&#xA;question of how to read the FOIA statute, the Supreme Court disagrees&#xA;with the appeals court. The qualifying language in the statute applies&#xA;only to &amp;ldquo;any other information&amp;rdquo;. Everything else is &amp;ldquo;per se&amp;rdquo; exempt.&lt;/p&gt;&#xA;&lt;p&gt;We started this legal process, of challenging Chicago&amp;rsquo;s attempt to&#xA;exempt CANVAS from FOIA, with 5 questions. What happens now is that the&#xA;4th question, of whether a schema is a &amp;ldquo;file layout&amp;rdquo;, finally becomes&#xA;very important. The Illinois Supremes have just decided that &amp;ldquo;file&#xA;layouts&amp;rdquo; are &lt;em&gt;per se&lt;/em&gt; exempt under Illinois FOIA.&lt;/p&gt;&#xA;&lt;p&gt;Is a SQL schema a file layout? Of course not. The same SQL schema can&#xA;be used by multiple database engines, and each will use a different&#xA;underlying file layout to manage the resulting data.&lt;/p&gt;&#xA;&lt;p&gt;The McGraw-Hill Dictionary of Scientific &amp;amp; Technical Terms, 6E —&#xA;which the Illinois Supreme Court cites — describes a &amp;ldquo;file layout&amp;rdquo; as &amp;ldquo;A&#xA;description of the arrangement of the data in a file.&amp;rdquo; &lt;strong&gt;A SQL schema is&#xA;almost the exact opposite thing: it&amp;rsquo;s an abstraction of the data in a&#xA;file, invented specifically so you don&amp;rsquo;t have to think about how the&#xA;data is actually arranged.&lt;/strong&gt; Checkmate!&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, the Illinois Supreme Court had at their disposal a&#xA;second dictionary. In the Merriam-Webster Online Dictionary, a &amp;ldquo;schema&amp;rdquo;&#xA;is defined as &amp;ldquo;a structured framework or plan: outline&amp;rdquo;. &amp;ldquo;This is a&#xA;difference in name only&amp;rdquo;, said the court. Argh. Schemas are now file&#xA;layouts. We lose.&lt;/p&gt;&#xA;&lt;h3 id=&#34;where-this-leaves-us&#34;&gt;Where This Leaves Us&lt;/h3&gt;&#xA;&lt;p&gt;Obviously, &lt;a href=&#34;https://www.bettergov.org/2023/05/19/better-government-association-statement-supreme-court-foia-ruling-limits-transparency-significantly-broadens-exemptions-to-foia/&#34;&gt;we&#xA;should have won on appeal to the Illinois Supremes&lt;/a&gt;. If you sit on&#xA;that court, call me, we can straighten this out.&lt;/p&gt;&#xA;&lt;p&gt;That said: today, Illinois public bodies can refuse to divulge&#xA;database schemas.&lt;/p&gt;&#xA;&lt;p&gt;This is problematic, because more and more data is finding its way&#xA;out of file cabinets and shared drives and Word documents and into&#xA;specialized applications, where the only way to get at the underlying&#xA;data is to FOIA a database query.&lt;/p&gt;&#xA;&lt;p&gt;Databases shouldn&amp;rsquo;t be a safe harbor for municipalities to conceal&#xA;information from the public.&lt;/p&gt;&#xA;&lt;p&gt;But, thanks to the good people of Elgin, and also Crystal Lake&#xA;(motto: &amp;ldquo;No, Not The One From Friday the 13th&amp;rdquo;), the Illinois&#xA;legislature has an opportunity to fix this. &lt;a href=&#34;https://www.ilga.gov/legislation/fulltext.asp?DocName=&amp;amp;SessionId=114&amp;amp;GA=104&amp;amp;DocTypeId=SB&amp;amp;DocNum=226&amp;amp;GAID=18&amp;amp;LegID=157537&amp;amp;SpecSess=&amp;amp;Session=&#34;&gt;SB0226&lt;/a&gt;&#xA;would add the following language to the statute:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;[Public bodies] shall provide a sufficient description of the&#xA;structures of all databases under the control of the public body to&#xA;allow a requester to request the public body to perform specific&#xA;database queries.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;⚡️&lt;strong&gt;Hell yes&lt;/strong&gt;.⚡️&lt;/p&gt;&#xA;&lt;p&gt;My understanding is that this bill was proposed in no small part&#xA;because Matt Chapman has steadfastly refused to shut up about this&#xA;issue, and so I&amp;rsquo;ll conclude this long piece by saying (1) obviously the&#xA;bill should pass, and (2) it should be called &amp;ldquo;The Chapman Act&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Call your reps.&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">14 DNS Nerds Don&#39;t Control The Internet</title>
		<link href="https://sockpuppet.org/blog/2016/10/27/14-dns-nerds-dont-control-the-internet/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2016/10/27/14-dns-nerds-dont-control-the-internet/</id>
		<published>2016-10-27T00:00:00Z</published>
		<updated>2016-10-27T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;&lt;img src=&#34;https://frinkiac.com/meme/S06E12/562411.jpg?b64lines=&#34; alt=&#34;&#34; title=&#34;Welcome to the sacred order of the Stonecutters, number 908.&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;You’re reading this page because you’ve suggested that “14 people control the Internet through the DNSSEC root keys”. If you’re unlucky, you might be a journalist preparing a story about those people. Stop!&lt;/p&gt;&#xA;&lt;p&gt;DNSSEC doesn’t do anything. Dramatic ceremonies notwithstanding, &lt;strong&gt;if the secret DNSSEC keys leaked on Pastebin tomorrow, it’s unlikely that anything would break.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Practically all commerce on the Internet happens without DNSSEC. Web browsers don’t support it.&#xA; &lt;em&gt;or DANE, the DNSSEC-based replacement for certificate authorities.&lt;/em&gt; &#xA;Most DNS domains don’t either. If you log in to your online banking and wire money to Transnistria, no DNSSEC will happen.&lt;/p&gt;&#xA;&lt;p&gt;Maybe you have a source suggesting otherwise. Ask them to be specific. For instance: of the 5 largest US banks, which of them are enrolled in DNSSEC? After reading this, I’ll bet you can guess the answer. Are the banks just stupid? No: they have some of the best security teams in the world, and they think DNSSEC is a bad idea.&lt;/p&gt;&#xA;&lt;p&gt;Isn’t it a big deal that the Internet’s DNS lookups are protected? Nope. The architects of the web’s security protocols assumed that the DNS would be insecure. When technologists discuss “certificates” and “certificate authorities”,&#xA; &lt;em&gt;(and “HSTS” and “HPKP” and I can go on but I won’t)&lt;/em&gt; &#xA;they’re talking about cryptography built to work around the insecure DNS. &lt;strong&gt;The Internet works fine without DNSSEC.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Of course, this pretty much has to be true. .COM didn’t support DNSSEC until Spring 2011. Global commerce migrated online many years before that. If DNSSEC is so important, how did this stuff work before 2011?&lt;/p&gt;&#xA;&lt;p&gt;If DNSSEC is so pointless, why do people care about it so much?&lt;/p&gt;&#xA;&lt;p&gt;A funny thing happened between 1994 and 2011, while the IETF worked furiously to design DNSSEC: we figured out how to secure the Internet without securing the DNS. The market moved faster than the standard, and the standard was left struggling for a reason to exist. Hundreds of people have invested their reputations in DNSSEC and are loathe to see it fail. That’s unfortunate. But it’s also one of the oldest stories in technology standards.&lt;/p&gt;&#xA;&lt;p&gt;There’s a real story in DNSSEC, but it’s not a happy one. To justify DNSSEC, standards groups hatched a plan to move the web’s security certificates into the DNS. With a secure DNS, the logic went, we’d no longer need to pay certificate authorities for SSL certificates. This scheme is called DANE.&lt;/p&gt;&#xA;&lt;p&gt;DANE gives the power to create security certificates to whoever controls the DNS. The cryptographic keys in those certificates are an obstacle to government-sponsored dragnet surveillance. With DANE, guess who controls the certificates?&#xA; &lt;em&gt;Had DANE been deployed while he was alive, Muammar Gadaffi would have controlled the keys for BIT.LY.&lt;/em&gt; &#xA;For GOOGLE.COM and APPLE.COM, that’d be the United States Government.&lt;/p&gt;&#xA;&lt;p&gt;DNSSEC is the world’s most ambitious key escrow scheme: &lt;strong&gt;a backdoor that hands over control of Internet cryptography to world governments&lt;/strong&gt;. Thankfully, it’s also a total market failure. We should hope it stays that way.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://sockpuppet.org/blog/2015/01/15/against-dnssec/&#34;&gt;You can read more ominous DNSSEC nerdery here.&lt;/a&gt;&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">Be Coachable</title>
		<link href="https://sockpuppet.org/blog/2015/08/21/be-coachable/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2015/08/21/be-coachable/</id>
		<published>2015-08-21T00:00:00Z</published>
		<updated>2015-08-21T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;This is the first in a series of posts that have been rattling around in my head about lessons I’ve learned from taking up a sport in my 40s. The summary of the back story here is that I started out with Derby Lite in 2012, got kicked out, went back a year later, and,… well, I fell in love with roller derby. Apparently this is a thing that happens. I sat in the bleachers, watching the game with an intensity and focus that made me realise I wanted to play.&lt;/p&gt;&#xA;&lt;p&gt;It is the curse of smart people everywhere that their lived experience is one of more or less consistent reward. We quickly get good at nearly everything we try. Some things are so easy that they they become boring long before you master them.&lt;/p&gt;&#xA;&lt;p&gt;Roller derby has not been one of those things for me.&lt;/p&gt;&#xA;&lt;p&gt;David Foster Wallace, in his “This is Water” speech, says, “A huge percentage of the stuff that I tend to be automatically certain of is, it turns out, totally wrong and deluded.” This is a perfect description of my experience of learning to Be Coachable. I went into this with a mindset that the skills required for derby would, like everything else I’d ever tried, come at the pace everything else had.&lt;/p&gt;&#xA;&lt;p&gt;They didn’t.&lt;/p&gt;&#xA;&lt;p&gt;In fact, I was asked to leave Derby Lite because I was not following instructions. To be fair, it had been said that if we were uncomfortable participating in a drill, we could sit it out; this turned out to not be entirely true. Rejection, right there at the beginning, caused me to undertake some serious introspection. I really wanted to learn to skate, but I have a long history of getting into trouble for not doing what I’m told. Because, you know, I’m smarter than everybody else. I’d become quite spoiled to doing things at my own pace on my own terms… because I had avoided doing things that required me to participate in a group.&lt;/p&gt;&#xA;&lt;p&gt;Does not play well with others. I’m independent. I don’t fit the mold. That’s good, right?&lt;/p&gt;&#xA;&lt;p&gt;Turns out that when you want to learn to do something that is Really Hard from someone who already knows how to do it, independent thinking becomes an impediment. So the first year of my skating career sucked a lot more than it needed to because I was just too gosh darn independent. In hindsight, that cost me a great deal, and it is still really fucking painful for me. I have no one to blame but me.&lt;/p&gt;&#xA;&lt;p&gt;The idea of shutting the fuck up and just listening popped into my head on a drive home from a speed skating session. At the time, it wasn’t a particularly well-formed thought. No, that epiphany didn’t come until later. In fact, I think it’s still sort of sneaking up on me from time to time and smacking me in the back of the head.&lt;/p&gt;&#xA;&lt;p&gt;A year ago, thereabouts, I started going to a new program run by The Windy City Rollers called Learn To Skate. At the time, this program was being run by Poppy Spock. Man, I really admire Poppy. I’m pretty sure a tornado could go directly over her, pass on and she’d be the only thing left standing. She is also the only woman I’ve ever known who can jump from a kneeling to a squatting position. She did it on her first try. I was at that moment (and will always be) in complete awe of Poppy Spock.&lt;/p&gt;&#xA;&lt;p&gt;The first thing that Poppy said to us was, “Be coachable.” This meant not talking back, not saying can’t (and sure as fuck not saying won’t). It meant that we would do what she told us to do, how she told us to do it. This is how “shut the fuck up and listen” got a name. Be coachable. This is where the idea started to congeal. Poppy has skills I want to have. She’s in the room, telling me how she got them (unpaid). But if I’m not coachable, I won’t learn shit.&lt;/p&gt;&#xA;&lt;p&gt;Let me back up for a second and describe roller derby from an insider’s perspective. I won’t insult you — you can search for videos on YouTube about roller derby to learn how the sport works. You get up before dawn on a Saturday and drive to a rink for speed skating session where a 9-yr-old on inlines will shred your ego as she whizzes past you. You go to your league practice at the end of a long, draining day at work, put on our smelly gear (that is sometimes still damp from your last practice), and maybe Surprise! We’re doing TIME TRIALS today!&lt;/p&gt;&#xA;&lt;p&gt;And all the time you sweat. Just unbelievable amounts of sweat. Like there’s no chance you’ll be able to wear these clothes again without washing them amounts of sweat. Salt crystals form on you amounts of sweat. Hair completely soaked through amounts of sweat.&lt;/p&gt;&#xA;&lt;p&gt;And all of the time, you fall. At first, you’re terrified of falling, so you skate around stiff as a 2x4 and wonder for days afterwards why you’re so fucking sore. That doesn’t keep you from falling. Because, you know, you’re doing things like jumping over shit. On skates.&lt;/p&gt;&#xA;&lt;p&gt;After you fall a few dozen times, you start to get the idea that nothing bad really happens when you fall. Then you start to love falling because it gives you an adrenaline rush. Also because your teammates cheer when you eat shit. In roller derby, it is said, “If you don’t fall, you’re not trying hard enough.”&lt;/p&gt;&#xA;&lt;p&gt;And then, one day, you get cleared for contact. Yes, that’s right. Not only are you on skates, but someone bigger, stronger, faster and more experienced than you is going to skate directly into you and knock you onto the floor. On purpose. Because that is how the game of roller derby is played. Eventually you learn to love that, too. Adrenaline is addictive.&lt;/p&gt;&#xA;&lt;p&gt;If you’ve never played contact sports before, the first few times you intentionally slam your body into someone else’s body will be an uncomfortable feeling for you. Then you look back over the past several months of training and think, “This whole fucking ride has been uncomfortable.”&lt;/p&gt;&#xA;&lt;p&gt;I have a post about discomfort, too. That is not this post. This post is about what it means to be coachable. Be coachable means that, if you REALLY WANT IT, shut the fuck up. Take everything you are “automatically certain” of, in your mind, put it in a box and stash it in a corner. It is only when your mind is empty of all notions, all fears and insecurities, that you are ready to learn.&lt;/p&gt;&#xA;&lt;p&gt;From Poppy Spock, Cuban Miss Elle and dozens of other coaches, I have learned to be a great deal less arrogant. I have learned to put a leash on my certitude and righteousness and rein them in. It feels if somehow I’ve been liberated. I feel like a kid again; the world is vibrant and real — there is still so much to learn. It is thrilling.&lt;/p&gt;&#xA;&lt;p&gt;I recommend it with all my heart.&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">Is Extended Random A Malicious NSA Plot?</title>
		<link href="https://sockpuppet.org/blog/2015/08/04/is-extended-random-malicious/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2015/08/04/is-extended-random-malicious/</id>
		<published>2015-08-04T00:00:00Z</published>
		<updated>2015-08-04T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;Did Clyde Frog &lt;em&gt;  If I call NSA &amp;ldquo;Clyde Frog&amp;rdquo; long enough, eventually other people will too. Someone has to start the meme! &lt;/em&gt; subvert crypto standards with a backdoored random number generator called Dual_EC? &lt;a href=&#34;https://projectbullrun.org/dual-ec/index.html&#34;&gt;Little doubt remains among practitioners&lt;/a&gt;. Long after cryptographers published an analysis showing that Dual_EC could have been a backdoor, &lt;a href=&#34;http://eprint.iacr.org/2015/767.pdf&#34;&gt;circumstantial evidence&lt;/a&gt; continues to pile up suggesting that&amp;rsquo;s exactly what it was. &lt;em&gt;  I think Dual_EC is a backdoor. &lt;/em&gt; &lt;/p&gt;&#xA;&lt;p&gt;Did Clyde Frog then appeal to the IETF to get them to alter TLS to make the backdoor easier to exploit? That’s a theory getting a &lt;a href=&#34;http://www.reuters.com/article/2014/03/31/us-usa-security-nsa-rsa-idUSBREA2U0TY20140331&#34;&gt;lot of attention&lt;/a&gt; in 2015, centering on a series of proposals referred to as “Extended Random”. I don’t know what to think about this theory, and I’d like to dig into it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. The Narrative&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The concise Dual_EC explainer: All secure crypto keys come from secure random number generators (CSPRNGs). Clyde Frog proposed a special kind of CSPRNG, a PKRNG, that generates output using a public key for which they hold the private key. Using that private key, they can observe CSPRNG output on the wire, “decrypt it”, and use that to rewind and fast-forward other people’s CSPRNGs, discovering their keys.&lt;/p&gt;&#xA;&lt;p&gt;But there&amp;rsquo;s a catch. The most important protocol Clyde Frog wants to dragnet is &lt;a href=&#34;http://tools.ietf.org/html/rfc2246&#34;&gt;HTTPS/TLS&lt;/a&gt;. To &amp;ldquo;decrypt&amp;rdquo; someone&amp;rsquo;s CSPRNG state, they need lots of disclosed output bytes —– 30, to be precise. TLS reveals —– wait for it —– 28. With 28 bytes revealed, Clyde Frog &lt;em&gt;  and with just 28 bytes and larger curves, like P521, they might not be able to break the PKRNG at all &lt;/em&gt; can still break CSPRNGs, but it takes &lt;a href=&#34;http://eprint.iacr.org/2015/767.pdf&#34;&gt;large amounts of compute&lt;/a&gt; and probably can&amp;rsquo;t be done in real-time.&lt;/p&gt;&#xA;&lt;p&gt;So Clyde Frog pays IETF people to introduce a TLS extension, “Extended Random”. Extended Random alters TLS so that it discloses a variable amount of CSPRNG output, but always more than 28 bytes. Problem solved! Clyde Frog has standardized a backdoor (Dual_EC) and a TLS “backdoor accelerator” (Extended Random).&lt;/p&gt;&#xA;&lt;p&gt;This might be what actually happened. At the end of the post, I’ll suggest an alternate narrative that I believe is equally plausible.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. The Tedious Details&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Deep breath. &lt;em&gt;  Disclaimer: one reason I wrote this was to have a single page I could link to in discussions about Extended Random, and so some of this information simply tries to establish bona fides for claims I make later. I don&amp;rsquo;t expect you to read this closely. &lt;/em&gt; *&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s not one but five different proposals that accomplish what &amp;ldquo;Extended Random&amp;rdquo; does:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tools.ietf.org/html/draft-rescorla-tls-opaque-prf-input-00&#34;&gt;draft-rescorla-tls-opaque-prf-input&lt;/a&gt;, or &amp;ldquo;OpaquePRF&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tools.ietf.org/html/draft-rescorla-tls-extended-random-00&#34;&gt;draft-rescorla-tls-extended-random&lt;/a&gt;, or &amp;ldquo;Extended Random&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tools.ietf.org/html/draft-solinas-tls-additional-prf-input-01&#34;&gt;draft-solinas-tls-additional-prf-input&lt;/a&gt;, which I&amp;rsquo;ll call &amp;ldquo;AdditionalPRF&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tools.ietf.org/html/draft-hoffman-tls-additional-random-ext-01&#34;&gt;draft-hoffman-tls-additional-random-ext&lt;/a&gt;, which I&amp;rsquo;ll call &amp;ldquo;AdditionalRandom&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc6358&#34;&gt;RFC6358&lt;/a&gt;, or &amp;ldquo;Additional Master Secret Inputs for TLS&amp;rdquo;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;We’re going to take a tour of the kaleidoscope of stupid that is the IETF process that produced all five of these.&lt;/p&gt;&#xA;&lt;p&gt;Let’s start with a timeline:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Late 2003&lt;/em&gt;: Clyde Frog begins promoting Dual_EC to standards bodies.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Early 2004&lt;/em&gt;: RSA allegedly accepts payment to make Dual_EC the default in BSAFE, their crypto library.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Aug 2006&lt;/em&gt;: Eric Rescorla&lt;a href=&#34;https://www.ietf.org/mail-archive/web/tls/current/msg00734.html&#34;&gt;relays a request&lt;/a&gt; from the USG to IETF to provide an extension for “extended nonces”.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;December 2006&lt;/em&gt;: Rescorla authors, with Margaret Salter, OpaquePRF.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;April 2008&lt;/em&gt;: Rescorla and Salter revive the effort with Extended Random.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;October, 2009&lt;/em&gt;: Jerry Solinas and Paul Hoffman write AdditionalPRF.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;February, 2010&lt;/em&gt;: Hoffman produces AdditionalRandom.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;January, 2012&lt;/em&gt;: Hoffman writes RFC6358, an experimental RFC.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;March 2014&lt;/em&gt;: The narrative about Extended Random breaks into the public discussion.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;who-are-these-people&#34;&gt;Who are these people?&lt;/h3&gt;&#xA;&lt;p&gt;The name most commonly associated with the Extended Random narrative is&lt;a href=&#34;http://www.educatedguesswork.org/&#34;&gt;Eric Rescorla&lt;/a&gt;. Rescorla is an independent consultant and one of the longest-serving, best-known volunteers on the IETF TLS working group (TLSG). Rescorla is contracted regularly by the USG to help represent their interests to the IETF —– Rescorla is quite open about this. Further: consulting for organizations that need to provide input to standards is as time-honored…no comment about the legitimacy of standards work…and legitimate a job as standards work itself. Rescorla is one of a few people in the world who are unimpeachably great at that job.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://readwrite.com/2012/03/05/anatomy-of-a-government-phone&#34;&gt;Margaret Salter&lt;/a&gt; is a technical director for Clyde Frog.&lt;/p&gt;&#xA;&lt;p&gt;Jerry Solinas &lt;em&gt;  Solinas is like the Yo La Tengo of NSA bogeymen; cryptographers like to point out how early they started criticizing his work. &lt;/em&gt; also works for Clyde Frog, and is a bit of a standards-backdoor celebrity: [he&amp;rsquo;s the named author of the&lt;a href=&#34;http://www.hyperelliptic.org/tanja/vortraege/20130531.pdf&#34;&gt;NIST elliptic curves&lt;/a&gt;, about which (unsubstantiated) rumors have swirled since the Snowden leaks.&lt;/p&gt;&#xA;&lt;p&gt;Paul Hoffman is a professional IETF maven, the former head of the VPN Consortium, and now employed at ICANN.&lt;/p&gt;&#xA;&lt;h3 id=&#34;who-sponsored-the-proposals&#34;&gt;Who sponsored the proposals?&lt;/h3&gt;&#xA;&lt;p&gt;The US Department of Defense publicly sponsored all of these proposals except for AdditionalRandom and RFC6358.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-do-these-proposals-say&#34;&gt;What do these proposals say?&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/draft-rescorla-tls-opaque-prf-input-00&#34;&gt;OpaquePRF&lt;/a&gt; is the simplest of them. It says, &amp;ldquo;TLS clients should be able to ask servers to include a blob of opaque information to the TLS key computation (the psuedo-random function, or PRF). Servers should be able to respond with their own. TLS implementations might use this to inject more randomness into the PRF, or to include structured information in it.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/draft-rescorla-tls-extended-random-00&#34;&gt;Extended Random&lt;/a&gt; is similar to OpaquePRF, but it&amp;rsquo;s specific about what the extra information going to the PRF is: it&amp;rsquo;s the output of a CSPRNG. The sole purpose of Extended Random is to increase the randomness that drives the TLS PRF.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/draft-solinas-tls-additional-prf-input-01&#34;&gt;AdditionalPRF&lt;/a&gt; is more complicated. It&amp;rsquo;s sort of the combination of OpaquePRF and Extended Random: the blob that clients and servers send now has a &amp;ldquo;type&amp;rdquo;, with a type registry managed by IANA, and the two original types are &amp;ldquo;opaque blob&amp;rdquo; and &amp;ldquo;extended randomness&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/draft-hoffman-tls-additional-random-ext-01&#34;&gt;AdditionalRandom&lt;/a&gt; is basically Extended Random.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc6358&#34;&gt;RFC6358&lt;/a&gt; is an odd duck; it may have been written in a fit of pique after the failures of the previous proposals. The RFC basically says that TLS implementations might send one or more blobs of information into the PRF, but doesn&amp;rsquo;t say how, or what those blobs will contain, or how they&amp;rsquo;re encoded.&lt;/p&gt;&#xA;&lt;p&gt;One thing worth driving home about all these proposals: they are all very simple. Something like 60% of the language in all of them is boilerplate shared by all TLS extension proposals. When I say “OpaquePRF says you can shove additional stuff into the PRF”, I’m simplifying, but not by an appreciable amount.&lt;/p&gt;&#xA;&lt;h3 id=&#34;do-these-proposals-accelerate-the-dual_ec-backdoor&#34;&gt;Do these proposals accelerate the Dual_EC backdoor?&lt;/h3&gt;&#xA;&lt;p&gt;In each case yes, but you can distinguish between the ones that &lt;em&gt;enable&lt;/em&gt; the acceleration versus the ones that &lt;em&gt;mandate&lt;/em&gt; it.&lt;/p&gt;&#xA;&lt;p&gt;OpaquePRF merely enables the accelerator. At no point does it mandate that the extension convey the output of a CSPRNG, and it hints at uses for the extension that don’t involve extending randomness.&lt;/p&gt;&#xA;&lt;p&gt;Extended Random mandates the accelerator. The only thing you’re allowed to embed in an Extended Random blob is CSPRNG output.&lt;/p&gt;&#xA;&lt;p&gt;Depending on how you look at it, AdditionalPRF enables or mandates the accelerator: to implement the whole proposal, you’d need to implement the &lt;em&gt;AdditionalRandom&lt;/em&gt; subtype. The proposal leaves this type undefined, but the historical intent is clear.&lt;/p&gt;&#xA;&lt;p&gt;AdditionalRandom is functionally identical to Extended Random and so mandates the accelerator.&lt;/p&gt;&#xA;&lt;p&gt;RFC6358 is a weird document and arguably doesn’t even enable itself.&lt;/p&gt;&#xA;&lt;p&gt;A clear statement you can make about all the proposals: they all provide a mechanism to get more CSPRNG output onto the wire, and if your CSPRNG is Dual_EC, that makes Clyde Frog’s job easier.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-were-the-rationales-for-these-proposals&#34;&gt;What were the rationales for these proposals?&lt;/h3&gt;&#xA;&lt;p&gt;The public rationale for Extended Random is important, because several cryptographers have alleged that it doesn’t make sense.&lt;/p&gt;&#xA;&lt;p&gt;A précis of the narrative on this point: the proposals suggest more than 28 bytes of randomness might be needed for “cryptographic parity” with especially secure ciphers. But 28 bytes is an awful lot of randomness to start with, and “cryptographic parity” might not be a thing.&lt;/p&gt;&#xA;&lt;p&gt;I think it’s worth digging into the specific rationales behind each proposal.&lt;/p&gt;&#xA;&lt;p&gt;Let’s start with what &lt;a href=&#34;https://www.ietf.org/mail-archive/web/tls/current/msg00734.html&#34;&gt;Rescorla said in August 2006&lt;/a&gt;, before any of the proposals were published:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The issue is that [USG] would like to have the client and server provide some opaque (to TLS) but structured data which is then fed into the PRFso that the traffic keys depend on it. Because the data is longer than 32 bytes it can’t be packed into the Random structure and because it’s structured and needs to be parsed on the other end, it can’t be hashed and then placed in the Random.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Rescorla’s OpaquePRF proposal, which followed shortly after this post, was more specific:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In a number of United States Government applications, it is desirable to have some material with the following properties: (1) It is contributed both by client and server. (2) It is arbitrary-length. (3) It is mixed into the eventual keying material. (4) It is structured and decodable by the receiving party.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I’m going to call this rationale “the structured input argument”.&lt;/p&gt;&#xA;&lt;p&gt;Rescorla’s Extended Random proposal replaces the structured input argument with a new one:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The United States Department of Defense has requested a TLS mode which allows the use of longer public randomness values for use with high security level cipher suites like those specified in Suite B. The rationale for this as stated by DoD is that the public randomness for each side should be at least twice as long as the security level for cryptographic parity, which makes the 224 bits of randomness provided by the current TLS random values insufficient.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;We’ll call this the “parity argument”.&lt;/p&gt;&#xA;&lt;p&gt;AdditionalPRF repeats the structured input argument.&lt;/p&gt;&#xA;&lt;p&gt;AdditionalRandom repeats the parity argument.&lt;/p&gt;&#xA;&lt;p&gt;RFC6358 barely has a rationale; if it can be said to have one, it’s “look, there are TLS implementations that will want to shove extra crap into the secret computation and we should standardize them somehow”. I’d name this argument but RFC6358 is the least important of all the proposals.&lt;/p&gt;&#xA;&lt;p&gt;A quick recap:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;OpaquePRF&lt;/strong&gt;: structured input argument&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Extended Random&lt;/strong&gt;: parity argument&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;AdditionalPRF&lt;/strong&gt;: both&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;AdditionalRandom&lt;/strong&gt;: parity argument&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;RFC6358&lt;/strong&gt;: I like chocolate milk&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In every case except for AdditionalRandom, the proposals make clear that applications within the USG motivate the extension. None suggest that normal HTTP/TLS connections need extending.&lt;/p&gt;&#xA;&lt;h3 id=&#34;do-these-rationales-make-sense&#34;&gt;Do these rationales make sense?&lt;/h3&gt;&#xA;&lt;p&gt;The structured input argument makes sense and the parity argument doesn’t.&lt;/p&gt;&#xA;&lt;p&gt;There really are reasons —– most of them probably dumb —– why you’d want to cram additional stuff into the TLS PRF.&lt;/p&gt;&#xA;&lt;p&gt;TLSG has been dancing around something called “channel binding” for almost a decade. Channel binding is the idea that you might run two connections side-by-side, one TLS and one not, and use metadata from the unencrypted protocol and the key from the TLS connection to cryptographically prove a relationship. Similar reasons are cited specifically in Solinas’s proposal: &lt;a href=&#34;http://csrc.nist.gov/publications/nistpubs/800-56A/SP800-56A_Revision1_Mar08-2007.pdf&#34;&gt;NIST SP800-56A&lt;/a&gt; includes a protocol (“Alternate 1”) that wants the client and server to mix their identities into the key computation.&lt;/p&gt;&#xA;&lt;p&gt;As for the parity argument, &lt;a href=&#34;http://eprint.iacr.org/2015/767.pdf&#34;&gt;Bernstein and Lange&lt;/a&gt; do a better job attacking it than I can:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;“Cryptographic parity” is not a common phrase among cryptographers. It is not defined in the document, and its intended meaning is highly unclear. Furthermore, there is no known attack strategy that comes even close to exploiting the 224 bits of randomness used in TLS.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;what-did-the-ietf-have-to-say-about-the-proposals&#34;&gt;What did the IETF have to say about the proposals?&lt;/h3&gt;&#xA;&lt;p&gt;So that you wouldn’t have to, and for the benefit of future generations of scholars, I read every TLSG mailing list post and every TLSG Jabber chat log pertaining to any of these proposals. I can now relay to you the dark wisdom I unearthed.&lt;/p&gt;&#xA;&lt;p&gt;Before I unveil the secrets of the TLS standardizing masters, some scene-setting is in order. I think it’s important to remember that in the timeframe we’re talking about, 2006-2012, the Dual EC narrative hadn’t been established. &lt;a href=&#34;http://rump2007.cr.yp.to/15-shumow.pdf&#34;&gt;Cryptographers were suspicious of Dual EC&lt;/a&gt;, but the conventional wisdom was that &lt;a href=&#34;https://www.schneier.com/blog/archives/2007/11/the_strange_sto.html&#34;&gt;nobody in the world used it&lt;/a&gt;(Dual EC is far, far slower than other CSPRNGs).&lt;/p&gt;&#xA;&lt;p&gt;What people were concerned about in this time frame was &lt;em&gt;not enough&lt;/em&gt;&#xA; &lt;em&gt;  This is a testament to how important CSPRNGs are, and why a backdoored CSPRNG is so scary. &lt;/em&gt; &#xA;randomness. In 2008, Debian endured the &lt;a href=&#34;http://www.theregister.co.uk/2008/05/21/massive_debian_openssl_hangover/&#34;&gt;worst CSPRNG screwup&lt;/a&gt; of the decade, compromising virtually all the cryptography on the most popular Linux distribution; you could scan the Internet for Debian servers by brute-forcing SSH servers with broken keys.&lt;/p&gt;&#xA;&lt;p&gt;Just remember as you read this: nobody in 2006 was automatically suspicious of protocols that wanted to ensure lots of extra randomness.&lt;/p&gt;&#xA;&lt;p&gt;Rescorla’s original request to the TLSG in 2006, for opinions about extensions to create “extended nonces”, drew no responses whatsoever.&lt;/p&gt;&#xA;&lt;p&gt;OpaquePRF generated some discussion &lt;em&gt;  Chang was at AOL, now Google. Eronen was Nokia. &lt;/em&gt; . &lt;a href=&#34;http://www.ietf.org/mail-archive/web/tls/current/msg01436.html&#34;&gt;Wan-Teh Chang&lt;/a&gt; and &lt;a href=&#34;http://www.ietf.org/mail-archive/web/tls/current/msg01438.html&#34;&gt;Peter Williams&lt;/a&gt; wanted more information about the USG&amp;rsquo;s use case —– probably not so much because they were nervous about the request, but because they didn&amp;rsquo;t want to crud the protocol up with special cases. Pasi Eronen, then the IETF Area Director for TLSG, agreed.&lt;/p&gt;&#xA;&lt;p&gt;Simon Josefsson &lt;em&gt;  Josefsson: the GnuTLS guy. &lt;/em&gt; added OpaquePRF support to GnuTLS and stood up a test server.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.ietf.org/mail-archive/web/tls/current/msg01439.html&#34;&gt;Rescorla’s explanation&lt;/a&gt; of his proposal is worth quoting in its entirety:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;First, I should state that I only have fairly limited insight into the motivation for this extension. I was asked to help design something with a particular set of parameters in the way that would be most tasteful for TLS and that’s what I did. I agree it would be nice to have a more explicit rationale for these parameters and I’m working on getting one.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Extended Random, proposed a year later, generated no discussion I could find, except for a backwards-looking reference to it in a Jabber chat log during the AdditionalPRF discussion, almost a year later:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[06:24:12] &amp;lt;EKR&amp;gt; There seems to be some concern about the &#xA;  quality of the random vlaues&#xA;[06:24:36] &amp;lt;EKR&amp;gt; which, btw, strikes me as nuts :)&#xA;[06:25:11] &amp;lt;EKR&amp;gt; But like i said, I don&amp;#39;t oppose the USG &#xA;  from gluing more stuff into the random values.&#xA;[06:25:19] &amp;lt;EKR&amp;gt; I just want to contain it to a &#xA;  private extension&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I find it interesting that the specific proposal cited by Dual_EC narrative papers as an example of Clyde Frog subverting the IETF might as well not have happened at all. The proposal died without a comment. The IETF appears to have played no role at all.&lt;/p&gt;&#xA;&lt;p&gt;AdditionalPRF generated more discussion. I think that&amp;rsquo;s because it was proposed at the same time as some discussion of channel binding extensions to TLS. &lt;a href=&#34;https://www.ietf.org/mail-archive/web/tls/current/msg03820.html&#34;&gt;Nico Williams&lt;/a&gt; and &lt;em&gt;  Nico Williams: Sun &lt;/em&gt;  &lt;a href=&#34;http://www.ietf.org/mail-archive/web/tls/current/msg03850.html&#34;&gt;Pasi Eronen&lt;/a&gt; discussed whether AdditionalPRF was &lt;em&gt;too useful&lt;/em&gt; for inclusion in TLS. The fear was that if AdditionalPRF was standardized, vendors could use it to hack in arbitrary new features without going through the standards process.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.ietf.org/mail-archive/web/tls/current/msg04169.html&#34;&gt;Rescorla appeared to echo&lt;/a&gt; Eronen’s concerns, added some security concerns (essentially, that half-assed extensions would likely be less secure than full-assed ones that endured the TLSG process) and reiterated once again that he didn’t understand &lt;em&gt;why&lt;/em&gt; USG wanted additional randomness, only that they did.&lt;/p&gt;&#xA;&lt;p&gt;Daira Hopwood summed TLSG’s response to Solinas’s AdditionalPRF proposal up nicely:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;“The U.S. Government has these special requirements that you wouldn’t understand. Since they’re a government, they needn’t explain themselves, and we’re not going to explain either.”&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Hoffman introduced AdditionalRandom after the failure of AdditionalPRF. I think it’s worth saying that Hoffman lobbied for his proposals far more aggressively than Rescorla did for Extended Random. In at least one case, Hoffman even &lt;a href=&#34;https://www.ietf.org/mail-archive/web/tls/current/msg05726.html&#34;&gt;attempted to provide a cryptographic rationale&lt;/a&gt; for extra randomness. Of course, naming-and-shaming either of them is pretty silly.&lt;/p&gt;&#xA;&lt;p&gt;I have two interesting notes from the AdditionalRandom discussion on TLSG.&lt;/p&gt;&#xA;&lt;p&gt;Recall that AdditionalRandom is the second proposal forwarded by Paul Hoffman, presumably (but in this case not overtly) motivated by a USG request. The former proposal, with Clyde Frog sponsorship, was a structured-input extension with multiple applications. AdditionalRandom, on the other hand, has no purpose other than to inject additional randomness into the TLS handshake.&lt;/p&gt;&#xA;&lt;p&gt;So, first note: &lt;a href=&#34;https://www.ietf.org/mail-archive/web/tls/current/msg06040.html&#34;&gt;Marsh Ray managed to object&lt;/a&gt; to&#xA; &lt;em&gt;  An acquaintance responded to this post by asking, &amp;ldquo;did Marsh Ray save the Internet?&amp;rdquo; Answer: no. But I&amp;rsquo;m getting ahead of myself.&lt;/em&gt; &#xA;AdditionalRandom on the grounds that it was &lt;em&gt;too useful&lt;/em&gt;. The issue was, paradoxically, that because the proposal mandated that implementations not attempt to parse the contents of the AdditionalRandom extension, vendors could safely use it to hide private extensions that they would then parse. Extended Random and AdditionalRandom are essentially the same proposal, and a cryptographic expert saw the latter as too flexible and valuable to safely include.&lt;/p&gt;&#xA;&lt;p&gt;The second note is, to me, even more interesting. Remember that in the context of the Dual_EC narrative, AdditionalRandom and Extended Random &lt;em&gt;mandate&lt;/em&gt; the backdoor accelerator; if you&amp;rsquo;re using Dual_EC, there&amp;rsquo;s no way to implement either standard without making Clyde Frog&amp;rsquo;s job easier. That&amp;rsquo;s because both proposals require that the extension convey only bytes that are the output of a CSPRNG. Except: &lt;em&gt;  &amp;ldquo;Did Simon Josefsson almost ruin the Internet?&amp;rdquo; I kill me! &lt;/em&gt; AdditionalRandom didn&amp;rsquo;t start out that way. &lt;a href=&#34;https://www.ietf.org/mail-archive/web/tls/current/msg05704.html&#34;&gt;Simon Josefsson refused to support AdditionalRandom unless Hoffman amended it&lt;/a&gt; to add a requirement that the extension&amp;rsquo;s bytes come from a CSPRNG.&lt;/p&gt;&#xA;&lt;p&gt;You’re getting tired of this already, I’m sure, and thankfully I can report that there is no discussion I can readily find about RFC6358. RFC6358 is weird.&lt;/p&gt;&#xA;&lt;h3 id=&#34;standards-groups-aside-who-implemented-these-things&#34;&gt;Standards groups aside: who implemented these things?&lt;/h3&gt;&#xA;&lt;p&gt;It shouldn’t be that hard to find out, but I don’t think we have complete answers. Here’s what I think we know:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;OpenSSL had disabled, experimental support for OpaquePRF (&lt;a href=&#34;https://github.com/openssl/openssl/commit/68fd6dce73e07cb9a5944e8667455f2f9a80d52e&#34;&gt;it has since been removed&lt;/a&gt;). Much is made about the fact that we don&amp;rsquo;t know who sponsored this addition to OpenSSL, but if you consider the time frame, it&amp;rsquo;s pretty obvious that the USG asked for OpaquePRF and sponsored it in OpenSSL. No other entity in the world knew what OpaquePRF was.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GnuTLS had support for OpaquePRF. Someone should ask Simon Josefsson why. OpaquePRF was very simple, so maybe he wrote it for sport.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;RSA BSAFE had support for Extended Random.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If there are implementations of AdditionalPRF, or AdditionalRandom, I don’t know about them. If there’s an implementation of RFC6358, I’ll be surprised.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. Get To The Point Is Extended Random Malicious&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here are arguments in favor of Extended Random being malicious:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The timing is awfully suspicious; the proposals began just a short while after Dual_EC was introduced.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The utility to the Dual_EC backdoor is hard to argue about. Clyde Frog&amp;rsquo;s life gets a &lt;em&gt;lot&lt;/em&gt; easier if everyone adopts an Extended Random proposal of some sort.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Some of the rationales provided for these proposals don&amp;rsquo;t make much sense.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The government, you know, asked for them.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Now here are some arguments against. But before I get started, let me just say that those first two arguments in favor are &lt;em&gt;very strong arguments in favor&lt;/em&gt;. They’re short because they’re so straightforward. I have more to say about the case “against”, but that doesn’t make the case “for” weaker.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;For a standards subversion attempt, it&amp;rsquo;s not very subtle. In all but one instance, Clyde Frog&amp;rsquo;s involvement with the standards request is clear from the outset. The reasoning is, true to character, opaque: the USG wants these extensions &amp;ldquo;just because&amp;rdquo;. One of the authors of the proposals, Jerry Solinas, is very well known; even at the time, his name would have raised eyebrows.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Except for Hoffman&amp;rsquo;s last proposal, the extensions are cordoned off to the US Government. The sponsors of the standards and their authors make very little effort to provide a use case for normal Internet users.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The &amp;ldquo;structured input argument&amp;rdquo; I detailed above is plausible and has precedent in other protocols. Arguments were made that session binding for things like SP800-56A could have been done on top of, rather than inside, TLS; but in practice, that would have required an entire custom shim protocol.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In several cases, the aspects of these proposals that now seem so problematic appear to originate from within IETF, not from Clyde Frog. Clyde Frog seems happy to get arbitrary opaque data fed to the TLS PRF. The TLSG isn&amp;rsquo;t OK with that: arbitrary opaque data could enable arbitrary vendor features, and TLSG wants control over new TLS features. It seems like it&amp;rsquo;s often the TLSG that wants to ensure these proposals spool CSPRNG state across the wire, not Clyde Frog.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If I have a controversial statement to make about Extended Random, it’s this: reasonable people can disagree about whether it was an attempt to subvert the IETF. I lean towards “not”; the structure of these proposals makes Clyde Frog’s job needlessly harder, if only by practically ensuring that OpenSSL and Schannel would never default to enabling them. But people smarter than me are convicted of the idea that this was a backdoor attempt.&lt;/p&gt;&#xA;&lt;p&gt;I do not think reasonable people can disagree about Rescorla and Hoffman’s role in the narrative. There is no evidence that either of them were knowingly abetting an attempt to subvert the IETF.&lt;/p&gt;&#xA;&lt;p&gt;The USG is the world’s largest IT buyer. They’re also host to the world’s largest deployment of classified proprietary crypto, which makes their use of TLS much more difficult. USG has always needed help getting their (often legitimate) interests represented at IETF.&lt;/p&gt;&#xA;&lt;p&gt;Ensuring that Clyde Frog can&amp;rsquo;t corrupt the TLS standards isn&amp;rsquo;t &lt;em&gt;  Does any of this matter in practice? Fuck no. Apart from what appear to be some misconfigured FIPS BSAFE-C-TLS implementations, nobody ever used Extended Random, and nobody ever should. The proposals are dead, which is as it should be. Thankfully, the same thing is true of number-theoretic bignum CSPRNGs. &lt;/em&gt; Rescorla and Hoffman&amp;rsquo;s job; it&amp;rsquo;s everyone&amp;rsquo;s job. For such a tiny set of proposed extensions with such an impact (if only on the news cycle), these proposals generated a pitiful amount of discussion and virtually no skepticism from the IETF. Unlike Rescorla&amp;rsquo;s role in writing a pair of Internet drafts, that conclusion is actually alarming.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Sincere thanks to Matthew Green, Tanja Lange, Chris Palmer, and David Adrian for proofreading and corrections. None of them endorse my reasoning!&lt;/em&gt;&lt;/p&gt;&#xA;</content>
	</entry>

	<entry>
		<title type="html">Starfighter, Summer 2015</title>
		<link href="https://sockpuppet.org/blog/2015/07/13/starfighter/" rel="alternate" type="text/html"/>
		<id>https://sockpuppet.org/blog/2015/07/13/starfighter/</id>
		<published>2015-07-13T00:00:00Z</published>
		<updated>2015-07-13T00:00:00Z</updated>
		<author>
			<name>Thomas &amp; Erin Ptacek</name>
		</author>
		<content type="html">&lt;p&gt;&lt;em&gt;An Erin post!&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;1&#34;&gt;1&lt;/h3&gt;&#xA;&lt;p&gt;I don’t really like games.&lt;/p&gt;&#xA;&lt;p&gt;Screen graphics make me nauseous. The political interactions between players are tedious. I’m not a fan of chance, I stink at riddles and it’s rare that someone can concoct a mystery that I cannot immediately resolve.&lt;/p&gt;&#xA;&lt;p&gt;Then I became an app pentester. And not long after I started my new career, I realized I’d found a game I loved. I stayed at my pentesting job at &lt;a href=&#34;https://web.archive.org/web/20150315010602/http://matasano.com/careers/&#34;&gt;Matasano&lt;/a&gt;3x longer than any other job. Why? Every week, there was a new puzzle to solve.&lt;/p&gt;&#xA;&lt;p&gt;Security games have context. They have worlds. Severe vulnerabilities for online banking are footnotes for CRMs. Each gig, I figured this out on the fly, designed test programs on the fly. There was time pressure. I had to think. I had to solve. So when I hosed a $50,000 “data loss protection” server for 24 hours with a single packet, or DDOS’d a high availability trading server, I felt really fucking smart. I am a utilitarian at heart, and this was my fix.&lt;/p&gt;&#xA;&lt;p&gt;Fast forward almost a decade.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve started a company to help &lt;a href=&#34;http://sockpuppet.org/blog/2015/03/06/the-hiring-post/&#34;&gt;fix hiring&lt;/a&gt;. We had two ideas: run job interviews for other companies&#xA; &lt;em&gt;  Somewhere in an alternate universe, we are building a far less ambitious codebase and hating life just as much. &lt;/em&gt; &#xA;, or build a giant game, a CTF, that replicated the experience of doing work. We had to pick one idea. The CTF/game idea, at the time, sounded like a lot more fun, so we went with it.&lt;/p&gt;&#xA;&lt;p&gt;In 2014, my former co-workers built a CTF called Microcorruption. In it, you reverse-engineer a series of locks built on a microcontroller, exploiting flaws in the lock’s code. I loved Microcorruption. I think I got through 10 levels before I ran out of free time. I’d never before watched a machine execute instructions, step by step, seeing the stack pointer move through the program memory while meaningful numbers were loaded into registers and shuffled around. This… this is my kind of game.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.microcorruption.com&#34;&gt;You can still play Microcorruption&lt;/a&gt;; it’s still running. We knew we wanted Starfighter to be like Microcorruption. But we also knew it had to be &lt;strong&gt;more.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;2&#34;&gt;2&lt;/h3&gt;&#xA;&lt;p&gt;For Microcorruption, Tom wrote a TI MSP430 emulator in Go. When we began Starfighter, Tom said to me, “You’re going to write an AVR emulator.” At the time, I didn’t really think to ask why. I had no idea what AVR was beyond “an instruction set.” I just smiled and said, “Okay.”&lt;/p&gt;&#xA;&lt;p&gt;So I wrote an emulator using the &lt;a href=&#34;http://www.atmel.com/images/atmel-0856-avr-instruction-set-manual.pdf&#34;&gt;Atmel 8-Bit AVR specs&lt;/a&gt;. I&amp;rsquo;d never written an emulator. Or anything else as big as an emulator. It&amp;rsquo;s one of the hardest things I&amp;rsquo;ve ever done&#xA; &lt;em&gt;  Not quite as hard as jumping over a pile of sandbags on skates, but still hard. &lt;/em&gt; &#xA;. Each night, for almost two months, I&amp;rsquo;d crawl into bed, completely mentally drained. There were more problems to solve than I knew how to handle. And I was like a pig at a slop trough.&lt;/p&gt;&#xA;&lt;p&gt;Tom wrote a guidebook based on his experience writing Microcorruption’s MSP340 emulator for me, but it’s only today —– long after the emulator is finished —– that I read the second half. Because at some point, it became very apparent that AVR… well, it was just plain weird.&lt;/p&gt;&#xA;&lt;p&gt;His guidebook describes a CPU as a struct with two arrays: one for memory and another for registers, stack pointer, program counter and status bits. &lt;a href=&#34;http://s3.eurecom.fr/docs/secucode09_francillon.pdf&#34;&gt;Those of you who know a little AVR&lt;/a&gt; will be amused to hear me say that I did not get very far with that design.&lt;/p&gt;&#xA;&lt;p&gt;“Some of these instructions seem to be looking for the stack pointer in memory,” says I.&lt;/p&gt;&#xA;&lt;p&gt;“It can’t work that way,” Tom responded.&lt;/p&gt;&#xA;&lt;p&gt;“Yes it can.”&lt;/p&gt;&#xA;&lt;p&gt;“No it can’t. That’s not how computers work.”&lt;/p&gt;&#xA;&lt;p&gt;We squabbled. I really did try it his way. I pushed the square peg of Tom’s CPU description through the squiggly amoeba-shaped hole of the AVR ISA. Hard. Then I gave up and rewrote my code, putting the program instructions in one array and the the stack pointer, general purpose registers and the status register in another.&lt;/p&gt;&#xA;&lt;p&gt;A few days later, Tom says, “Something something blah blah Harvard Architecture blahdy-blah.” I’m sure this is not exactly what he said, but I was in such a fugue state by this point that time was folding in on itself.&lt;/p&gt;&#xA;&lt;p&gt;A &lt;a href=&#34;https://en.wikipedia.org/wiki/Harvard_architecture&#34;&gt;Harvard Architecture&lt;/a&gt; has two distinct memories; there is program memory (imem, typically flash) and data memory (dmem, typically SRAM). They live in two different address spaces. The CPU reads instructions from imem, but instructions themselves read and write dmem.&lt;/p&gt;&#xA;&lt;p&gt;This is neat because makes exploits harder to write. You can’t simply upload code in a buffer and somehow point the PC at it; that buffer is in dmem, not imem. You’ll see what I mean in a few weeks.&lt;/p&gt;&#xA;&lt;p&gt;AVR gets weirder. The stack pointer gets IN’d and OUT’d to an IO address in memory — it’s a peripheral. “Computers don’t work that way!”, says Tom. I ignored him.&lt;/p&gt;&#xA;&lt;p&gt;The general purpose registers and IO are in reserved data memory address space. The status register is also in the dmem address space. Yes, computers work that way, Tom. Some instructions look in a reserved location in IO memory to retrieve the stack pointer. But you can read all about registers on page 8 of the ATMega8515 Datasheet Summary. And in my corner of the Starfighter game, you’ll get to play with all of this stuff.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set&#34;&gt;AVR&lt;/a&gt; is not like &lt;a href=&#34;http://www.ece.utep.edu/courses/web3376/Links_files/MSP430%20Quick%20Reference.pdf&#34;&gt;MSP430&lt;/a&gt;. It’s not like &lt;a href=&#34;https://en.wikipedia.org/wiki/X86_instruction_listings&#34;&gt;X86&lt;/a&gt;. It is not, as Thomas claims, “like someone vomited up an instruction set”. It’s a complicated microcontroller instruction set designed for tiny parts with small programs that don’t change often. To date, I’ve ‘discovered’ 142 instructions through test code. There are something like 16 load and 13 store instructions. A summary table can be found on pages 10-12 of the ATMega8515 Datasheet Summary.&lt;/p&gt;&#xA;&lt;p&gt;Well, I did say I wanted to work on something more fun, didn’t I?&lt;/p&gt;&#xA;&lt;h3 id=&#34;3&#34;&gt;3&lt;/h3&gt;&#xA;&lt;p&gt;Yeah, so… I was planning on telling you more about our game. Sorry. I have a tendency to natter.&lt;/p&gt;&#xA;&lt;p&gt;Back in the dawn of time, before electricity and running water, when dinosaurs roamed the earth and stack pointers weren’t peripherals and an emulator was “just a pair of arrays”, &lt;a href=&#34;http://www.kalzumeus.com/2015/03/09/announcing-starfighter/&#34;&gt;Patrick wrote a post&lt;/a&gt; about what we’re doing. The one where he said there’d be tech trees.&lt;/p&gt;&#xA;&lt;p&gt;The goal in Microcorruption was trivial. Flip a bit, open a lock. Lock software gets patched; overflow memory, open a lock. Starfighter is more ambitious. It has &lt;a href=&#34;https://en.wikipedia.org/wiki/Core_War&#34;&gt;PVP&lt;/a&gt; elements. I draws on all the fun stuff we&amp;rsquo;ve done over the years at Matasano. Stuff like when Tom called me and asked if he could have a truckload of pork bellies&#xA; &lt;em&gt;  (CME ticker:GBP. And: I told him no.) &lt;/em&gt; &#xA;delivered to our house.&lt;/p&gt;&#xA;&lt;p&gt;For the past two months, Patrick has been been building an online trading market. A virtual stock exchange with realistic limit order book markets. With NPCs that trade, in real orders. In Patrick&amp;rsquo;s tech tree, your gameplay can move markets. At some levels, you&amp;rsquo;ll play not just to game the market but to compete with other players —– if that&amp;rsquo;s how you get your fix.&lt;/p&gt;&#xA;&lt;p&gt;(Y.T., knowing diddly about markets, is very much looking forward to playing the market tree.)&lt;/p&gt;&#xA;&lt;p&gt;Players on the security tech tree are given a handheld device of the sort a trader could carry around the floor to execute trades. But you&amp;rsquo;re not a trader; you&amp;rsquo;re more like a runner. A gopher. Your handheld is locked; you&amp;rsquo;re not allowed to trade. So you learn AVR. You subvert the device. Escalate your read-only privileges to read-write. Submit your own trades. Crawl through the HVAC ducts into the machinery of the market and see how much damage you can do.&lt;/p&gt;&#xA;&lt;p&gt;Don&amp;rsquo;t want to learn AVR? Don&amp;rsquo;t worry! Patrick&amp;rsquo;s trading application is just the sort of third party JSON/REST tool you&amp;rsquo;d see on a day trader&amp;rsquo;s desktop. But — there&amp;rsquo;s always a &amp;lsquo;but&amp;rsquo;, isn&amp;rsquo;t there? — in upcoming levels, to get high-performance access to the markets, you&amp;rsquo;ll benefit from writing low level code to talk to markets.&lt;/p&gt;&#xA;&lt;p&gt;But not necessarily AVR. Thomas built a compiler for Starfighter.&#xA; &lt;em&gt;  This, dear reader, is why you have been waiting ever so patiently for our release. As it turns out, even a crappy compiler is tricky to write. &lt;/em&gt; &lt;/p&gt;&#xA;&lt;p&gt;Unlike Microcorruption, we wanted Starfighter to be multi-architecture. It will be, but in chapter 1, only sort of. Instead, players work with C, with an executable bytecode IR, and with its translation into AVR.&lt;/p&gt;&#xA;&lt;p&gt;It is a terrible compiler. I could barely write enough C to test my AVR emulator and &lt;em&gt;I&lt;/em&gt; know it’s a crappy compiler. Hint: terrible is part of the point.&lt;/p&gt;&#xA;&lt;p&gt;We’re giving players the dev kit for the handheld trading device. You can program it in AVR assembly. But the vendor also offers support for a very limited dialect of C, compiled to bytecode IR or to AVR. Emphasis on “limited”. You know, because we did less of the fun stuff for you.&lt;/p&gt;&#xA;&lt;p&gt;(In later releases, we’re hoping to do a tech tree with challenges that focus on compiler design.)&lt;/p&gt;&#xA;&lt;h3 id=&#34;4&#34;&gt;4&lt;/h3&gt;&#xA;&lt;p&gt;Just two months ago, Tom and I were driving to the grocery store and he says in the most idle and preoccupied tone, “This code base is really ambitious.” My reply: “No shit? You’re just now figuring this out?” Then I punched him in the shoulder.&lt;/p&gt;&#xA;&lt;p&gt;Our code is a hot mess&#xA; &lt;em&gt;  (of Golang and React) &lt;/em&gt; &#xA;right now, but I&amp;rsquo;m excited.&lt;/p&gt;&#xA;&lt;p&gt;We set out to build a game that would make it easy for people around the world to demonstrate raw aptitude for programming, and to spice it up with the endorphin fix we get from reversing and breaking complicated systems. I think we picked the right foundations to build on. Electronic trading is a huge problem domain that reaches into distributed systems and high-performance computing. Low-level software security pulls in compiler theory, cryptography, and language runtimes.&lt;/p&gt;&#xA;&lt;p&gt;Network API programming! Trading! Order books! Assembly language! Runtime security! Cryptography! Reversing! Us pretending all our bugs were intentional, to make things more like the real world!&lt;/p&gt;&#xA;&lt;p&gt;I think we’ve given ourselves a lot of places to go. We’re looking forward to seeing where you go with it. See you in a “few” weeks!&lt;/p&gt;&#xA;</content>
	</entry>

</feed>
