<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Jonathan Looi]]></title><description><![CDATA[Investigating cyber and AI things]]></description><link>https://jonathanlooi.com</link><image><url>https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png</url><title>Jonathan Looi</title><link>https://jonathanlooi.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 21 Jul 2026 01:47:50 GMT</lastBuildDate><atom:link href="https://jonathanlooi.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jonathan Looi]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jonathanlooi@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jonathanlooi@substack.com]]></itunes:email><itunes:name><![CDATA[Jonathan Looi]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jonathan Looi]]></itunes:author><googleplay:owner><![CDATA[jonathanlooi@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jonathanlooi@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jonathan Looi]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Exploring Intelligence-Hungry versus Intelligence-Full Cyber Tasks]]></title><description><![CDATA[3 months ago, like many on LinkedIn, I posted a hot take on Mythos.]]></description><link>https://jonathanlooi.com/p/exploring-intelligence-hungry-versus</link><guid isPermaLink="false">https://jonathanlooi.com/p/exploring-intelligence-hungry-versus</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Tue, 14 Jul 2026 03:04:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>3 months ago, like many on LinkedIn, </span><a href="https://www.linkedin.com/posts/jonathanlooi_ive-been-reading-a-lot-of-good-hot-takes-activity-7447733837268369408-ryPZ?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAA--emMBigrB0QSMhOKzXqNz0pG52167o04"><span>I posted a hot take</span></a><span> on Mythos.</span></p><p><span>My thesis was, given how good frontier models are and will continue to be at cyber tasks, cyberwarfare will eventually become a function of whoever can expend the most compute. Asymmetric inference costs between offense and defense (Shahed to Patriot missile cost analogy) will become a defining problem in cybersecurity.</span></p><p><span>It&#8217;s crazy just how fast we went from tokenmaxxing to conserving inference spend. Enterprises are now using routers and vastly cheaper open models only a few months off the frontier. </span><a href="https://x.com/brian_armstrong/status/2070670644577280109"><span>Coinbase already defaults to GLM 5.2 and Kimi 2.7</span></a><span> via their LLM gateway. I guess this is the natural evolution of things when major enterprises burn through their entire AI budgets in April (sorry Uber).</span></p><p><span>There&#8217;s a great mental model that I came across in a </span><a href="https://substack.com/@judithdada/p-170719547"><span>Substack article from Judith Dada</span></a><span> in August of last year. She splits tasks into two kinds:</span></p><ol><li><p><span>Intelligence-Hungry -&gt; performance improves with more intelligence. These are usually creative tasks, like copywriting or research.</span></p></li><li><p><span>Intelligence-Full -&gt; complexity is fixed, so performance caps out at a certain intelligence level, making SOTA models unnecessary. Judith gives the example of payroll automation, because once a system is able to pay employees accurately and on time, there is no competitive advantage to making it smarter.</span></p></li></ol><p><span>I believe every enterprise security team (and every cybersecurity startup that wants to keep its margins high) will need to start asking: which cyber tasks are Intelligence-Hungry versus Intelligence-Full?</span></p><p><span>My initial assumptions:</span></p><ul><li><p><span>Threat hunting and detection engineering are Intelligence-Hungry -&gt; These are open-ended exploration/research tasks, a bit like planning in software engineering. They require creativity and a deep understanding of the environment.</span></p></li><li><p><span>Alert triage is Intelligence-Full -&gt; Once an agent is able to correctly triage a type of alert, there is no added benefit to making that agent smarter. (Brand new alert types are the exception.)</span></p></li><li><p><span>Threat intelligence is Intelligence-Hungry -&gt; Creative pivoting and broad domain contextual analysis is needed.</span></p></li><li><p><span>Penetration testing is Intelligence-Full -&gt; Like in software engineering, pentest planning will probably be handled by frontier models, but the execution of specific, bounded TTPs can be cheaply handled by less intelligent models. This is already happening. </span><a href="https://dreadnode.io/research/worlds-a-simulation-engine-for-agentic-pentesting/"><span>Dreadnode (IQT portco!) recently fine-tuned an 8B model on synthetic Active Directory data</span></a><span>, making it smart enough to get Domain Admin.</span></p></li></ul><p><span>I&#8217;m curious where folks might differ in opinion - which of my categorizations are right/wrong?</span></p>]]></content:encoded></item><item><title><![CDATA[Why coding agents are so far ahead]]></title><description><![CDATA[and what it&#8217;ll take to bring reliable agents into every domain]]></description><link>https://jonathanlooi.com/p/why-coding-agents-are-so-far-ahead</link><guid isPermaLink="false">https://jonathanlooi.com/p/why-coding-agents-are-so-far-ahead</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 23 May 2026 17:12:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Coding agents have proliferated faster and gone further than agents in any other domain. Claude Code and its peers now run autonomously for hours on tasks that would take human engineers a full workday. METR has been tracking the time horizon at which frontier models hit 50% success on software tasks, and that horizon has been doubling roughly every 7 months since 2019, with the pace accelerating to about every 4 months in 2024-2025.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> Agents in other domains are nowhere close.</p><p>The usual explanations are valid but incomplete. Models understand code well, open source training data is abundant, agents are good at using the terminal, and version control makes iteration and collaboration natural.</p><p>But I believe the most important factor is that coding agents have a better feedback loop than any other domain. That loop depends on two properties:</p><ol><li><p>Verifiability with precise error attribution -&gt; you can grade an outcome against ground truth and point to exactly where it went wrong</p></li><li><p>Cheap, realistic iteration -&gt; you can run thousands of cycles in an environment that closely resembles deployment</p></li></ol><p>An agent writes code, runs and tests it in a sandbox VM similar to production, and gets a ground-truth signal in seconds. When it fails, the agent can easily identify the exact line of code that caused the failure.</p><p>The Anthropic compiler experiment illustrates this well when applied to a long horizon task. In February 2026, Anthropic ran parallel agents using Claude Opus 4.6 to build a C compiler in Rust capable of compiling the Linux kernel.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> After roughly 2,000 sessions and $20,000 in API costs, the agents produced a functional 100,000-line compiler. While the code (published on Github) is a bit of a mess, it is an insanely impressive accomplishment for agents to have autonomously (for the most part) built such a complex piece of software.</p><p>The experiment worked because of a tight and accurate testing/validation loop. Nicholas Carlini at Anthropic used GCC (the de facto standard open-source compiler) as a known-good oracle. An oracle, in testing, is a trusted reference that tells you what the correct output should be.</p><p>For software validation, the test can be many things, like whether the syntax is correct, whether or not the code ran, whether it passes specific unit/integration tests, etc. But since the end goal was building a compiler, GCC was the perfect oracle. Carlini compiled most of the Linux kernel with GCC and a random subset with Claude&#8217;s compiler. Any divergence between the two outputs was, by definition, a bug in Claude&#8217;s version. Each failure pointed to a specific code path he could direct the agents to iteratively find and fix.</p><p>The loops ran in virtual machines which are similar to real deployment environments and relatively cheap and fast to spin up and iterate at scale.</p><p>Compare this to customer service agents where the outcomes are much more subjective. Customer service agents fail the verifiability test because there is no oracle for the right response to a frustrated human. Humans are varied and complicated! Then, there&#8217;s no way to attribute exactly what sentence in the AI customer service agent&#8217;s response caused the customer to churn or stay.</p><p>Similarly, AI sales rep agents fail the iteration speed test. The sales feedback cycle can run for months. Even if you had a perfect oracle, the loop is too slow to drive learning. There is no GCC for determining if a cold email was perfectly crafted, and even if there were, it&#8217;d probably take a multiple month sales cycle to figure out if it was right.</p><p>These are structural problems for domains involving humans. But, the oracles and simulation environments don&#8217;t have to be perfect - they just have to be good enough and fast enough to drive learning.</p><p>Verifiable, cheap and realistic loops are possible and already exist in domains much messier than code. Waymo&#8217;s simulator is a perfect example.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> Driving is chaotic and full of human pedestrians, cyclists weaving through traffic, other drivers behaving unpredictably, weather, construction, and a whole host of edge cases. Waymo has built a simulator that runs roughly 25,000 virtual vehicles covering up to 10 million simulated miles per day. The other road users in it are reactive agents like simulated pedestrians, cyclists, and drivers which respond to how the Waymo moves, calibrated against millions of miles of real-world driving data.</p><p>There of course is no ground truth like GCC is to compiling code for &#8220;did the car drive well&#8221;, but the simulator is good enough and trained on enough real world data to validate that trips can be completed safely and efficiently. The sandbox isn&#8217;t a perfect physics simulator but it is plausible enough to mimic real world behavior, and iterates fast enough and inexpensively enough to be run millions of simulated miles every day. The iterations are both verifiable and cheap.</p><p>I believe the next wave of agent progress will come from people manufacturing realistic simulations with fast iterations for domains that don&#8217;t have them yet. My guess is we will get progress from constructed oracles for narrow slices of a domain rather than full-fidelity simulations of the whole thing.</p><p>If you&#8217;re building simulation environments, constructed oracles, or fast feedback loops for messy domains, I want to hear from you!</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p><a href="https://metr.org/time-horizons/">https://metr.org/time-horizons/</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p><a href="https://www.anthropic.com/engineering/building-c-compiler">https://www.anthropic.com/engineering/building-c-compiler</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p><a href="https://waymo.com/blog/2026/02/the-waymo-world-model-a-new-frontier-for-autonomous-driving-simulation/">https://waymo.com/blog/2026/02/the-waymo-world-model-a-new-frontier-for-autonomous-driving-simulation/</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[Occasional Bouts of Heroism]]></title><description><![CDATA[There was a concept at Google that I always had mixed feelings about.]]></description><link>https://jonathanlooi.com/p/occasional-bouts-of-heroism</link><guid isPermaLink="false">https://jonathanlooi.com/p/occasional-bouts-of-heroism</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 09 May 2026 22:51:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hX3A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hX3A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hX3A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 424w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 848w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 1272w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hX3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png" width="1012" height="566" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:566,&quot;width&quot;:1012,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:567206,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/197052297?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hX3A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 424w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 848w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 1272w, https://substackcdn.com/image/fetch/$s_!hX3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4328f9b7-184d-4ac5-9ab4-fc88877174ad_1012x566.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There was a concept at Google that I always had mixed feelings about. It is called the &#8220;No Heroes&#8221; rule<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, and the argument goes like this: When an individual has to do a heroic task (ex: work 18 hours straight to prevent an outage) that effort is masking a systemic and institutional gap. The right response is to fix the system so heroism becomes unnecessary. In a mature, high performing engineering org, there should be no heroes.</p><p>No Heroes is generally the correct engineering doctrine in a mature organization. But I believe it is wrong as a theory of how institutions actually get things done, and is wrong about human nature.</p><p>Charlie Munger once described Google&#8217;s headquarters as a &#8220;very rich kindergarten.&#8221; Munching on snacks in the micro-kitchen, I couldn&#8217;t help but feel I was getting soft, and that the organization itself was getting soft. No Heroes removes the veneration of going hard, which over time selects for a different kind of employee. Google is an unusual place and was a privilege to work at, but a No Heroes ethos paired with a culture of comfort gets dangerous the moment the org has to get medieval and go from 0 to 1.</p><p>Even inside Google, I was often surprised to find that one engineer happened to know everything about a system and was the major driving force behind it. Most progress, even inside large institutions, is made by one person with the drive and skill to pull it off. The xkcd &#8220;Dependency&#8221; comic about modern infrastructure resting on &#8220;a project some random person in Nebraska has been thanklessly maintaining since 2003&#8221; is a joke and also true.</p><p>This is the double-edged sword. There is a concept I came across recently called the Bus Factor. It refers to the number of people who would need to disappear (get hit by a bus) before a project loses enough critical knowledge to continue. A 2015 study found that for 64% of the top 133 GitHub projects, the Bus Factor was below 2<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. Heroism without institutional backing produces fragility.</p><p>I am in many ways amenable to the Great Man of History theory. It is hard to operate in the startup world without believing at least parts of it. The founder is that great (wo)man, single-handedly pulling the company, and sometimes the world, along into something generational.</p><p>Startups, and the startup mindset, are organized entirely around heroism. It is all &#8220;cracked 10x engineers&#8221; and going Founder Mode, and it really does take a uniquely visionary and gritty individual to go from 0 to 1. The cost is that 24/7 heroism is often unsustainable, and a major cause of startup death is the founder giving up. Startups need at least some institutional scaffolding so that the company can survive a key person leaving. But Brian Chesky&#8217;s vision of Founder Mode is essentially that the founder-as-hero archetype should never end, even as a startup scales up even into IPO. So in the vision of Founder Mode, the company is the founder. The founder absolutely should understand the product best, but the same instinct, taken too far, can produce tyrannical micromanagement and cults of personality.</p><p>The military is a great example of holding &#8220;No Heroes&#8221; and &#8220;celebration of heroes&#8221; in tension simultaneously. Individuals join as they are, and the institution forges them into a disciplined whole greater than the sum of its parts. Individuals are made interchangeable, and the institution is designed to keep functioning regardless of who fills any one role. And yet military history is overwhelmingly a history of named individuals doing heroic, extraordinary things in service of the mission. Nobody gets a Medal of Honor in a mission where everything goes to plan. We have after action reports to root out systemic failures and learn from mistakes, but we also celebrate, honor, and encourage heroic acts of service.</p><p>Heroism and institution are complementary and must be calibrated to meet the moment. Google could probably use a few more heroes (Sergey Brin getting back in the weeds to build agentic coding is a great example of this). Open source probably needs fewer heroes and more structural support, so that critical infrastructure does not rest on one burned out maintainer. Startups could use more institutional scaffolding, so founders can survive long enough to build something durable. I do not have a clean rule for which mode any given organization needs. The hard judgement call is knowing which one your organization needs more of, and when.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Google SRE handbook on No Heroes: <a href="https://sre.google/resources/practices-and-processes/no-heroes/">https://sre.google/resources/practices-and-processes/no-heroes/</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Bus Factor study: <a href="https://www.ecirtam.net/autoblogs/autoblogs/wwwframablogorg_0150d398ec69403f962b63cd890a319026e932de/media/97b9a7ec.1233.pdf">https://www.ecirtam.net/autoblogs/autoblogs/wwwframablogorg_0150d398ec69403f962b63cd890a319026e932de/media/97b9a7ec.1233.pdf</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[Asymmetric Inference]]></title><description><![CDATA[The future of cyber warfare as an industrial capacity problem]]></description><link>https://jonathanlooi.com/p/asymmetric-inference</link><guid isPermaLink="false">https://jonathanlooi.com/p/asymmetric-inference</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Fri, 17 Apr 2026 10:08:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been reading a lot of (good) hot takes on Anthropic&#8217;s Mythos Preview. Much of it has boiled down to &#8220;wow this is crazy&#8221; (I agree) and &#8220;defenders need to use AI to fight attackers with AI&#8221; (I was at RSA two weeks ago and it&#8217;s cliche, but I also agree).</p><p>Most of the chatter is about speed. Speed to vuln discovery and exploitation, versus speed of patching and responding. That&#8217;s definitely a problem which needs to be solved, but I want to take this in a slightly different direction and focus on the asymmetric cost of inference.</p><p>Mythos is genuinely, concerningly capable, and my assumption is other labs will likely close the gap in 3&#8211;6 months, and open source possibly in 12 (don&#8217;t hold me to this prediction). Mythos is also rumored to be extremely large, expensive to train, and expensive to run. Now that frontier models are better than humans at offensive cyber tasks, the bottleneck stops being cyber talent and becomes industrial capacity.</p><p>As these agents run 24/7/365, cyberwarfare starts to look like a contest of which nation can sustain the most datacenters and gigawatts.</p><p>This means the defender&#8217;s response isn&#8217;t just to &#8220;use AI too&#8221;. It&#8217;s to balance out the compute cost ratio.</p><p>How much inference does it take for an offensive AI agent to go from an external-facing web app to domain admin? My (somewhat) educated guesstimate: not that high. And it&#8217;s going to take significantly more inference and compute to ingest logs from each endpoint, correlate them, get an agent to triage, and then do the remediation. From an inference standpoint, defense (as we currently do it with the SOC model) is probably more expensive out of the gate.</p><p>The analogy I like to work with is that of kinetic air defense. Patriot PAC-3 interceptors run about $4 million each, while Shahed drones cost roughly $20,000 to $50,000. Not to mention production time and industrial capacity limitations. Whoever forces the other side into the wrong side of the cost curve wins the war of attrition.</p><p>AI-enabled cyber is heading to the same place. &#8220;Can the model do it&#8221; will no longer be the question - we know it can, and if it&#8217;s can&#8217;t it&#8217;ll probably be able to in the next 12 months. The question I&#8217;m most interested in now: what&#8217;s the cost ratio, per campaign, per target, between the cheapest offensive capability and the cheapest defense that neutralizes it?</p><p>If you&#8217;re building toward structurally cheaper defensive inference - I&#8217;d love to hear from you!</p>]]></content:encoded></item><item><title><![CDATA[Prompt Injection as Defense]]></title><description><![CDATA[How to impede agentic attackers]]></description><link>https://jonathanlooi.com/p/prompt-injection-as-defense</link><guid isPermaLink="false">https://jonathanlooi.com/p/prompt-injection-as-defense</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Fri, 17 Apr 2026 10:05:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If most offensive cyberattacks will soon be conducted by AI agents, an entirely new realm of defensive opportunities opens up.</p><p>Anyone who has built or worked with AI agents knows they can be superhuman yet also quite dumb. They depend on the right prompting, context management, tool calling, and task planning to function at all. Of course, there are brilliant engineers working nonstop to close these gaps, and I believe they will. But the architectural properties of LLM-based agents introduce inherent weaknesses that human attackers don&#8217;t have. Defenders should exploit them.</p><p>The MITRE ATLAS framework maps adversarial attacks against AI systems. It&#8217;s a threat model for defending your own AI. But I propose flipping it - use it as a guide for how to attack agents trying to attack your network.</p><p>A few examples:</p><ul><li><p><strong>Prompt Injection</strong> -&gt; Anything an attacker pipes into an LLM should be contested ground. Logs, error messages, READMEs, API responses, etc. Embed injections everywhere. Make attackers second-guess every bit of context they ingest.</p></li><li><p><strong>Memory and State Corruption</strong> -&gt; Agents with persistent memory or long-running task state are especially fragile. Honeypots and canaries have always existed, but now they can be tuned to exploit how agents plan. Corrupt the planning stage, and you&#8217;ve derailed every downstream step. You&#8217;ll also be forcing agents to burn tokens chasing fake leads.</p></li><li><p><strong>Tool Poisoning</strong> -&gt; Attackers living off the land rely on existing binaries. Agents trust the outputs of the tools they call. Poison those outputs (in a way that doesn&#8217;t deceive legitimate users).</p></li><li><p><strong>Context Window Flooding</strong> -&gt; What if we weaponized the &#8220;Lost in the Middle&#8221; problem? LLMs reliably lose track of information buried in long contexts. Flood the zone.</p></li><li><p><strong>Corrupt the Validation Loop</strong> -&gt; Well-built agents usually have self-checks, such as running tests or validating against initial requirements. If tests pass, an agent usually thinks it&#8217;s all good and moves on to the next task.</p></li></ul><p>You may notice that much of this centers around deception! More on that in a future piece.</p><p>I believe the future of cyber defense is not to replicate the existing SOC structure with AI agents. It&#8217;s to build solutions that asymmetrically impose costs on attackers, however they evolve.</p><p>Now is not the time to mope about how AI-enabled attackers are going to go so much faster, and find so many more vulns, and move at such scale - we know they will. Agents introduce a whole class of vulnerabilities that humans don&#8217;t have. The goal isn&#8217;t perfect deception or stopping agents completely. It&#8217;s about impeding every step and imposing costs, making agentic attackers distrust their own decisions at every stage of the kill chain.</p><p>&#8212;</p><p>If you are building solutions to attack AI agents (for defense), I want to hear from you!</p>]]></content:encoded></item><item><title><![CDATA[My agentic coding setup [April 2026]]]></title><description><![CDATA[How I'm coding today and how it's changed over time]]></description><link>https://jonathanlooi.com/p/my-agentic-coding-setup-april-2026</link><guid isPermaLink="false">https://jonathanlooi.com/p/my-agentic-coding-setup-april-2026</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Fri, 17 Apr 2026 08:47:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WvvF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F930ecf8d-8810-4a8d-924b-a59215fbef1f_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Occasionally I&#8217;ll scroll Twitter and see people claiming they run 10+ coding agents simultaneously. I&#8217;m genuinely curious how they&#8217;re pulling this off. Is this actually their workflow, or is it performative?</p><p>As a former professional software engineer, it&#8217;s insane just how much the profession has changed in the past 2 years, and especially in the past few months.  2 years ago I was still hand-coding with VSCode, augmented with a little line completion. 1 year ago I was using Cursor with GPT 4.5, letting it a file or two at a time, reading and reviewing all code the AI produced. Today I&#8217;m a whole lot more hands off. </p><p>It&#8217;s gone from me only trusting AI to complete single lines of code, to me trusting AI to write functions, to me trusting AI to write files, to me trusting AI to write entire features (and getting AI to review the code also).</p><p>I&#8217;ve been experimenting heavily with (semi) long-running coding agents lately, and my current max is around 5 concurrent agents. There are two big bottlenecks:</p><ul><li><p>My own mental context window. I could be using an orchestrator agent with a kanban board to manage those agents, but I actually want to be hands on with the business logic. After 5 agents, I can no longer keep track of what&#8217;s going on. Possibly a skill issue.</p></li><li><p>My current codebases aren&#8217;t big enough for that many agents to work discrete features without bumping into each other and causing merge conflicts.</p></li></ul><h2>My current setup</h2><p>Given the speed of changes in the devtools ecosystem, I&#8217;ve been tweaking my coding setup weekly. This is my current setup as of April 2026:</p><ul><li><p><a href="https://www.conductor.build/">Conductor</a> for managing agents (free)</p><ul><li><p>As much as I like iTerm + Tmux, Conductor is a level up for managing agents. The sandboxing makes it much easier to manage multiple sessions. I would find it much much harder to manage multiple agents if not for Conductor.</p></li></ul></li><li><p>Claude Code (Opus 4.7) &#8211;&nbsp;Max Plan 5x ($100 per month)</p><ul><li><p>It&#8217;s great - I don&#8217;t have much to add about Claude Code that hasn&#8217;t already been written.</p></li><li><p>Claude Design is shockingly good also. Highly recommend. I&#8217;m no designer, but I&#8217;ve been using it a lot ever since it came out.</p></li></ul></li><li><p>Codex (GPT 5.4) &#8211; ChatGPT Plus Plan ($20 per month)</p><ul><li><p>I use a mix of both Claude Code and Codex. I originally started using Codex because I had been hitting Claude Code usage limits (I&#8217;m on the Max 5x plan), but then started to actually like it. Claude Code is still my primary coding agent, but I still use Codex to review the code that Claude Code produces. I don&#8217;t have strong opinions about the pros and cons of Codex versus Claude Code. I find them to be borderline interchangeable.</p></li></ul></li><li><p><a href="https://github.com/garrytan/gstack">Gstack</a> setup for Claude Code (free, thanks Garry Tan)</p><ul><li><p>I opted to use Gstack rather than building out many of my own Skills because I&#8217;m probably not going to put in the cycles to maintain them just for myself, and I&#8217;m personally probably better off deferring to the best practices built up by the community.</p></li><li><p>Gstack forces clarifying questions upfront. I wish this was the default for coding agents - force more clarifying questions, so that the agents don&#8217;t try to overcomplicate every feature.</p></li><li><p>The /office-hours skill pretty neat.</p></li><li><p>Gstack adds a lot of input tokens into the context window. Sometimes the features are a bit overkill for me, and I only use a handful of the skills.</p></li><li><p>Claude Design removes the need for a lot of the Gstack design skills.</p></li></ul></li><li><p>If I&#8217;m using local models, I&#8217;ve been using <a href="https://ollama.com/">Ollama</a> and mainly Qwen 3.5 9b and Gemma 4. I rarely use local open source models though because they&#8217;re too dumb for most of my use cases, and too slow running on my Macbook.</p></li></ul><h2>Is the code quality any good?</h2><p>As for the quality of the code actually generated, it&#8217;s not terrible. I still toss out a significant amount of code, and refactor frequently, but it&#8217;s all workable. I rarely if ever find myself editing code by hand, which is pretty different from one year ago, back when I was using Cursor.</p><p>It's still very much a work in progress and I fully anticipate changing things as the space evolves on a daily basis.</p>]]></content:encoded></item><item><title><![CDATA[The Multisensory SOC]]></title><description><![CDATA[Thoughts on humanness, AI, training, and gut-based detection]]></description><link>https://jonathanlooi.com/p/the-multisensory-soc</link><guid isPermaLink="false">https://jonathanlooi.com/p/the-multisensory-soc</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 11 Apr 2026 23:11:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Jibg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jibg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jibg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 424w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 848w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 1272w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jibg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png" width="1456" height="714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:714,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:216280,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/193926061?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Jibg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 424w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 848w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 1272w, https://substackcdn.com/image/fetch/$s_!Jibg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F141a9e61-4453-474c-8369-eda1397e36f2_1918x940.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Pew pew <a href="https://rud.is/pewpew/">map</a></figcaption></figure></div><p>On the Jane Street trading floor, every algorithm had its own sound. Walking the floor was said to be like being in an arcade, a cacophony of soundbites constantly going off, each corresponding with an issue that needed to be addressed. Traders didn&#8217;t just look at dashboards; they experienced rhythms and could identify when something was going wrong, not just from looking at a monitor, but by hearing it in real time.</p><p>I love a good pewpew map, even though they&#8217;re usually pretty useless and completely inaccurate representations of threats. But what if we applied the Jane Street concept more seriously to the SOC?</p><p>Imagine if every detection rule had its own sound. You would hear it every time it fired. (A badly tuned detection rule would immediately become unbearably annoying &#8211;&nbsp;a great motivator for reducing false positives.) An analyst would know their network was being attacked not by squinting at a Splunk dashboard, but by the specific sonic sequence of a kill chain unfolding in the room around them.&nbsp;</p><p>Consider if you could taste the bitterness of Kerberrosting, or hear the rhythm of SMB enumeration in progress. While this sounds absurd on the surface, I would posit that it is more absurd that we have compressed all threat detection into a 2D screen, ignoring all senses beyond sight, ignoring the full human nervous system&#8217;s analytical capabilities, and hampering our ability to develop intuition quickly.</p><p>A couple of years ago, I worked as a deckhand on the G&#246;theborg of Sweden, an exact wooden replica of an 18th-century East Indiaman tall ship. My time on the ship reminded me how many English phrases are maritime metaphors. Now, when someone says &#8220;all hands on deck&#8221;, I can physically feel myself awoken from my hammock and rushing to get on deck in the cold and wind to push a capstan along with 10 other crewmates, just to tack. I don&#8217;t conceptually just know the phrase. I know how it feels. Experience is a deeper level of understanding. With a multisensory SOC, an analyst&#8217;s understanding of an attack would go from conceptual to experiential. This is the same reason hospital monitors beep, and airplanes have stall horns.</p><p>I think a lot about what it means to be a good analyst and how we develop the next generation to be even greater. In the book Thinking, Fast and Slow, author Daniel Kahneman provides an anecdote about how the Israeli military conducted interviews. There would be checklists to follow, but the best interviewers would follow the list, then close their notebooks and stop, sensing how they felt in their gut. This combination of process and an educated gut was where they found the best judgments were made.</p><p>The AI native SOC is coming. Detection, triage, and most tier-one analysis will soon (if it hasn&#8217;t already) be fully automated by agents. If we don&#8217;t intentionally train the next generation of cybersecurity professionals, we&#8217;ll wake up in a decade wondering where all the mid-level talent went.&nbsp;</p><p>So how do we build up gut-level experience in the next generation of cybersecurity professionals? I believe it will be through building something like a Multisensory SOC. A system that unlocks the full human sensory analytical capacity and compresses the timeline for turning conceptual knowledge into experience.</p><p>As models continue to improve, meeting and exceeding human capabilities in cybersecurity (just look at Anthropic&#8217;s Mythos Preview), I increasingly believe the only moat for humans is to lean into being human. It&#8217;s our feelings, it&#8217;s our intuitions, it&#8217;s our gut, the things AI will (hopefully) never be able to replace.</p><p>&#8212;</p><p>I&#8217;m increasingly interested in people who are building things to unlock multisensory experiences, bringing about the physical manifestation of the digital. If you&#8217;re building in this space, I want to hear from you.</p><p>&#8212;</p><p>Footnotes:</p><ol><li><p>Shoutout to my friend Sam for originally giving me the idea about Jane Street. This post is inspired by his white boarding.</p></li><li><p>Going Infinite by Michael Lewis has a great recounting of the Jane Street trading floor</p></li><li><p>My Thinking, Fast and Slow anecdote is an extremely boiled-down summary. I highly recommend reading the book.</p></li><li><p>A sound-based network monitoring system was tested in 2000 by two researchers (Michael Gilfix &amp; Alva Couch) at Tufts University. They called it &#8220;Peep: The Network Auralizer&#8221;. It never got beyond the experimental phase.</p></li></ol><p></p>]]></content:encoded></item><item><title><![CDATA[[Forensics] Writing a .DS_Store file parser]]></title><description><![CDATA[Uncovering deleted filenames in the .DS_Store binary]]></description><link>https://jonathanlooi.com/p/forensics-writing-a-ds_store-file</link><guid isPermaLink="false">https://jonathanlooi.com/p/forensics-writing-a-ds_store-file</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 28 Mar 2026 20:10:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XQ7i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XQ7i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XQ7i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 424w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 848w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 1272w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png" width="1378" height="988" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:988,&quot;width&quot;:1378,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:372807,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/192452125?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c50da9c-0f7a-4b66-8f78-3925fff0ba51_1378x988.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XQ7i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 424w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 848w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 1272w, https://substackcdn.com/image/fetch/$s_!XQ7i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d361770-41c9-495b-b1cd-1abf59d985dd_1378x988.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Raw .DS_Store file</figcaption></figure></div><p>If you delete a file on macOS and empty the Trash, your Mac still remembers exactly what it was called and where it lived.</p><p>.DS_Store files are one of my favorite forensic artifacts. They're niche, kind of weird, and pack a surprising amount of forensically useful information.</p><p>To most of my software engineer friends, ".DS_Store" is just a line you put in your .gitignore. Under the hood, there's a lot more going on if you know what you're looking for!</p><p>Quick backgrounder: the .DS_Store (Desktop Services Store) file is a hidden binary that macOS Finder creates in every directory you open. It stores display preferences, icon positions, window size, view mode, sort order and uses a proprietary format and stores records in a B-tree.</p><p>Lots of awesome reverse engineering work was done over a decade ago on the file type by <a href="https://wiki.mozilla.org/DS_Store_File_Format">Mark Mentovai</a> and <a href="https://metacpan.org/dist/Mac-Finder-DSStore/view/DSStoreFormat.pod">Wim Lewis</a> and I wouldn't have understood how it works without first reading their posts.</p><h3>Why should forensic investigators care?</h3><ul><li><p>The .DS_Store file's existence proves someone browsed that folder in Finder </p></li><li><p>Filenames persist in .DS_Store even after the files are deleted until the system reboots (I still need to do a bit more testing on how long the deleted files last - it may depend on macOS version)</p></li><li><p>Trash put-back records store where trashed files originally came from, surviving even after the Trash is emptied</p></li><li><p>Timestamps and file sizes are recorded at the time Finder indexed them</p></li><li><p>If someone deletes a sensitive file and empties their Trash, the .DS_Store in ~/.Trash can still tell you what the file was called and exactly where it lived before deletion</p></li></ul><h3>Writing a .DS_Store parser</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i_XV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i_XV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 424w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 848w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 1272w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i_XV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png" width="1456" height="430" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:430,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306740,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/192452125?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i_XV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 424w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 848w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 1272w, https://substackcdn.com/image/fetch/$s_!i_XV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F509f8527-82ef-4b9f-b73a-d7ace1512bc8_2904x858.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Converted the binary into forensically useful information</figcaption></figure></div><p>Without being properly parsed, the .DS_Store file is pretty useless. I built &#8220;<a href="https://github.com/jonathanlooi/ds-store-parser">ds-store-parser</a>&#8221; (with help from Claude Code, of course!) to turn the .DS_Store binary into accessible and useful forensic information. </p><p>It's a Python CLI tool using only the standard library, Python 3.10+. It reads the raw binary, decodes the record types, and outputs clean CSV or JSON. One row per file, with human-readable columns for everything (while maintaining the raw data). I validated it against 368 real .DS_Store files from my MacBook.</p><p>Next time you push to GitHub, make sure you&#8217;re not adding a .DS_Store file! It is quietly leaking your directory structure and filenames to anyone who knows how to parse it.</p><p>Check out the parser on my Github: <a href="https://github.com/jonathanlooi/ds-store-parser">https://github.com/jonathanlooi/ds-store-parser</a></p>]]></content:encoded></item><item><title><![CDATA[[Forensics] Why your Mac (sort of) keeps a record of every file you've ever downloaded from the internet]]></title><description><![CDATA[Investigating the Quarantine Events V2 database]]></description><link>https://jonathanlooi.com/p/forensics-why-your-mac-sort-of-keeps</link><guid isPermaLink="false">https://jonathanlooi.com/p/forensics-why-your-mac-sort-of-keeps</guid><dc:creator><![CDATA[Jonathan Looi]]></dc:creator><pubDate>Sat, 28 Mar 2026 19:58:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_0Jv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_0Jv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_0Jv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 424w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 848w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 1272w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png" width="1456" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:334242,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/192447907?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_0Jv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 424w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 848w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 1272w, https://substackcdn.com/image/fetch/$s_!_0Jv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7329c413-0193-4054-8c6a-086bee25a60a_2294x1236.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">You can see that VirtualBox, Docker, Postman, and Burp Suite (portswigger) were the first files I downloaded when setting up my personal MacBook in 2022. Clearly I work in security. &#128513;&#128104;&#8205;&#128187;</figcaption></figure></div><p>Your Mac (sort of) keeps a record of every file you&#8217;ve downloaded from the internet.</p><p>It&#8217;s stored in a SQLite database called Quarantine Events V2 (located at ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2).</p><p>But why is macOS collecting all this information in the first place?</p><p>Mac uses this database to warn users before opening potentially malicious files downloaded from the internet. It&#8217;s the feature that gives you the notifications asking: &#8220;[downloaded app] is an app created by the app [source app]. Are you sure you want to open it?&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4MVs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4MVs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 424w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 848w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 1272w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4MVs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png" width="864" height="730" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:730,&quot;width&quot;:864,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1076676,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jonathanlooi.com/i/192447907?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4MVs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 424w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 848w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 1272w, https://substackcdn.com/image/fetch/$s_!4MVs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811f29af-f7bf-428b-ad8c-0a0d709c2bf3_864x730.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example warning from Gatekeeper</figcaption></figure></div><p>macOS has had a quarantine system since Leopard (10.5). Gatekeeper, the built-in security feature that verifies that a downloaded app is from an identified developer (code signing) and has been submitted to Apple for malware scanning (notarization), builds on top of this quarantine system. When a quarantine-aware app like Safari, Chrome, or Mail downloads a file, macOS stamps it with a com.apple.quarantine attribute and logs the event in the QuarantineEventsV2 database.</p><p>The database schema includes: a UUID, timestamp, agent name (downloading application), bundle identifier, download URL, origin URL (the referring page), sender name/address (for email attachments), and a type number.</p><p>Notably absent is the actual filename. There is no column for it. The UUID ties to the extended attribute on the file, but once the file is deleted, that link is broken. You cannot recover the filename from this database alone. In practice, many fields are frequently empty. I queried my own Mac and reliably got timestamps and agent names. Origin URLs were populated for some entries, absent for others. Sender fields were almost never populated. Also, keep in mind that timestamps use Cocoa epoch (seconds since Jan 1, 2001). Add 978307200 to convert to Unix epoch.</p><p>So what is QuarantineEventsV2 actually good for?</p><ul><li><p>Corroboration. Cross-reference quarantine timestamps with browser history, FSEvents, or Unified Logs to build a more complete timeline.</p></li><li><p>Agent name analysis. LSQuarantineAgentName reliably identifies the downloading application. AirDrop transfers show up as sharingd.</p></li><li><p>Persistence. macOS never cleans this database, even after files are deleted, Trash is emptied, and browser history is cleared.</p></li></ul><p>Since this is just a SQLite database, you don&#8217;t need a custom parser! And for forensic workflows at scale, <a href="https://docs.velociraptor.app/artifact_references/pages/macos.system.quarantineevents/">Velociraptor&#8217;s MacOS.System.QuarantineEvents artifact</a> and <a href="https://github.com/log2timeline/plaso/blob/main/plaso/parsers/sqlite_plugins/ls_quarantine.py">Plaso&#8217;s ls_quarantine plugin</a> already handle the parsing and timestamp conversion.</p><p>Try this on your own Mac:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;shell&quot;,&quot;nodeId&quot;:&quot;24dcc75b-a4be-4168-a035-d8fc4b9ff791&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-shell">sqlite3 -header -column ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 &#8220;SELECT datetime(LSQuarantineTimeStamp + 978307200, &#8216;unixepoch&#8217;) as download_time, LSQuarantineAgentName, LSQuarantineDataURLString FROM LSQuarantineEvent ORDER BY LSQuarantineTimeStamp DESC LIMIT 20"</code></pre></div>]]></content:encoded></item></channel></rss>