<?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: impactaky</title>
    <description>The latest articles on DEV Community by impactaky (@taki4416).</description>
    <link>https://dev.to/taki4416</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1337725%2F1d7fbf2a-30ca-44fe-9f73-88e3e11ac878.jpg</url>
      <title>DEV Community: impactaky</title>
      <link>https://dev.to/taki4416</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/taki4416"/>
    <language>en</language>
    <item>
      <title>A Deny Read Bug in Claude Code's Bubblewrap Sandbox</title>
      <dc:creator>impactaky</dc:creator>
      <pubDate>Wed, 11 Mar 2026 13:15:27 +0000</pubDate>
      <link>https://dev.to/taki4416/a-deny-read-bug-in-claude-codes-bubblewrap-sandbox-320i</link>
      <guid>https://dev.to/taki4416/a-deny-read-bug-in-claude-codes-bubblewrap-sandbox-320i</guid>
      <description>&lt;p&gt;While using the sandbox behavior of Claude Code on Linux, I discovered a bug where &lt;strong&gt;&lt;code&gt;deny read&lt;/code&gt; rules did not work correctly in environments using Bubblewrap&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I tested and reported the issue to Anthropic, and it has now been fixed.&lt;br&gt;&lt;br&gt;
The fix is included in &lt;strong&gt;Claude Code 2.1.40 and later&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why sandbox is required for Claude Code's &lt;code&gt;deny&lt;/code&gt; rules
&lt;/h2&gt;

&lt;p&gt;Sometimes users report that Claude ignores instructions like &lt;em&gt;“do not read this file.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;However, these restrictions should not rely on prompts alone.&lt;br&gt;&lt;br&gt;
Access control must be enforced by the &lt;strong&gt;runtime harness configuration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Claude Code provides a &lt;code&gt;permissions.deny&lt;/code&gt; mechanism to block access to specific files.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deny read: ~/.ssh/**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, for these rules to work reliably, &lt;strong&gt;sandboxing must be enabled&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Without sandboxing, &lt;code&gt;Read&lt;/code&gt; is blocked by ClaudeCode, but &lt;strong&gt;&lt;code&gt;Bash&lt;/code&gt; cannot be prevented&lt;/strong&gt;.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F7j5869kpdc1vxeabad7i.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.amazonaws.com%2Fuploads%2Farticles%2F7j5869kpdc1vxeabad7i.png" alt=" " width="640" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another common mistake is enabling &lt;strong&gt;&lt;code&gt;dangerously-skip-permissions&lt;/code&gt;&lt;/strong&gt; together with sandboxing.&lt;br&gt;&lt;br&gt;
When this option is enabled, commands that disable the sandbox may be automatically approved, effectively bypassing the sandbox.&lt;/p&gt;

&lt;p&gt;The recommended setup is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run Claude Code in an isolated environment if possible&lt;/li&gt;
&lt;li&gt;Enable sandbox using &lt;code&gt;/sandbox&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Do &lt;strong&gt;not&lt;/strong&gt; enable &lt;code&gt;dangerously-skip-permissions&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  The issue
&lt;/h2&gt;

&lt;p&gt;While testing sandbox behavior, I found that certain &lt;code&gt;deny&lt;/code&gt; rules were &lt;strong&gt;not enforced correctly on Linux&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Specifically, rules that included wildcard patterns such as &lt;code&gt;*&lt;/code&gt; allowed file access through Bash under certain conditions.&lt;/p&gt;

&lt;p&gt;This pattern appears in the official documentation, so it is something users should be aware of.&lt;/p&gt;

&lt;p&gt;Example configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./.env)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./.env.*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./secrets/**)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./config/credentials.json)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./build)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Documentation reference:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.claude.com/docs/en/settings#excluding-sensitive-files" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/settings#excluding-sensitive-files&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Root cause
&lt;/h2&gt;

&lt;p&gt;Claude Code’s Linux sandbox uses &lt;strong&gt;Bubblewrap&lt;/strong&gt; to enforce filesystem restrictions.&lt;/p&gt;

&lt;p&gt;One mechanism used by Bubblewrap is to &lt;strong&gt;mount &lt;code&gt;/dev/null&lt;/code&gt; over paths that should be unreadable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;However, the implementation did not correctly handle paths that contained wildcard patterns such as &lt;code&gt;*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As a result, the deny rule was not properly enforced in some cases, allowing file access through Bash commands.&lt;/p&gt;

&lt;p&gt;This issue has now been fixed in &lt;strong&gt;Claude Code 2.1.40&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Sandboxing is an important safety mechanism when using AI coding agents.&lt;/p&gt;

&lt;p&gt;This issue was discovered while evaluating the sandbox behavior of Claude Code.&lt;br&gt;&lt;br&gt;
It has now been fixed, so users should &lt;strong&gt;upgrade to the latest version&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Supporting independent security research
&lt;/h2&gt;

&lt;p&gt;This investigation was conducted using my own time and Claude Code tokens.&lt;/p&gt;

&lt;p&gt;I paused my regular work to investigate and debug this issue. Even when a report is accepted, the overall effort can still be financially negative. Submitting vulnerability reports also does not guarantee that they will be accepted or recognized as valid issues.&lt;/p&gt;

&lt;p&gt;If you found this research useful and would like to support further work like this, please consider supporting me:&lt;/p&gt;

&lt;p&gt;☕ &lt;a href="https://ko-fi.com/impactaky" rel="noopener noreferrer"&gt;https://ko-fi.com/impactaky&lt;/a&gt;&lt;br&gt;&lt;br&gt;
⭐ &lt;a href="https://github.com/sponsors/impactaky" rel="noopener noreferrer"&gt;https://github.com/sponsors/impactaky&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>linux</category>
      <category>security</category>
    </item>
    <item>
      <title>Why Agent Skills Aren't Called automatically: An Anti-Pattern in Agent Skill</title>
      <dc:creator>impactaky</dc:creator>
      <pubDate>Mon, 16 Feb 2026 15:19:51 +0000</pubDate>
      <link>https://dev.to/taki4416/why-agent-skills-arent-called-automatically-an-anti-pattern-in-agent-skill-88g</link>
      <guid>https://dev.to/taki4416/why-agent-skills-arent-called-automatically-an-anti-pattern-in-agent-skill-88g</guid>
      <description>&lt;h2&gt;
  
  
  Reasons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A single context can legitimately map to multiple skills&lt;/li&gt;
&lt;li&gt;Spec-driven planning does not reason over the available skill space&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Source Code Used in the Experiment
&lt;/h2&gt;

&lt;p&gt;To reproduce the behavior, I used a minimal repository containing only two skills.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lint&lt;/li&gt;
&lt;li&gt;planner&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A single context can legitimately map to multiple skills
&lt;/h2&gt;

&lt;p&gt;I wanted to create a plan, so I input &lt;strong&gt;"Create a plan to lint."&lt;/strong&gt;. However, this directly triggered the &lt;code&gt;/lint&lt;/code&gt; skill.&lt;/p&gt;

&lt;p&gt;This happened even though the planner skill description explicitly says:&lt;br&gt;
&lt;strong&gt;“Use when the user says things like ‘create a plan’.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In practice, explicitly calling &lt;code&gt;/planner&lt;/code&gt; turns out to be far more reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spec-driven planning does not reason over the available skill space
&lt;/h2&gt;

&lt;p&gt;When I input &lt;code&gt;/planner&lt;/code&gt; lint, the planner sometimes discovers &lt;code&gt;skills/lint/SKILL.md&lt;/code&gt; and incorporates it into the plan. However, this behavior is &lt;strong&gt;not guaranteed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem becomes more obvious with inputs like:&lt;br&gt;
&lt;code&gt;/planner&lt;/code&gt; lint src directory&lt;/p&gt;

&lt;p&gt;In this case, the planner restricts its file exploration to the src directory.&lt;br&gt;
As a result, it does not discover other skills.&lt;/p&gt;

&lt;p&gt;The planner then reasons about how to lint in general and produces a plan that &lt;strong&gt;ignores the lint skill’s defined procedure entirely&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  I stopped using skills implicitly
&lt;/h2&gt;

&lt;p&gt;When I asked Claude to fix the planner so that it considers available skills, it actually worked.&lt;/p&gt;

&lt;p&gt;However, I was using a get-shit-done style workflow, where the system assumes that everything belongs in .planning.&lt;/p&gt;

&lt;p&gt;At that point, I realized the core issue:&lt;/p&gt;

&lt;p&gt;I should not be using skills to encode project-specific behavior.&lt;br&gt;
Those behaviors belong in the spec, not in skills.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>skills</category>
      <category>coding</category>
    </item>
    <item>
      <title>mise moved mypath:$PATH to $PATH:mypath</title>
      <dc:creator>impactaky</dc:creator>
      <pubDate>Tue, 10 Feb 2026 14:28:03 +0000</pubDate>
      <link>https://dev.to/taki4416/mise-moved-mypathpath-to-pathmypath-4226</link>
      <guid>https://dev.to/taki4416/mise-moved-mypathpath-to-pathmypath-4226</guid>
      <description>&lt;h2&gt;
  
  
  What happened
&lt;/h2&gt;

&lt;p&gt;mise save user added environment variables to &lt;code&gt;$__MISE_ORIG_PATH&lt;/code&gt; when do mise setup.&lt;br&gt;
mise check environment variables every time it is called, and if there is environment variables it isn't contained in &lt;code&gt;$__MISE_ORIG_PATH&lt;/code&gt;, it move variable to last of $PATH.&lt;br&gt;
e.g. &lt;code&gt;path:uncontained:others&lt;/code&gt; -&amp;gt; &lt;code&gt;path:others:uncontained&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And I'm using tmux, my setting inherit environment variable from parent tmux server.&lt;/p&gt;

&lt;p&gt;Even I update my rc setting, &lt;code&gt;$__MISE_ORIG_PATH&lt;/code&gt; was fixed to old environment variable.&lt;br&gt;
It doesn't overwrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I had to do
&lt;/h2&gt;

&lt;p&gt;So I had to relaunch tmux.&lt;/p&gt;

</description>
      <category>mise</category>
      <category>memo</category>
    </item>
  </channel>
</rss>
