Prevent xmd run filesystem operations from escaping the working directory #227

Description

@taras

Story

As an XMD user, I want a filesystem operation to remain inside its authorized
root even when another process replaces a directory or symbolic link during the
operation.

Example attack

Suppose a document is allowed to write only inside /project/output:

  1. XMD checks that /project/output/report.txt is inside the allowed root.
  2. Before XMD opens the file, another process replaces output with a symbolic
    link to a directory outside /project.
  3. A vulnerable implementation follows the replacement and writes outside the
    authorized root.

Checking a path and using it as two separate filesystem actions creates this
race. The authorization must still hold when the operating system performs the
access.

Required guarantee

The guarantee differs by filesystem provider and must be stated honestly.

xmd workflow

Workflow file effects address logical paths inside the provider-owned DOFS
Workspace. Every operation is authorized against that logical namespace. It
does not validate a host path and then perform an unguarded host-filesystem
operation, so replacing a host symbolic link cannot redirect the access.

xmd run

The host-filesystem provider must prevent a path replacement between
authorization and access for every supported Deno, Node, Bun, and compiled
runtime adapter. The implementation must use a mechanism whose guarantee holds
at access time, not another pre-access path check.

If a runtime or platform cannot provide the strong guarantee, XMD must either
refuse the affected operation or document the narrower supported boundary. It
must not present a weaker implementation as equivalent protection.

Agent read-only materialization belongs to #302. Its containment does not prove
that ordinary xmd run filesystem effects close this race.

Acceptance

  • Architecture and the executable-MDX threat model explain the attack in
    user-recognizable terms and distinguish Workflow from host-filesystem
    protection.
  • A Workflow operation cannot escape through host path replacement because its
    authoritative namespace is provider-owned.
  • The selected host mechanism and exact guarantee are recorded for Deno, Node,
    Bun, and the compiled binary on each supported platform.
  • A runtime that cannot enforce the guarantee refuses the operation or clearly
    states its narrower boundary.
  • Deterministic tests pause between authorization and access, replace the path,
    and prove that every supported host implementation refuses or remains inside
    the root.
  • Negative controls demonstrate that the same replacement escapes a deliberately
    vulnerable validate-then-open implementation.
  • Runtime adapters install the mechanism through contextual APIs; shared
    production modules do not detect the active runtime.

Security boundary

This issue prevents filesystem effects from escaping their authorized root by a
concurrent path replacement. It does not provide:

  • Agent-generated XMD or Agent-provider sandboxing;
  • native command containment;
  • changes to <File> authoring forms; or
  • a guarantee about operating-system facilities outside the selected
    filesystem provider.

Related work

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    securitySecurity hardening

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
      Skip to content

      Prevent xmd run filesystem operations from escaping the working directory #227

      Description

      @taras

      Story

      As an XMD user, I want a filesystem operation to remain inside its authorized
      root even when another process replaces a directory or symbolic link during the
      operation.

      Example attack

      Suppose a document is allowed to write only inside /project/output:

      1. XMD checks that /project/output/report.txt is inside the allowed root.
      2. Before XMD opens the file, another process replaces output with a symbolic
        link to a directory outside /project.
      3. A vulnerable implementation follows the replacement and writes outside the
        authorized root.

      Checking a path and using it as two separate filesystem actions creates this
      race. The authorization must still hold when the operating system performs the
      access.

      Required guarantee

      The guarantee differs by filesystem provider and must be stated honestly.

      xmd workflow

      Workflow file effects address logical paths inside the provider-owned DOFS
      Workspace. Every operation is authorized against that logical namespace. It
      does not validate a host path and then perform an unguarded host-filesystem
      operation, so replacing a host symbolic link cannot redirect the access.

      xmd run

      The host-filesystem provider must prevent a path replacement between
      authorization and access for every supported Deno, Node, Bun, and compiled
      runtime adapter. The implementation must use a mechanism whose guarantee holds
      at access time, not another pre-access path check.

      If a runtime or platform cannot provide the strong guarantee, XMD must either
      refuse the affected operation or document the narrower supported boundary. It
      must not present a weaker implementation as equivalent protection.

      Agent read-only materialization belongs to #302. Its containment does not prove
      that ordinary xmd run filesystem effects close this race.

      Acceptance

      • Architecture and the executable-MDX threat model explain the attack in
        user-recognizable terms and distinguish Workflow from host-filesystem
        protection.
      • A Workflow operation cannot escape through host path replacement because its
        authoritative namespace is provider-owned.
      • The selected host mechanism and exact guarantee are recorded for Deno, Node,
        Bun, and the compiled binary on each supported platform.
      • A runtime that cannot enforce the guarantee refuses the operation or clearly
        states its narrower boundary.
      • Deterministic tests pause between authorization and access, replace the path,
        and prove that every supported host implementation refuses or remains inside
        the root.
      • Negative controls demonstrate that the same replacement escapes a deliberately
        vulnerable validate-then-open implementation.
      • Runtime adapters install the mechanism through contextual APIs; shared
        production modules do not detect the active runtime.

      Security boundary

      This issue prevents filesystem effects from escaping their authorized root by a
      concurrent path replacement. It does not provide:

      • Agent-generated XMD or Agent-provider sandboxing;
      • native command containment;
      • changes to <File> authoring forms; or
      • a guarantee about operating-system facilities outside the selected
        filesystem provider.

      Related work

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        securitySecurity hardening

        Projects

        No projects

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Prevent xmd run filesystem operations from escaping the working directory #227

          Description

          @taras

          Story

          As an XMD user, I want a filesystem operation to remain inside its authorized
          root even when another process replaces a directory or symbolic link during the
          operation.

          Example attack

          Suppose a document is allowed to write only inside /project/output:

          1. XMD checks that /project/output/report.txt is inside the allowed root.
          2. Before XMD opens the file, another process replaces output with a symbolic
            link to a directory outside /project.
          3. A vulnerable implementation follows the replacement and writes outside the
            authorized root.

          Checking a path and using it as two separate filesystem actions creates this
          race. The authorization must still hold when the operating system performs the
          access.

          Required guarantee

          The guarantee differs by filesystem provider and must be stated honestly.

          xmd workflow

          Workflow file effects address logical paths inside the provider-owned DOFS
          Workspace. Every operation is authorized against that logical namespace. It
          does not validate a host path and then perform an unguarded host-filesystem
          operation, so replacing a host symbolic link cannot redirect the access.

          xmd run

          The host-filesystem provider must prevent a path replacement between
          authorization and access for every supported Deno, Node, Bun, and compiled
          runtime adapter. The implementation must use a mechanism whose guarantee holds
          at access time, not another pre-access path check.

          If a runtime or platform cannot provide the strong guarantee, XMD must either
          refuse the affected operation or document the narrower supported boundary. It
          must not present a weaker implementation as equivalent protection.

          Agent read-only materialization belongs to #302. Its containment does not prove
          that ordinary xmd run filesystem effects close this race.

          Acceptance

          • Architecture and the executable-MDX threat model explain the attack in
            user-recognizable terms and distinguish Workflow from host-filesystem
            protection.
          • A Workflow operation cannot escape through host path replacement because its
            authoritative namespace is provider-owned.
          • The selected host mechanism and exact guarantee are recorded for Deno, Node,
            Bun, and the compiled binary on each supported platform.
          • A runtime that cannot enforce the guarantee refuses the operation or clearly
            states its narrower boundary.
          • Deterministic tests pause between authorization and access, replace the path,
            and prove that every supported host implementation refuses or remains inside
            the root.
          • Negative controls demonstrate that the same replacement escapes a deliberately
            vulnerable validate-then-open implementation.
          • Runtime adapters install the mechanism through contextual APIs; shared
            production modules do not detect the active runtime.

          Security boundary

          This issue prevents filesystem effects from escaping their authorized root by a
          concurrent path replacement. It does not provide:

          • Agent-generated XMD or Agent-provider sandboxing;
          • native command containment;
          • changes to <File> authoring forms; or
          • a guarantee about operating-system facilities outside the selected
            filesystem provider.

          Related work

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            securitySecurity hardening

            Projects

            No projects

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Prevent xmd run filesystem operations from escaping the working directory #227

              Description

              @taras

              Story

              As an XMD user, I want a filesystem operation to remain inside its authorized
              root even when another process replaces a directory or symbolic link during the
              operation.

              Example attack

              Suppose a document is allowed to write only inside /project/output:

              1. XMD checks that /project/output/report.txt is inside the allowed root.
              2. Before XMD opens the file, another process replaces output with a symbolic
                link to a directory outside /project.
              3. A vulnerable implementation follows the replacement and writes outside the
                authorized root.

              Checking a path and using it as two separate filesystem actions creates this
              race. The authorization must still hold when the operating system performs the
              access.

              Required guarantee

              The guarantee differs by filesystem provider and must be stated honestly.

              xmd workflow

              Workflow file effects address logical paths inside the provider-owned DOFS
              Workspace. Every operation is authorized against that logical namespace. It
              does not validate a host path and then perform an unguarded host-filesystem
              operation, so replacing a host symbolic link cannot redirect the access.

              xmd run

              The host-filesystem provider must prevent a path replacement between
              authorization and access for every supported Deno, Node, Bun, and compiled
              runtime adapter. The implementation must use a mechanism whose guarantee holds
              at access time, not another pre-access path check.

              If a runtime or platform cannot provide the strong guarantee, XMD must either
              refuse the affected operation or document the narrower supported boundary. It
              must not present a weaker implementation as equivalent protection.

              Agent read-only materialization belongs to #302. Its containment does not prove
              that ordinary xmd run filesystem effects close this race.

              Acceptance

              • Architecture and the executable-MDX threat model explain the attack in
                user-recognizable terms and distinguish Workflow from host-filesystem
                protection.
              • A Workflow operation cannot escape through host path replacement because its
                authoritative namespace is provider-owned.
              • The selected host mechanism and exact guarantee are recorded for Deno, Node,
                Bun, and the compiled binary on each supported platform.
              • A runtime that cannot enforce the guarantee refuses the operation or clearly
                states its narrower boundary.
              • Deterministic tests pause between authorization and access, replace the path,
                and prove that every supported host implementation refuses or remains inside
                the root.
              • Negative controls demonstrate that the same replacement escapes a deliberately
                vulnerable validate-then-open implementation.
              • Runtime adapters install the mechanism through contextual APIs; shared
                production modules do not detect the active runtime.

              Security boundary

              This issue prevents filesystem effects from escaping their authorized root by a
              concurrent path replacement. It does not provide:

              • Agent-generated XMD or Agent-provider sandboxing;
              • native command containment;
              • changes to <File> authoring forms; or
              • a guarantee about operating-system facilities outside the selected
                filesystem provider.

              Related work

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                securitySecurity hardening

                Projects

                No projects

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Prevent xmd run filesystem operations from escaping the working directory #227

                  Description

                  @taras

                  Story

                  As an XMD user, I want a filesystem operation to remain inside its authorized
                  root even when another process replaces a directory or symbolic link during the
                  operation.

                  Example attack

                  Suppose a document is allowed to write only inside /project/output:

                  1. XMD checks that /project/output/report.txt is inside the allowed root.
                  2. Before XMD opens the file, another process replaces output with a symbolic
                    link to a directory outside /project.
                  3. A vulnerable implementation follows the replacement and writes outside the
                    authorized root.

                  Checking a path and using it as two separate filesystem actions creates this
                  race. The authorization must still hold when the operating system performs the
                  access.

                  Required guarantee

                  The guarantee differs by filesystem provider and must be stated honestly.

                  xmd workflow

                  Workflow file effects address logical paths inside the provider-owned DOFS
                  Workspace. Every operation is authorized against that logical namespace. It
                  does not validate a host path and then perform an unguarded host-filesystem
                  operation, so replacing a host symbolic link cannot redirect the access.

                  xmd run

                  The host-filesystem provider must prevent a path replacement between
                  authorization and access for every supported Deno, Node, Bun, and compiled
                  runtime adapter. The implementation must use a mechanism whose guarantee holds
                  at access time, not another pre-access path check.

                  If a runtime or platform cannot provide the strong guarantee, XMD must either
                  refuse the affected operation or document the narrower supported boundary. It
                  must not present a weaker implementation as equivalent protection.

                  Agent read-only materialization belongs to #302. Its containment does not prove
                  that ordinary xmd run filesystem effects close this race.

                  Acceptance

                  • Architecture and the executable-MDX threat model explain the attack in
                    user-recognizable terms and distinguish Workflow from host-filesystem
                    protection.
                  • A Workflow operation cannot escape through host path replacement because its
                    authoritative namespace is provider-owned.
                  • The selected host mechanism and exact guarantee are recorded for Deno, Node,
                    Bun, and the compiled binary on each supported platform.
                  • A runtime that cannot enforce the guarantee refuses the operation or clearly
                    states its narrower boundary.
                  • Deterministic tests pause between authorization and access, replace the path,
                    and prove that every supported host implementation refuses or remains inside
                    the root.
                  • Negative controls demonstrate that the same replacement escapes a deliberately
                    vulnerable validate-then-open implementation.
                  • Runtime adapters install the mechanism through contextual APIs; shared
                    production modules do not detect the active runtime.

                  Security boundary

                  This issue prevents filesystem effects from escaping their authorized root by a
                  concurrent path replacement. It does not provide:

                  • Agent-generated XMD or Agent-provider sandboxing;
                  • native command containment;
                  • changes to <File> authoring forms; or
                  • a guarantee about operating-system facilities outside the selected
                    filesystem provider.

                  Related work

                  Activity

                  Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    securitySecurity hardening

                    Projects

                    No projects

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Prevent xmd run filesystem operations from escaping the working directory #227

                      Description

                      @taras

                      Story

                      As an XMD user, I want a filesystem operation to remain inside its authorized
                      root even when another process replaces a directory or symbolic link during the
                      operation.

                      Example attack

                      Suppose a document is allowed to write only inside /project/output:

                      1. XMD checks that /project/output/report.txt is inside the allowed root.
                      2. Before XMD opens the file, another process replaces output with a symbolic
                        link to a directory outside /project.
                      3. A vulnerable implementation follows the replacement and writes outside the
                        authorized root.

                      Checking a path and using it as two separate filesystem actions creates this
                      race. The authorization must still hold when the operating system performs the
                      access.

                      Required guarantee

                      The guarantee differs by filesystem provider and must be stated honestly.

                      xmd workflow

                      Workflow file effects address logical paths inside the provider-owned DOFS
                      Workspace. Every operation is authorized against that logical namespace. It
                      does not validate a host path and then perform an unguarded host-filesystem
                      operation, so replacing a host symbolic link cannot redirect the access.

                      xmd run

                      The host-filesystem provider must prevent a path replacement between
                      authorization and access for every supported Deno, Node, Bun, and compiled
                      runtime adapter. The implementation must use a mechanism whose guarantee holds
                      at access time, not another pre-access path check.

                      If a runtime or platform cannot provide the strong guarantee, XMD must either
                      refuse the affected operation or document the narrower supported boundary. It
                      must not present a weaker implementation as equivalent protection.

                      Agent read-only materialization belongs to #302. Its containment does not prove
                      that ordinary xmd run filesystem effects close this race.

                      Acceptance

                      • Architecture and the executable-MDX threat model explain the attack in
                        user-recognizable terms and distinguish Workflow from host-filesystem
                        protection.
                      • A Workflow operation cannot escape through host path replacement because its
                        authoritative namespace is provider-owned.
                      • The selected host mechanism and exact guarantee are recorded for Deno, Node,
                        Bun, and the compiled binary on each supported platform.
                      • A runtime that cannot enforce the guarantee refuses the operation or clearly
                        states its narrower boundary.
                      • Deterministic tests pause between authorization and access, replace the path,
                        and prove that every supported host implementation refuses or remains inside
                        the root.
                      • Negative controls demonstrate that the same replacement escapes a deliberately
                        vulnerable validate-then-open implementation.
                      • Runtime adapters install the mechanism through contextual APIs; shared
                        production modules do not detect the active runtime.

                      Security boundary

                      This issue prevents filesystem effects from escaping their authorized root by a
                      concurrent path replacement. It does not provide:

                      • Agent-generated XMD or Agent-provider sandboxing;
                      • native command containment;
                      • changes to <File> authoring forms; or
                      • a guarantee about operating-system facilities outside the selected
                        filesystem provider.

                      Related work

                      Activity

                      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        securitySecurity hardening

                        Projects

                        No projects

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Prevent xmd run filesystem operations from escaping the working directory #227

                          Description

                          @taras

                          Story

                          As an XMD user, I want a filesystem operation to remain inside its authorized
                          root even when another process replaces a directory or symbolic link during the
                          operation.

                          Example attack

                          Suppose a document is allowed to write only inside /project/output:

                          1. XMD checks that /project/output/report.txt is inside the allowed root.
                          2. Before XMD opens the file, another process replaces output with a symbolic
                            link to a directory outside /project.
                          3. A vulnerable implementation follows the replacement and writes outside the
                            authorized root.

                          Checking a path and using it as two separate filesystem actions creates this
                          race. The authorization must still hold when the operating system performs the
                          access.

                          Required guarantee

                          The guarantee differs by filesystem provider and must be stated honestly.

                          xmd workflow

                          Workflow file effects address logical paths inside the provider-owned DOFS
                          Workspace. Every operation is authorized against that logical namespace. It
                          does not validate a host path and then perform an unguarded host-filesystem
                          operation, so replacing a host symbolic link cannot redirect the access.

                          xmd run

                          The host-filesystem provider must prevent a path replacement between
                          authorization and access for every supported Deno, Node, Bun, and compiled
                          runtime adapter. The implementation must use a mechanism whose guarantee holds
                          at access time, not another pre-access path check.

                          If a runtime or platform cannot provide the strong guarantee, XMD must either
                          refuse the affected operation or document the narrower supported boundary. It
                          must not present a weaker implementation as equivalent protection.

                          Agent read-only materialization belongs to #302. Its containment does not prove
                          that ordinary xmd run filesystem effects close this race.

                          Acceptance

                          • Architecture and the executable-MDX threat model explain the attack in
                            user-recognizable terms and distinguish Workflow from host-filesystem
                            protection.
                          • A Workflow operation cannot escape through host path replacement because its
                            authoritative namespace is provider-owned.
                          • The selected host mechanism and exact guarantee are recorded for Deno, Node,
                            Bun, and the compiled binary on each supported platform.
                          • A runtime that cannot enforce the guarantee refuses the operation or clearly
                            states its narrower boundary.
                          • Deterministic tests pause between authorization and access, replace the path,
                            and prove that every supported host implementation refuses or remains inside
                            the root.
                          • Negative controls demonstrate that the same replacement escapes a deliberately
                            vulnerable validate-then-open implementation.
                          • Runtime adapters install the mechanism through contextual APIs; shared
                            production modules do not detect the active runtime.

                          Security boundary

                          This issue prevents filesystem effects from escaping their authorized root by a
                          concurrent path replacement. It does not provide:

                          • Agent-generated XMD or Agent-provider sandboxing;
                          • native command containment;
                          • changes to <File> authoring forms; or
                          • a guarantee about operating-system facilities outside the selected
                            filesystem provider.

                          Related work

                          Activity

                          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            securitySecurity hardening

                            Projects

                            No projects

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Prevent xmd run filesystem operations from escaping the working directory #227

                              Description

                              @taras

                              Story

                              As an XMD user, I want a filesystem operation to remain inside its authorized
                              root even when another process replaces a directory or symbolic link during the
                              operation.

                              Example attack

                              Suppose a document is allowed to write only inside /project/output:

                              1. XMD checks that /project/output/report.txt is inside the allowed root.
                              2. Before XMD opens the file, another process replaces output with a symbolic
                                link to a directory outside /project.
                              3. A vulnerable implementation follows the replacement and writes outside the
                                authorized root.

                              Checking a path and using it as two separate filesystem actions creates this
                              race. The authorization must still hold when the operating system performs the
                              access.

                              Required guarantee

                              The guarantee differs by filesystem provider and must be stated honestly.

                              xmd workflow

                              Workflow file effects address logical paths inside the provider-owned DOFS
                              Workspace. Every operation is authorized against that logical namespace. It
                              does not validate a host path and then perform an unguarded host-filesystem
                              operation, so replacing a host symbolic link cannot redirect the access.

                              xmd run

                              The host-filesystem provider must prevent a path replacement between
                              authorization and access for every supported Deno, Node, Bun, and compiled
                              runtime adapter. The implementation must use a mechanism whose guarantee holds
                              at access time, not another pre-access path check.

                              If a runtime or platform cannot provide the strong guarantee, XMD must either
                              refuse the affected operation or document the narrower supported boundary. It
                              must not present a weaker implementation as equivalent protection.

                              Agent read-only materialization belongs to #302. Its containment does not prove
                              that ordinary xmd run filesystem effects close this race.

                              Acceptance

                              • Architecture and the executable-MDX threat model explain the attack in
                                user-recognizable terms and distinguish Workflow from host-filesystem
                                protection.
                              • A Workflow operation cannot escape through host path replacement because its
                                authoritative namespace is provider-owned.
                              • The selected host mechanism and exact guarantee are recorded for Deno, Node,
                                Bun, and the compiled binary on each supported platform.
                              • A runtime that cannot enforce the guarantee refuses the operation or clearly
                                states its narrower boundary.
                              • Deterministic tests pause between authorization and access, replace the path,
                                and prove that every supported host implementation refuses or remains inside
                                the root.
                              • Negative controls demonstrate that the same replacement escapes a deliberately
                                vulnerable validate-then-open implementation.
                              • Runtime adapters install the mechanism through contextual APIs; shared
                                production modules do not detect the active runtime.

                              Security boundary

                              This issue prevents filesystem effects from escaping their authorized root by a
                              concurrent path replacement. It does not provide:

                              • Agent-generated XMD or Agent-provider sandboxing;
                              • native command containment;
                              • changes to <File> authoring forms; or
                              • a guarantee about operating-system facilities outside the selected
                                filesystem provider.

                              Related work

                              Activity

                              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                securitySecurity hardening

                                Projects

                                No projects

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions