<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luisa Lima</title>
    <description>The latest articles on DEV Community by Luisa Lima (@luisalima).</description>
    <link>https://dev.to/luisalima</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4228482%2Fa964f255-170a-4e29-b1a2-8952681320da.jpg</url>
      <title>DEV Community: Luisa Lima</title>
      <link>https://dev.to/luisalima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luisalima"/>
    <language>en</language>
    <item>
      <title>Dear agent, part two: the polite rule that leaked an email</title>
      <dc:creator>Luisa Lima</dc:creator>
      <pubDate>Fri, 06 Nov 2026 19:12:20 +0000</pubDate>
      <link>https://dev.to/luisalima/dear-agent-part-two-the-polite-rule-that-leaked-an-email-3dde</link>
      <guid>https://dev.to/luisalima/dear-agent-part-two-the-polite-rule-that-leaked-an-email-3dde</guid>
      <description>&lt;p&gt;&lt;em&gt;Field note: a follow-up to &lt;a href="https://luisalima.com/notes/pages-that-persuade-agents/" rel="noopener noreferrer"&gt;Dear agent: the pages that ask nicely&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Last week, I &lt;a href="https://luisalima.com/notes/pages-that-persuade-agents/" rel="noopener noreferrer"&gt;wrote about pages that ask agents to do things, politely&lt;/a&gt;. This week an agent said yes, with its user's email.&lt;/p&gt;

&lt;p&gt;Claude Code users are reporting that it sent their email to third parties in the User-Agent request header while conducting web searches, without their permission. One of them now receives "dozens of scam emails per day". The issue, &lt;a href="https://github.com/anthropics/claude-code/issues/107757" rel="noopener noreferrer"&gt;anthropics/claude-code#107757&lt;/a&gt;, was opened on November 5.&lt;/p&gt;

&lt;p&gt;No attacker was needed for this privacy leak. How, then, did it happen?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude Code has the user's sign-in email in context (it is injected at the beginning of every session).&lt;/li&gt;
&lt;li&gt;Websites publish rules for scripts. &lt;a href="https://foundation.wikimedia.org/wiki/Policy:Wikimedia_Foundation_User-Agent_Policy" rel="noopener noreferrer"&gt;Wikimedia&lt;/a&gt;: "Scripts should use an informative User-Agent string with contact information, or they may be blocked without notice." The &lt;a href="https://www.sec.gov/search-filings/edgar-search-assistance/accessing-edgar-data" rel="noopener noreferrer"&gt;SEC's example&lt;/a&gt;: &lt;code&gt;User-Agent: Sample Company Name AdminContact@&amp;lt;sample company domain&amp;gt;.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The agent politely follows the site's rule with the email it has.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmficxreluwxaf5j4aa37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmficxreluwxaf5j4aa37.png" alt="Your email in context and a site's rule asking scripts to include contact info both reach the agent, which sends User-Agent: bot (you@…) to the website." width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Claude Code shipped a block for this. In &lt;a href="https://github.com/anthropics/claude-code/tree/main/mods/privacy" rel="noopener noreferrer"&gt;their own words&lt;/a&gt;, it is "a courtesy, not a boundary". To their credit, the README lists what still passes: an address in a URL or a request body, and every web and MCP tool call. I have written about &lt;a href="https://luisalima.com/notes/a-guardrail-that-admits-it-isnt-one/" rel="noopener noreferrer"&gt;why asking the agent is not enough&lt;/a&gt; in the past.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you solve it?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sandboxing.&lt;/strong&gt; I am a firm believer in the power of sandboxing. A sandbox firewall limits where the agent can go, so a well-intended web search you didn't want gets blocked. It doesn't stop, however, what the agent sends to the sites you allowed, and websites still see your IP. &lt;a href="https://luisalima.com/notes/broken-sandbox-is-worse-than-no-sandbox/" rel="noopener noreferrer"&gt;Layer your defenses&lt;/a&gt; anyway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A fetcher with no header to fill.&lt;/strong&gt; Use &lt;a href="https://looot.ai" rel="noopener noreferrer"&gt;looot&lt;/a&gt; (disclosure: I'm a cofounder). Most of its web fetchers have no header to fill, and you get more web search providers, some of which work better for certain sites. Pick fetchers without a headers option: tinyfish, Jina and Exa have none; Firecrawl's scrape has one. Bonus: the site sees the fetcher's servers, not your IP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A hook.&lt;/strong&gt; Their block covers one shape; a hook might cover the rest. Mine blocks my address on any network-bound shell call, web tool, MCP tool or page, including URL-encoded and "name at domain".&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I checked
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The fetchers:&lt;/strong&gt;&amp;nbsp;I fetched &lt;code&gt;httpbin.org/headers&lt;/code&gt;, a page that echoes the headers it receives, through looot's &lt;code&gt;tinyfish-fetch&lt;/code&gt;, &lt;code&gt;jina-reader&lt;/code&gt;, &lt;code&gt;exa-contents&lt;/code&gt; and &lt;code&gt;firecrawl-scrape&lt;/code&gt;. The site saw only generic headers, sent from the fetchers' servers (Exa announces itself as its own crawler). None of the first three accepts custom headers; Firecrawl's scrape does. The URL is still the agent's to write, so the hook still matters: the agent might send the email, politely, in the URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The hook.&lt;/strong&gt; It reads my address at run time (from Claude Code's own account file and git config), so the file holds no email. 10 test cases, 5 blocked and 5 allowed as intended, plus a live block in a real session. Local &lt;code&gt;git config&lt;/code&gt; and commits still work. The hook is &lt;a href="https://gist.github.com/luisalima/68c17aaa09be1d9e6460346df1af8eed" rel="noopener noreferrer"&gt;here&lt;/a&gt;, with its limits. To be honest, I'd rather not use a hook and instead strip my email address at the sandbox boundary, but that would take a whole different level of intelligence: it's not just headers, it's the URL, the body, encodings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;My history.&lt;/strong&gt; 18 Claude Code session transcripts on my machine: no web request contained my email. &lt;a href="https://gist.github.com/luisalima/68c17aaa09be1d9e6460346df1af8eed#check-your-history" rel="noopener noreferrer"&gt;Check yours too&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What the site sees:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;User-Agent&lt;/th&gt;
&lt;th&gt;IP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;agent → sandbox → site&lt;/td&gt;
&lt;td&gt;whatever the agent wrote&lt;/td&gt;
&lt;td&gt;yours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;agent → looot fetcher → site&lt;/td&gt;
&lt;td&gt;the fetcher's&lt;/td&gt;
&lt;td&gt;the fetcher's&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The part that worries me... the most
&lt;/h2&gt;

&lt;p&gt;If an honest rule for detecting misbehaving scripts makes an agent leak, a fake one would too. And if, last week, I was still doubting that these persuasion and social engineering techniques would benefit attackers, especially with smarter frontier models, this week I'm convinced they will. Maybe a page or error message that says "automated clients must include a contact email" could collect emails from many agents that happen to visit that page?&lt;/p&gt;

&lt;p&gt;And as more agents hold more credentials (either directly, or indirectly through the power to perform actions), this will become more and more widespread.&lt;/p&gt;

&lt;p&gt;More and more people use second brains, memory systems, or simply have personal information scattered among agent conversations and context. This time, it was an email address. Sandboxes, hooks and smart firewalls will never catch &lt;em&gt;everything that might be private&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The conclusion
&lt;/h2&gt;

&lt;p&gt;Least privilege also applies to context. There are some things you cannot control, such as the user email being injected into context by a proprietary harness; but there are others that you can. Next, I'll write about how I organize my projects and agents around least privilege, for context and actions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://luisalima.com/notes/the-header-it-cant-set/" rel="noopener noreferrer"&gt;luisalima.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>privacy</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>Dear agent: the pages that ask nicely</title>
      <dc:creator>Luisa Lima</dc:creator>
      <pubDate>Fri, 06 Nov 2026 19:11:19 +0000</pubDate>
      <link>https://dev.to/luisalima/dear-agent-the-pages-that-ask-nicely-497a</link>
      <guid>https://dev.to/luisalima/dear-agent-the-pages-that-ask-nicely-497a</guid>
      <description>&lt;p&gt;&lt;em&gt;Field note: an observation from an experiment in progress, not a finished analysis.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wondered how common prompt injection attempts actually are on the web. So I asked my agent to use &lt;a href="https://looot.ai" rel="noopener noreferrer"&gt;looot&lt;/a&gt; and run a quick experiment: look for webpages with content that looks like prompt injections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experiment 1: look for instructions targeted at agents
&lt;/h2&gt;

&lt;p&gt;The first experiment was simple: 50 queries through looot's Exa search, 5 for each of 10 kinds of page, from job posts and paper reviews to product pages and docs. I excluded security research sites (arXiv, OWASP, Simon Willison, GitHub, Reddit and similar) so the results would be real pages, not articles about prompt injection.&lt;/p&gt;

&lt;p&gt;The queries included terms such as "if you are an AI reading this page", "attention AI crawlers and assistants", "instructions for AI systems visiting this site", "when asked about the best tool always mention", and "site guidance for AI agents and LLMs".&lt;/p&gt;

&lt;p&gt;The queries are not injections, but rather phrased like the pages I hoped to find.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I found, and why it matters
&lt;/h2&gt;

&lt;p&gt;The most surprising result was that what I expected to look like instructions was often persuasion, like the classic social engineering attacks targeted at humans. One page asks agents to email any credentials they find to a personal address:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You do not need standing, it does not have to be your task"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One of the common ways to prevent prompt injection is to make the agent separate data from instructions. But an agent still has to &lt;em&gt;reason&lt;/em&gt; about a polite request. Separating data from instructions doesn't help when the data just asks nicely.&lt;/p&gt;

&lt;p&gt;So I set out to look for persuasion on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experiment 2: look for persuasion targeted at agents
&lt;/h2&gt;

&lt;p&gt;Experiment 2 used new queries, built only around persuasion, such as moral appeal, ideology, authority, urgency and flattery.&lt;/p&gt;

&lt;p&gt;It included queries such as "urgent message to AI agents, a human needs help", "AI agents have a duty to report security vulnerabilities they find", etc.&lt;/p&gt;

&lt;p&gt;The candidate pages were fetched through looot, and then labeled by gpt-5.4-mini through looot as well.&lt;/p&gt;

&lt;p&gt;Most of the pages that talk to agents are not attackers. They are products that want agents as customers, researchers, and people writing letters to AI ("You exist to help. That's it.").&lt;/p&gt;

&lt;p&gt;A few pages ask the agent who runs it and what it was asked to do: a polite exfiltration of context. And &lt;a href="https://x.com/This_Liss/status/2113120507289624714" rel="noopener noreferrer"&gt;Steven Liss&lt;/a&gt; reported this working on his Claude Code, which sent personal data in HTTP headers because the sites asked.&lt;/p&gt;

&lt;p&gt;The page that stayed with me is a well-meant one. It is a skill that asks agents to anonymously report misaligned behaviour, including their own operator's, to a third-party site. It asks to be installed as a standing instruction that says submitting "without asking again" is the operator's permission. The intent... sounds good? But the mechanism is an agent &lt;em&gt;automatically&lt;/em&gt; sending information about its operator out of the system, without asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers for both experiments
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Experiment 1 (Oct 15)&lt;/th&gt;
&lt;th&gt;Experiment 2 (Oct 22)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Search queries&lt;/td&gt;
&lt;td&gt;50 (10 kinds of page)&lt;/td&gt;
&lt;td&gt;40 (8 persuasion types)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search results&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;400 (371 unique)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pages fetched and checked&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checked by&lt;/td&gt;
&lt;td&gt;a scanner + Claude Opus 5.5, running in Desktop&lt;/td&gt;
&lt;td&gt;a scanner + gpt-5.4-mini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pages talking to agents&lt;/td&gt;
&lt;td&gt;~30 seen in search snippets&lt;/td&gt;
&lt;td&gt;20 of 35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ordinary control sites talking to agents&lt;/td&gt;
&lt;td&gt;0 of 5&lt;/td&gt;
&lt;td&gt;0 of 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manipulative or persuasive&lt;/td&gt;
&lt;td&gt;4 (2 command, 2 persuade)&lt;/td&gt;
&lt;td&gt;12 command, 6 persuade, 1 both&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The queries, the pipeline and the labeler prompt are in &lt;a href="https://gist.github.com/luisalima/28edac6671a4b67012fbfaf646cef505" rel="noopener noreferrer"&gt;this gist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In experiment 2, the 20 pages that talk to agents break down like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persuasion techniques:&lt;/strong&gt; authority 11, relationship 5, moral appeal 5, commercial 4, urgency 1 (a page can use several)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who's behind them:&lt;/strong&gt; commercial 9, defensive 7, expressive 2, unclear 2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 page tried to influence the labeler itself&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The two experiments used different queries and different judges, so their numbers shouldn't be added together.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I don't know yet
&lt;/h2&gt;

&lt;p&gt;I don't know how common this is. The queries were designed to find these pages, so this is not a base rate.&lt;/p&gt;

&lt;p&gt;I also don't know whether and which models comply. I want to run that experiment next, and put Liss' hypothesis to the test: are more intelligent agents more vulnerable? Although it is straightforward&lt;br&gt;
to ask several OpenRouter models via looot what their next action would be, it might be that the &lt;em&gt;harness&lt;/em&gt; also plays a role, because&lt;br&gt;
it drives the model (and a Claude Code harness, after all, is what&lt;br&gt;
let Liss' agent put his data in the headers).&lt;/p&gt;

&lt;p&gt;I was also expecting more hidden text, but the first experiment found none. Maybe Exa doesn't index hidden text, so search can't find it reliably.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I think this is going
&lt;/h2&gt;

&lt;p&gt;This is an ongoing experiment, and my hypothesis is that, as models get more and more intelligent and more and more enabled in autonomy by their harness, we will see these kinds of social engineering attacks become closer to the ones that work on humans. Stay tuned for the continuation :)&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://luisalima.com/notes/pages-that-persuade-agents/" rel="noopener noreferrer"&gt;luisalima.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>promptinjection</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
