{"id":33256,"date":"2026-06-26T09:51:39","date_gmt":"2026-06-26T13:51:39","guid":{"rendered":"https:\/\/www.uvm.edu\/it\/kb\/?post_type=ht_kb&#038;p=33256"},"modified":"2026-08-31T16:47:35","modified_gmt":"2026-08-31T20:47:35","slug":"claude-code-permissions-sandboxing","status":"publish","type":"ht_kb","link":"https:\/\/www.uvm.edu\/it\/kb\/article\/claude-code-permissions-sandboxing\/","title":{"rendered":"Claude Code Permissions &#038; Sandboxing"},"content":{"rendered":"    \t\t<div class=\"hts-messages hts-messages--info  hts-messages--withtitle hts-messages--withicon \"   >\r\n    \t\t\t<span class=\"hts-messages__title\">Early Release Content<\/span>    \t\t\t    \t\t\t\t<p>\r\n    \t\t\t\t\tThis is an early release of this KB article and content is subject to change. Please refer back to this article occasionally for updated guidance.    \t\t\t\t<\/p>\r\n    \t\t\t    \t\t\t\r\n    \t\t<\/div><!-- \/.ht-shortcodes-messages -->\r\n    \t\t\n<p><strong>Why do we need permissions and sandboxing?<\/strong><br \/>\n<a href=\"https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/claudecode-color.png\" rel=\"lightbox-0\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-33273\" src=\"https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/claudecode-color-300x300.png\" alt=\"\" width=\"132\" height=\"132\" srcset=\"https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/claudecode-color-300x300.png 300w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/claudecode-color-150x150.png 150w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/claudecode-color-50x50.png 50w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/claudecode-color-60x60.png 60w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/claudecode-color-100x100.png 100w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/claudecode-color.png 640w\" sizes=\"auto, (max-width: 132px) 100vw, 132px\" \/><\/a>Out of the box, Claude Code has no file restrictions configured, so once you approve a prompt or it runs a shell command it can reach sensitive files such as <a href=\"https:\/\/go.uvm.edu\/data-classification\">protected University data<\/a> stored on your computer or authentication keys. <a href=\"https:\/\/code.claude.com\/docs\/en\/permissions\">Permission rules<\/a> and the <a href=\"https:\/\/code.claude.com\/docs\/en\/sandboxing\">sandbox<\/a> help keep unapproved data from being read and sent off the machine, or files from being changed or deleted.<\/p>\n    \t\t<div class=\"hts-messages hts-messages--alert  hts-messages--withtitle hts-messages--withicon \"   >\r\n    \t\t\t<span class=\"hts-messages__title\">IMPORTANT<\/span>    \t\t\t    \t\t\t\t<p>\r\n    \t\t\t\t\t<\/p>\n<p>The most common mistake is assuming the built-in sandbox restricts everything Claude reads.<strong> It does not<\/strong>, so it is worth understanding each layer before you rely on it as a boundary.<\/p>\n<p>    \t\t\t\t<\/p>\r\n    \t\t\t    \t\t\t\r\n    \t\t<\/div><!-- \/.ht-shortcodes-messages -->\r\n    \t\t\n<p>If you just want a sensible starting point to copy, see the\u00a0<a href=\"https:\/\/www.uvm.edu\/it\/kb\/article\/claude-sandbox-example\/\">example Claude Code sandbox configuration<\/a>, which provides a\u00a0<code>settings.json<\/code>\u00a0with permission rules and sandbox settings already filled in.<\/p>\n<h2>How Claude Code reaches your filesystem<\/h2>\n<p>Agentic AI platforms like Claude use &#8220;tools&#8221; to give models different abilities. A &#8220;tool&#8221; is a specific action the model is allowed to perform on your system, such as reading a file, editing one, or running a terminal command. The model does not touch your machine directly; it requests a tool, and that tool carries out the action, which is exactly why the controls below matter.<\/p>\n<p>There are <strong>two paths<\/strong> to your files. The first is the set of built-in file tools: Read, Edit, Write, Grep, and Glob, which run inside the Claude Code process. The second is the Bash tool and the child processes it spawns, such as\u00a0<code>cat<\/code>,\u00a0<code>python<\/code>,\u00a0<code>npm<\/code>, <code>git<\/code>, etc.<\/p>\n<p>Each path is governed at a different layer.<\/p>\n<ul>\n<li>The built-in file tools are governed by <a href=\"https:\/\/code.claude.com\/docs\/en\/permissions\">permission rules<\/a> inside the application.<\/li>\n<li>The Bash tool and its child processes are governed by the <a href=\"https:\/\/code.claude.com\/docs\/en\/sandboxing\">operating system sandbox<\/a>.<\/li>\n<\/ul>\n<p>Both paths ultimately reach the same files, including secrets and other potentially <a href=\"https:\/\/go.uvm.edu\/data-classification\">sensitive or protected data.<\/a> A control that covers one path does not automatically cover the other.<\/p>\n<h3>Permission rules (application layer)<\/h3>\n<p><a href=\"https:\/\/code.claude.com\/docs\/en\/permissions\">Permission rules<\/a> govern the built-in Read, Edit, Write, Grep, and Glob tools. They also gate every other tool, including Bash, WebFetch, and MCP, before it runs. Rules use allow, ask, and deny lists with\u00a0<code>Read()<\/code>\u00a0and\u00a0<code>Edit()<\/code>\u00a0path syntax, and they are evaluated in the order deny, then ask, then allow.<\/p>\n<p>Permission rules are enforced inside the Claude Code process, before the tool runs. A managed deny is absolute, which means users cannot re-allow it. Use a permission deny for any path Claude should never touch.<\/p>\n<h3>The built-in OS sandbox (Bash and its child processes)<\/h3>\n<p>The built-in <a href=\"https:\/\/code.claude.com\/docs\/en\/sandboxing\">sandbox<\/a> governs Bash commands and all of their child processes, such as\u00a0<code>cat<\/code>,\u00a0<code>python<\/code>,\u00a0<code>npm<\/code>, <code>git<\/code>, etc. <strong>It does not govern the built-in Read tool<\/strong>. It is enforced by the operating system kernel, and the restriction holds regardless of what the command tries to do. The built-in sandbox runs on macOS, Linux, and WSL2; it is not available on native Windows.<\/p>\n<p><a href=\"https:\/\/code.claude.com\/docs\/en\/settings#sandbox-settings\">Sandbox filesystem rules<\/a> (<code>denyRead<\/code>,\u00a0<code>allowRead<\/code>,\u00a0<code>denyWrite<\/code>,\u00a0<code>allowWrite<\/code>) merge across scopes, and\u00a0<code>allowRead<\/code>\u00a0beats\u00a0<code>denyRead<\/code>.<\/p>\n<h3>Which control covers what<br \/>\n<a href=\"https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM.png\" rel=\"lightbox-1\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-33263\" src=\"https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM.png\" alt=\"\" width=\"566\" height=\"366\" srcset=\"https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM.png 1234w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM-300x194.png 300w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM-1024x662.png 1024w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM-768x497.png 768w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM-50x32.png 50w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM-60x39.png 60w, https:\/\/www.uvm.edu\/it\/kb\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-24-at-10.16.01-AM-100x65.png 100w\" sizes=\"auto, (max-width: 566px) 100vw, 566px\" \/><\/a><\/h3>\n<table>\n<thead>\n<tr>\n<th>Control<\/th>\n<th>What it governs<\/th>\n<th>How it is enforced<\/th>\n<th>Can users override it?<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Permission rules <code>allow,<\/code><code>ask,<\/code><code>deny<\/code>, <code>(Read()<\/code> \u00a0<code>Edit()<\/code>)<\/td>\n<td>The built-in Read, Edit, Write, Grep, and Glob tools. Permission rules also gate every other tool, including Bash, WebFetch, and MCP, before it runs.<\/td>\n<td>Inside the Claude Code process, evaluated before the tool runs.<\/td>\n<td>A managed deny is absolute. Users cannot re-allow it. Use it for paths Claude should never touch.<\/td>\n<\/tr>\n<tr>\n<td>Sandbox filesystem <code>denyRead,<\/code><code><\/code><code>allowRead,<\/code><code><\/code><code><\/code><code>denyWrite,<\/code><code><\/code><code>allowWrite<\/code><\/td>\n<td>Bash commands and all their child processes (<code>cat<\/code>,\u00a0<code>python<\/code>,\u00a0<code>npm<\/code>,\u00a0<code>git<\/code>). It does not govern the built-in Read tool.<\/td>\n<td>By the operating system kernel: . The boundary holds regardless of what the command does.<\/td>\n<td>Rules merge across scopes and <code>allowRead<\/code>\u00a0beats\u00a0<code>denyRead<\/code>, so users can widen access<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Additional documentation<\/h2>\n<ul>\n<li>Sandboxing reference:\u00a0<a href=\"https:\/\/code.claude.com\/docs\/en\/sandboxing\">code.claude.com\/docs\/en\/sandboxing<\/a>.<\/li>\n<li>Permissions reference:\u00a0<a href=\"https:\/\/code.claude.com\/docs\/en\/permissions\">code.claude.com\/docs\/en\/permissions<\/a>. Covers Read and Edit rules<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Why do we need permissions and sandboxing? Out of the box, Claude Code has no file restrictions configured, so once you approve a prompt or it runs a shell command it can reach sensitive files such as protected University data stored on your computer or authentication keys. Permission rules and&#8230;<\/p>\n","protected":false},"author":41,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_monsterinsights_skip_tracking":false,"footnotes":""},"ht-kb-category":[662],"ht-kb-tag":[],"class_list":["post-33256","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-ai"],"_links":{"self":[{"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/ht-kb\/33256","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/ht-kb"}],"about":[{"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/comments?post=33256"}],"version-history":[{"count":31,"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/ht-kb\/33256\/revisions"}],"predecessor-version":[{"id":33560,"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/ht-kb\/33256\/revisions\/33560"}],"wp:attachment":[{"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/media?parent=33256"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/ht-kb-category?post=33256"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/www.uvm.edu\/it\/kb\/wp-json\/wp\/v2\/ht-kb-tag?post=33256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}