{"code":"var Component=(()=>{var p=Object.create;var t=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var u=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty;var y=(n,i)=>()=>(i||n((i={exports:{}}).exports,i),i.exports),F=(n,i)=>{for(var s in i)t(n,s,{get:i[s],enumerable:!0})},h=(n,i,s,r)=>{if(i&&typeof i==\"object\"||typeof i==\"function\")for(let a of g(i))!m.call(n,a)&&a!==s&&t(n,a,{get:()=>i[a],enumerable:!(r=k(i,a))||r.enumerable});return n};var b=(n,i,s)=>(s=n!=null?p(u(n)):{},h(i||!n||!n.__esModule?t(s,\"default\",{value:n,enumerable:!0}):s,n)),f=n=>h(t({},\"__esModule\",{value:!0}),n);var d=y((A,l)=>{l.exports=_jsx_runtime});var w={};F(w,{default:()=>c});var e=b(d());function o(n){let i={a:\"a\",blockquote:\"blockquote\",code:\"code\",em:\"em\",h2:\"h2\",h3:\"h3\",img:\"img\",li:\"li\",ol:\"ol\",p:\"p\",pre:\"pre\",span:\"span\",strong:\"strong\",table:\"table\",tbody:\"tbody\",td:\"td\",th:\"th\",thead:\"thead\",tr:\"tr\",ul:\"ul\",...n.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(i.p,{children:[\"Since macOS Sonoma, when one app tried to read another app's private data, you saw a prompt: \",(0,e.jsx)(i.em,{children:'\"App\" would like to access data from other apps.'}),\" You could allow or deny it, and whatever broke, you knew why. macOS 27 Golden Gate removes the prompt. Access is now \",(0,e.jsx)(i.strong,{children:\"denied by default and without asking\"}),'. The app that wanted the data just gets an empty result or an \"Operation not permitted\" error. You find out when a feature silently stops working.']}),`\n`,(0,e.jsxs)(i.p,{children:[\"Three related changes in the same release point the same way: XProtect can now block access to data malware commonly steals, apps can no longer read the privacy database directly, and \",(0,e.jsx)(i.code,{children:\"launchd\"}),\" refuses to load property lists that carry the quarantine flag. This guide explains each one using Apple's own release-note wording, shows how to check what on your Mac is affected, and explains how to grant access deliberately when you need it \\u2014 and when you shouldn't.\"]}),`\n`,(0,e.jsx)(i.p,{children:(0,e.jsx)(i.img,{alt:\"A Mac with app data folders sealed behind a transparent privacy barrier\",src:\"/images/blog/macos-27-app-data-containers-access-denied-operation-not-permitted-fix-2026/hero.webp\",width:\"1024\",height:\"541\"})}),`\n`,(0,e.jsx)(i.h2,{id:\"key-takeaways\",children:\"Key Takeaways\"}),`\n`,(0,e.jsxs)(i.ul,{children:[`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"No more prompt.\"}),` In macOS 27, access to another developer's app data containers and app group containers is \"denied by default\" and managed in `,(0,e.jsx)(i.strong,{children:\"Privacy & Security\"}),\" settings. Apple's release notes list this under System Integrity Protection.\"]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Command-line tools are the awkward case.\"}),` Apple lists a known issue: a process without a bundle ID can't be granted access to a specific app's data. The documented workaround is Full Disk Access \"for the duration of the requirement\".`]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:'XProtect now guards \"commonly targeted\" data.'}),\" Apple doesn't publish the list, so expect access to some app data to be refused even when a tool used to read it without trouble.\"]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Apps can no longer read the TCC privacy database directly.\"}),\" Scripts and tools that inspected \",(0,e.jsx)(i.code,{children:\"TCC.db\"}),\" to report permissions need another approach.\"]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Quarantined LaunchAgents stop loading.\"}),\" On the Mac we checked, 9 of the 20 agents in \",(0,e.jsx)(i.code,{children:\"~/Library/LaunchAgents\"}),\" carried the quarantine attribute \\u2014 all of them updater agents written by three third-party browsers.\"]}),`\n`]}),`\n`,(0,e.jsx)(i.h2,{id:\"what-changed-from-a-prompt-to-a-default-denial\",children:\"What Changed: From a Prompt to a Default Denial\"}),`\n`,(0,e.jsx)(i.p,{children:\"Apple has been tightening this area step by step:\"}),`\n`,(0,e.jsxs)(i.table,{children:[(0,e.jsx)(i.thead,{children:(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.th,{children:\"Release\"}),(0,e.jsx)(i.th,{children:\"Access to another developer's app data\"})]})}),(0,e.jsxs)(i.tbody,{children:[(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:\"macOS 13 Ventura and earlier\"}),(0,e.jsx)(i.td,{children:\"Largely open to any process running as you\"})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:\"macOS 14 Sonoma\"}),(0,e.jsx)(i.td,{children:'Protected; the user sees a prompt asking to allow access to \"data from other apps\"'})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:\"macOS 15 Sequoia\"}),(0,e.jsx)(i.td,{children:\"Protection extended to app group containers\"})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:\"macOS 27 Golden Gate\"}),(0,e.jsx)(i.td,{children:\"Denied by default with no prompt; managed in Privacy & Security settings\"})]})]})]}),`\n`,(0,e.jsx)(i.p,{children:\"The macOS 27 wording, from the System Integrity Protection section of the release notes:\"}),`\n`,(0,e.jsxs)(i.blockquote,{children:[`\n`,(0,e.jsx)(i.p,{children:\"Accessing files in other developer teams' app data containers and app group containers no longer prompts the user for authorization; such accesses are denied by default and can be managed by the user in Privacy & Security settings.\"}),`\n`]}),`\n`,(0,e.jsxs)(i.p,{children:[\"Two words in that sentence decide whether you're affected. \",(0,e.jsx)(i.strong,{children:\"Developer teams\"}),\": the rule is about apps from \",(0,e.jsx)(i.em,{children:\"different\"}),\" developers. A suite of apps from the same developer can still share a group container, because they're signed by the same team. \",(0,e.jsx)(i.strong,{children:\"Containers\"}),\": the rule covers the sandboxed data folders apps keep in your Library. It doesn't cover your Documents folder, your Desktop or files you save yourself \\u2014 those have their own Files and Folders permissions, which haven't changed in this way.\"]}),`\n`,(0,e.jsx)(i.h2,{id:\"what-counts-as-another-apps-data\",children:`What Counts as \"Another App's Data\"`}),`\n`,(0,e.jsx)(i.p,{children:\"Sandboxed apps keep their private files in two places inside your home folder:\"}),`\n`,(0,e.jsxs)(i.ul,{children:[`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.code,{children:\"~/Library/Containers/\"}),\" \\u2014 one folder per sandboxed app, named by bundle ID, with the app's real data under \",(0,e.jsx)(i.code,{children:\"Data/\"})]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.code,{children:\"~/Library/Group Containers/\"}),\" \\u2014 folders shared between several apps from the same developer, named either \",(0,e.jsx)(i.code,{children:\"group.\\u2026\"}),\" or with the developer's team ID in front\"]}),`\n`]}),`\n`,(0,e.jsx)(i.p,{children:\"Listing the folder names is harmless and shows the scale. On the Mac we used, still running Tahoe 26.5.2:\"}),`\n`,(0,e.jsx)(e.Fragment,{children:(0,e.jsx)(i.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,e.jsxs)(i.code,{children:[(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"ls\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/Containers\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" wc\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -l\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"                    # 956\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"ls\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/Group\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"\\\\ \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"Containers\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" wc\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -l\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"             # 187\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"ls\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/Group\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"\\\\ \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"Containers\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" grep\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -vc\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" '^group\\\\.'\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"   # 70 named with a team ID\"})]})]})})}),`\n`,(0,e.jsx)(i.p,{children:\"That's 956 app containers and 187 group containers, and each of them is now off-limits by default to every app from a different developer. Most of that is fine: a well-behaved app has no business reading another app's database. The trouble is the tools that read it legitimately for you.\"}),`\n`,(0,e.jsx)(i.h2,{id:\"what-it-looks-like-when-it-breaks\",children:\"What It Looks Like When It Breaks\"}),`\n`,(0,e.jsx)(i.p,{children:\"The failure has no dialog, so it shows up as a symptom. The most common ones:\"}),`\n`,(0,e.jsxs)(i.table,{children:[(0,e.jsx)(i.thead,{children:(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.th,{children:\"Symptom\"}),(0,e.jsx)(i.th,{children:\"Likely cause\"})]})}),(0,e.jsxs)(i.tbody,{children:[(0,e.jsxs)(i.tr,{children:[(0,e.jsxs)(i.td,{children:[(0,e.jsx)(i.code,{children:\"ls: \\u2026 : Operation not permitted\"}),\" in Terminal on a path under \",(0,e.jsx)(i.code,{children:\"~/Library/Containers/\\u2026/Data\"}),\" or \",(0,e.jsx)(i.code,{children:\"~/Library/Group Containers/\"})]}),(0,e.jsx)(i.td,{children:\"The shell's responsible app (Terminal, iTerm, your IDE) has no access to that app's data\"})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:`A backup, sync or export tool skips an app's data or reports \"permission denied\"`}),(0,e.jsx)(i.td,{children:\"The tool isn't allowed to read that container\"})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:\"An importer finds nothing to import from another app\"}),(0,e.jsx)(i.td,{children:\"Denied silently; the importer sees an empty or missing folder\"})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:\"A launcher, clipboard or automation tool loses a feature that read another app's data\"}),(0,e.jsx)(i.td,{children:\"Same denial, surfacing as missing results\"})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsxs)(i.td,{children:[\"A script run by \",(0,e.jsx)(i.code,{children:\"cron\"}),\" or \",(0,e.jsx)(i.code,{children:\"launchd\"}),\" fails on a path it read yesterday\"]}),(0,e.jsx)(i.td,{children:\"Command-line process without a bundle ID \\u2014 see the known issue below\"})]})]})]}),`\n`,(0,e.jsxs)(i.p,{children:[`\"Operation not permitted\" (EPERM) is the standard error you get when macOS privacy controls block a file access. It doesn't mean the file is missing, and it doesn't mean `,(0,e.jsx)(i.code,{children:\"sudo\"}),\" will help \\u2014 privacy protection applies to root as well.\"]}),`\n`,(0,e.jsx)(i.h2,{id:\"granting-access-the-right-way\",children:\"Granting Access the Right Way\"}),`\n`,(0,e.jsxs)(i.p,{children:[\"Apple places the control in \",(0,e.jsx)(i.strong,{children:\"System Settings \\u2192 Privacy & Security\"}),\", and the known issue below refers to the \",(0,e.jsx)(i.strong,{children:\"Files & Folders\"}),\" pane specifically. That's where access to another app's data is now granted per app, instead of through a one-time prompt.\"]}),`\n`,(0,e.jsx)(i.h3,{id:\"for-regular-apps\",children:\"For regular apps\"}),`\n`,(0,e.jsxs)(i.ol,{children:[`\n`,(0,e.jsxs)(i.li,{children:[\"Open \",(0,e.jsx)(i.strong,{children:\"System Settings \\u2192 Privacy & Security \\u2192 Files & Folders\"}),\".\"]}),`\n`,(0,e.jsx)(i.li,{children:\"Find the app that needs the access and expand it.\"}),`\n`,(0,e.jsx)(i.li,{children:\"Allow the specific data it needs, rather than broader access.\"}),`\n`]}),`\n`,(0,e.jsxs)(i.p,{children:[\"The exact layout of that pane on macOS 27 may differ from Tahoe's. Apple's notes describe \",(0,e.jsx)(i.em,{children:\"where\"}),\" access is managed, not a click-by-click path. The principle is the same either way: grant the narrowest access that makes the feature work.\"]}),`\n`,(0,e.jsxs)(i.p,{children:[\"If an app's own documentation tells you to grant \",(0,e.jsx)(i.strong,{children:\"Full Disk Access\"}),\" instead, that works too \\u2014 Full Disk Access covers app data containers. But it covers everything else in your home folder as well, including Mail, Messages and Safari data, so reserve it for tools whose whole job is reading your disk: backup software, disk analysers and the like.\"]}),`\n`,(0,e.jsxs)(i.h3,{id:\"for-scripts-cron-jobs-and-command-line-tools\",children:[\"For scripts, \",(0,e.jsx)(i.code,{children:\"cron\"}),\" jobs and command-line tools\"]}),`\n`,(0,e.jsx)(i.p,{children:\"This is where Apple lists a known issue:\"}),`\n`,(0,e.jsxs)(i.blockquote,{children:[`\n`,(0,e.jsx)(i.p,{children:\"In the Files & Folders pane, a process without a bundle ID cannot be granted access to specific app data containers or app group containers owned by other developer teams.\"}),`\n`,(0,e.jsx)(i.p,{children:\"Workaround: Consider if the access is necessary. If required, grant Full Disk Access to the process for the duration of the requirement.\"}),`\n`]}),`\n`,(0,e.jsxs)(i.p,{children:['A \"process without a bundle ID\" is any plain executable: a Python interpreter, a shell script run by ',(0,e.jsx)(i.code,{children:\"launchd\"}),\", a binary installed by Homebrew, a daemon started by \",(0,e.jsx)(i.code,{children:\"cron\"}),\". What matters is how it's launched:\"]}),`\n`,(0,e.jsxs)(i.ul,{children:[`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Run from Terminal\"}),\", privacy decisions are attributed to Terminal (or iTerm, or your IDE), which \",(0,e.jsx)(i.em,{children:\"does\"}),\" have a bundle ID. Granting access to that app usually covers commands you run in it.\"]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsxs)(i.strong,{children:[\"Run by \",(0,e.jsx)(i.code,{children:\"launchd\"}),\" or \",(0,e.jsx)(i.code,{children:\"cron\"})]}),\", there is no app to attribute it to. The process itself needs the permission, and per the known issue, that means Full Disk Access for the binary.\"]}),`\n`]}),`\n`,(0,e.jsxs)(i.p,{children:[\"To add a command-line binary to Full Disk Access, click \",(0,e.jsx)(i.strong,{children:\"+\"}),\" in the Full Disk Access list, press \",(0,e.jsx)(i.strong,{children:\"\\u2318\\u21E7G\"}),\", paste the path (for example \",(0,e.jsx)(i.code,{children:\"/opt/homebrew/bin/python3\"}),\" or \",(0,e.jsx)(i.code,{children:\"/usr/sbin/cron\"}),`), and add it. Apple's phrasing \\u2014 \"for the duration of the requirement\" \\u2014 is worth taking literally. Grant it for the job, then remove it. An interpreter with Full Disk Access gives that access to every script it runs.`]}),`\n`,(0,e.jsx)(i.p,{children:(0,e.jsx)(i.img,{alt:\"A permissions panel granting one tool narrow access to a single app's data folder\",src:\"/images/blog/macos-27-app-data-containers-access-denied-operation-not-permitted-fix-2026/content-1.webp\",width:\"1024\",height:\"541\"})}),`\n`,(0,e.jsx)(i.h2,{id:\"the-xprotect-layer\",children:\"The XProtect Layer\"}),`\n`,(0,e.jsx)(i.p,{children:\"A second note in the same section adds a layer of protection that doesn't depend on who's asking:\"}),`\n`,(0,e.jsxs)(i.blockquote,{children:[`\n`,(0,e.jsx)(i.p,{children:\"XProtect may now restrict access to app data that is commonly targeted by malicious software. Accessing files created by other developer teams' apps may be denied by default but may be managed by the user in Privacy & Security settings.\"}),`\n`]}),`\n`,(0,e.jsx)(i.p,{children:`Apple doesn't say which data counts as \"commonly targeted\". What Mac infostealers look for is well documented by security researchers: browser profiles with saved passwords and cookies, cryptocurrency wallet data, and messaging-app session files. It's a reasonable guess, but still a guess, that XProtect's list overlaps heavily with those.`}),`\n`,(0,e.jsxs)(i.p,{children:[\"The practical effect for you: a tool that legitimately reads, say, another app's session or profile data may be refused on macOS 27 even after you've granted what looks like the right permission. If that happens, check \",(0,e.jsx)(i.strong,{children:\"Privacy & Security\"}),\" for a pending entry first. If there isn't one, it's worth asking the tool's developer whether they've tested on macOS 27 \\u2014 the fix may have to come from their side.\"]}),`\n`,(0,e.jsx)(i.h2,{id:\"apps-can-no-longer-read-the-privacy-database\",children:\"Apps Can No Longer Read the Privacy Database\"}),`\n`,(0,e.jsxs)(i.p,{children:[\"The TCC (Transparency, Consent and Control) database records which apps you've allowed to use the camera, microphone, screen recording, files and so on. The per-user copy lives at \",(0,e.jsx)(i.code,{children:\"~/Library/Application Support/com.apple.TCC/TCC.db\"}),\". For years, tools with Full Disk Access could read it directly to report on permissions.\"]}),`\n`,(0,e.jsx)(i.p,{children:\"The macOS 27 release notes, under TCC deprecations:\"}),`\n`,(0,e.jsxs)(i.blockquote,{children:[`\n`,(0,e.jsx)(i.p,{children:\"Apps can no longer access the local TCC database directly.\"}),`\n`]}),`\n`,(0,e.jsx)(i.p,{children:\"Even on Tahoe, you need Full Disk Access to read it. From a shell without it, on our test Mac:\"}),`\n`,(0,e.jsx)(e.Fragment,{children:(0,e.jsx)(i.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,e.jsxs)(i.code,{children:[(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"sqlite3\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/Application\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"\\\\ \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"Support/com.apple.TCC/TCC.db\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"select service from access limit 1\"'})]}),`\n`,(0,e.jsx)(i.span,{className:\"line\",children:(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:'# Error: unable to open database \".../com.apple.TCC/TCC.db\": authorization denied'})})]})})}),`\n`,(0,e.jsx)(i.p,{children:\"On macOS 27, this direct route is closed for apps in general. Who notices:\"}),`\n`,(0,e.jsxs)(i.ul,{children:[`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Mac admins\"}),\" whose compliance scripts or inventory extensions queried \",(0,e.jsx)(i.code,{children:\"TCC.db\"}),\" to report permissions. The supported path is your device management tool's privacy preferences policy control (PPPC) reporting, not the database.\"]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Utilities\"}),' that showed you \"which apps have which permission\" by reading the file.']}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Malware\"}),\", which read the database to find out what it could already reach. That's the reason for the change.\"]}),`\n`]}),`\n`,(0,e.jsxs)(i.p,{children:[\"For your own Mac, \",(0,e.jsx)(i.strong,{children:\"System Settings \\u2192 Privacy & Security\"}),\" remains the place to review and revoke permissions. Each category lists the apps that hold it.\"]}),`\n`,(0,e.jsx)(i.h2,{id:\"the-other-silent-change-quarantined-launchagents\",children:\"The Other Silent Change: Quarantined LaunchAgents\"}),`\n`,(0,e.jsx)(i.p,{children:\"This change isn't about app data, but it fails the same way \\u2014 quietly \\u2014 and it turned out to affect our test Mac more than anything else in this article. The release notes, under Launch Daemons and Agents:\"}),`\n`,(0,e.jsxs)(i.blockquote,{children:[`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.code,{children:\"launchd\"}),\" no longer supports loading \",(0,e.jsx)(i.code,{children:\"launchd\"}),\" property list files with the quarantine extended attribute.\"]}),`\n`]}),`\n`,(0,e.jsxs)(i.p,{children:[\"A LaunchAgent is a small \",(0,e.jsx)(i.code,{children:\".plist\"}),\" file in \",(0,e.jsx)(i.code,{children:\"~/Library/LaunchAgents\"}),\" that tells \",(0,e.jsx)(i.code,{children:\"launchd\"}),\" to start a program at login or on a schedule: updaters, sync helpers, menu-bar tools. The quarantine attribute (\",(0,e.jsx)(i.code,{children:\"com.apple.quarantine\"}),\") is the flag macOS attaches to files that arrive from the internet \\u2014 and to files created by apps that are themselves under quarantine rules.\"]}),`\n`,(0,e.jsx)(i.p,{children:\"Checking takes one loop:\"}),`\n`,(0,e.jsx)(e.Fragment,{children:(0,e.jsx)(i.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,e.jsxs)(i.code,{children:[(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"for\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" f \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"in\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/LaunchAgents/*.plist\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /Library/LaunchAgents/*.plist\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /Library/LaunchDaemons/*.plist\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"; \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"do\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"  xattr\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$f\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" 2>\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"/dev/null\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" grep\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -q\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" com.apple.quarantine\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" && \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"echo\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"QUARANTINED  '}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$f\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,e.jsx)(i.span,{className:\"line\",children:(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"done\"})})]})})}),`\n`,(0,e.jsx)(i.p,{children:\"On our test Mac:\"}),`\n`,(0,e.jsxs)(i.table,{children:[(0,e.jsx)(i.thead,{children:(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.th,{children:\"Folder\"}),(0,e.jsx)(i.th,{children:\"Property lists\"}),(0,e.jsx)(i.th,{children:\"Quarantined\"})]})}),(0,e.jsxs)(i.tbody,{children:[(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:(0,e.jsx)(i.code,{children:\"~/Library/LaunchAgents\"})}),(0,e.jsx)(i.td,{children:\"20\"}),(0,e.jsx)(i.td,{children:\"9\"})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:(0,e.jsx)(i.code,{children:\"/Library/LaunchAgents\"})}),(0,e.jsx)(i.td,{children:\"8\"}),(0,e.jsx)(i.td,{children:\"0\"})]}),(0,e.jsxs)(i.tr,{children:[(0,e.jsx)(i.td,{children:(0,e.jsx)(i.code,{children:\"/Library/LaunchDaemons\"})}),(0,e.jsx)(i.td,{children:\"27\"}),(0,e.jsx)(i.td,{children:\"0\"})]})]})]}),`\n`,(0,e.jsx)(i.p,{children:\"All nine quarantined files were updater agents \\u2014 three each \\u2014 created by three third-party Chromium-based browsers. The third field of the quarantine value names the app that created the file:\"}),`\n`,(0,e.jsx)(e.Fragment,{children:(0,e.jsx)(i.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,e.jsxs)(i.code,{children:[(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"xattr\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -p\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" com.apple.quarantine\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/LaunchAgents/some.agent.plist\"})]}),`\n`,(0,e.jsx)(i.span,{className:\"line\",children:(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 0081;<timestamp>;<name of the app that wrote it>;<id>\"})})]})})}),`\n`,(0,e.jsx)(i.p,{children:\"At least one of them is loaded and running today on Tahoe. Going by Apple's note, on macOS 27 those agents won't load, so those browsers' background updaters would quietly stop. We haven't confirmed this on Golden Gate itself, and the vendors may already have changed how their agents are written. But it's exactly the kind of breakage that goes unnoticed for months: nothing fails visibly, and the browser just stops updating itself.\"}),`\n`,(0,e.jsx)(i.h3,{id:\"fixing-a-quarantined-agent\",children:\"Fixing a quarantined agent\"}),`\n`,(0,e.jsxs)(i.ol,{children:[`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Update the app first.\"}),\" If the vendor has fixed it, the new version will rewrite the agent without the attribute.\"]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"If you must fix it by hand, inspect before trusting.\"}),\" Check what it runs:\"]}),`\n`]}),`\n`,(0,e.jsx)(e.Fragment,{children:(0,e.jsx)(i.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,e.jsxs)(i.code,{children:[(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"plutil\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -p\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/LaunchAgents/some.agent.plist\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"          # look at Program / ProgramArguments\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"codesign\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -dv\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" --verbose=2\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"/path/to/the/program\"'}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" 2>&1\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" grep\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -E\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"Authority|TeamIdentifier\"'})]})]})})}),`\n`,(0,e.jsxs)(i.ol,{start:\"3\",children:[`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Only if the program is what you expect\"}),\", remove the attribute and reload the agent:\"]}),`\n`]}),`\n`,(0,e.jsx)(e.Fragment,{children:(0,e.jsx)(i.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,e.jsxs)(i.code,{children:[(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"xattr\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -d\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" com.apple.quarantine\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/LaunchAgents/some.agent.plist\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"launchctl\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" bootout\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" gui/\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$(\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"id\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -u\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\") \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"~/Library/LaunchAgents/some.agent.plist\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" 2>\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"/dev/null\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"launchctl\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" bootstrap\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" gui/\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$(\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"id\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -u\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\") \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"~/Library/LaunchAgents/some.agent.plist\"})]})]})})}),`\n`,(0,e.jsxs)(i.p,{children:[\"Don't strip quarantine from agents you don't recognise. Persistence through LaunchAgents is a classic malware technique, and this change is designed to stop a downloaded \",(0,e.jsx)(i.code,{children:\".plist\"}),\" from quietly installing itself. An unrecognised quarantined agent is a reason to investigate, not to reload it. Our \",(0,e.jsx)(i.a,{href:\"/blog/macos-tahoe-login-items-background-apps-complete-management-guide-2025\",children:\"login items and background apps guide\"}),\" explains how to trace an agent back to the app that installed it.\"]}),`\n`,(0,e.jsx)(i.p,{children:(0,e.jsx)(i.img,{alt:\"A background task list where some launch items are held back by a quarantine flag\",src:\"/images/blog/macos-27-app-data-containers-access-denied-operation-not-permitted-fix-2026/content-2.webp\",width:\"1024\",height:\"541\"})}),`\n`,(0,e.jsx)(i.h2,{id:\"a-five-minute-audit-before-or-after-upgrading\",children:\"A Five-Minute Audit, Before or After Upgrading\"}),`\n`,(0,e.jsx)(i.p,{children:\"Run these on Tahoe to see what's likely to change, or on macOS 27 to confirm what already has:\"}),`\n`,(0,e.jsx)(e.Fragment,{children:(0,e.jsx)(i.pre,{className:\"shiki shiki-themes github-light github-dark\",style:{\"--shiki-light\":\"#24292e\",\"--shiki-dark\":\"#e1e4e8\",\"--shiki-light-bg\":\"#fff\",\"--shiki-dark-bg\":\"#24292e\"},tabIndex:\"0\",icon:'<svg viewBox=\"0 0 24 24\"><path d=\"m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 Z m 8,14 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 8 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\" fill=\"currentColor\" /></svg>',children:(0,e.jsxs)(i.code,{children:[(0,e.jsx)(i.span,{className:\"line\",children:(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 1. How much app data is now guarded by default\"})}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"ls\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/Containers\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" wc\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -l\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"ls\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/Group\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"\\\\ \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"Containers\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" wc\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -l\"})]}),`\n`,(0,e.jsx)(i.span,{className:\"line\"}),`\n`,(0,e.jsx)(i.span,{className:\"line\",children:(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 2. Scheduled jobs that may read other apps' data\"})}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"crontab\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -l\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" 2>\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"/dev/null\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"ls\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/LaunchAgents\"})]}),`\n`,(0,e.jsx)(i.span,{className:\"line\"}),`\n`,(0,e.jsx)(i.span,{className:\"line\",children:(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 3. Quarantined launch items that will stop loading\"})}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"for\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" f \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"in\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/Library/LaunchAgents/*.plist\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /Library/LaunchAgents/*.plist\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" /Library/LaunchDaemons/*.plist\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"; \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"do\"})]}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"  xattr\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"'}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$f\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" 2>\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"/dev/null\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" |\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\" grep\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -q\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" com.apple.quarantine\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\" && \"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\"echo\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"QUARANTINED  '}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#24292E\",\"--shiki-dark\":\"#E1E4E8\"},children:\"$f\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:'\"'})]}),`\n`,(0,e.jsx)(i.span,{className:\"line\",children:(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\"done\"})}),`\n`,(0,e.jsx)(i.span,{className:\"line\"}),`\n`,(0,e.jsx)(i.span,{className:\"line\",children:(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6A737D\",\"--shiki-dark\":\"#6A737D\"},children:\"# 4. Scripts that read the privacy database directly\"})}),`\n`,(0,e.jsxs)(i.span,{className:\"line\",children:[(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#6F42C1\",\"--shiki-dark\":\"#B392F0\"},children:\"grep\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#005CC5\",\"--shiki-dark\":\"#79B8FF\"},children:\" -rl\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:' \"TCC.db\"'}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/bin\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/scripts\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\" ~/.local/bin\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#D73A49\",\"--shiki-dark\":\"#F97583\"},children:\" 2>\"}),(0,e.jsx)(i.span,{style:{\"--shiki-light\":\"#032F62\",\"--shiki-dark\":\"#9ECBFF\"},children:\"/dev/null\"})]})]})})}),`\n`,(0,e.jsxs)(i.p,{children:[\"Adjust the folders in step 4 to wherever you keep scripts. For each hit, ask the same question Apple's workaround asks: \",(0,e.jsx)(i.em,{children:\"is this access actually necessary?\"})]}),`\n`,(0,e.jsx)(i.h2,{id:\"when-not-to-grant-access\",children:\"When Not to Grant Access\"}),`\n`,(0,e.jsx)(i.p,{children:`The change exists because \"any process running as you can read any app's data\" was the main thing Mac infostealers relied on. Before you hand out access to get a feature back, a few rules help:`}),`\n`,(0,e.jsxs)(i.ul,{children:[`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Prefer the narrow grant.\"}),\" Per-app access in Files & Folders over Full Disk Access; Full Disk Access for one binary over Full Disk Access for a whole terminal app.\"]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Make command-line grants temporary.\"}),` Apple's own wording is \"for the duration of the requirement\". Put a reminder on the calendar to remove it.`]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Be suspicious of new requests.\"}),\" An app that had no reason to read another app's data last month and asks for Full Disk Access this month deserves a second look.\"]}),`\n`,(0,e.jsxs)(i.li,{children:[(0,e.jsx)(i.strong,{children:\"Never paste permission-granting commands from a web page\"}),\" you don't trust. Social-engineering campaigns that coax users into running Terminal commands are exactly how these protections get bypassed, as our article on \",(0,e.jsx)(i.a,{href:\"/blog/mac-blocked-terminal-command-paste-malware-alert-explained-2026\",children:\"Terminal paste malware warnings\"}),\" explains.\"]}),`\n`]}),`\n`,(0,e.jsx)(i.h2,{id:\"troubleshooting-common-issues\",children:\"Troubleshooting Common Issues\"}),`\n`,(0,e.jsx)(i.h3,{id:\"operation-not-permitted-even-with-sudo\",children:'\"Operation not permitted\" even with sudo'}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Problem\"}),\": \",(0,e.jsx)(i.code,{children:\"sudo ls ~/Library/Containers/\\u2026/Data\"}),\" still fails.\"]}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Solution\"}),\": Privacy protection isn't a Unix permission problem, and root is subject to it too. Grant the access to the responsible app \\u2014 Terminal, or whichever app launched the command \\u2014 in Privacy & Security.\"]}),`\n`,(0,e.jsxs)(i.h3,{id:\"a-launchd-job-fails-but-the-same-command-works-in-terminal\",children:[\"A \",(0,e.jsx)(i.code,{children:\"launchd\"}),\" job fails but the same command works in Terminal\"]}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Problem\"}),\": A scheduled script reads another app's data fine when you run it by hand, and fails on schedule.\"]}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Solution\"}),\": In Terminal, the access is attributed to Terminal. Under \",(0,e.jsx)(i.code,{children:\"launchd\"}),\" there's no app to attribute it to, and per Apple's known issue, a process without a bundle ID can't get per-app access. Grant Full Disk Access to the exact binary the job runs, and remove it when the job is no longer needed.\"]}),`\n`,(0,e.jsx)(i.h3,{id:\"a-backup-tool-silently-skipped-some-app-data\",children:\"A backup tool silently skipped some app data\"}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Problem\"}),\": The backup completed, but an app's container is missing or empty in the backup.\"]}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Solution\"}),`: Grant the backup app Full Disk Access \\u2014 this is one of the legitimate cases for it \\u2014 and run it again. Check the tool's log for permission errors; most report them even when the backup \"succeeds\".`]}),`\n`,(0,e.jsx)(i.h3,{id:\"an-app-lost-a-feature-after-the-upgrade-with-no-error\",children:\"An app lost a feature after the upgrade, with no error\"}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Problem\"}),\": An import, sync or search feature returns nothing.\"]}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Solution\"}),\": Look in Privacy & Security for an entry you can allow, and check the vendor's release notes for macOS 27 compatibility. If the data it wants is the kind XProtect guards, the fix may need to come from the developer.\"]}),`\n`,(0,e.jsx)(i.h3,{id:\"a-background-updater-stopped-updating\",children:\"A background updater stopped updating\"}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Problem\"}),\": An app's auto-update has quietly stopped since the upgrade.\"]}),`\n`,(0,e.jsxs)(i.p,{children:[(0,e.jsx)(i.strong,{children:\"Solution\"}),\": Check its LaunchAgent for the quarantine attribute with the loop above. Update the app manually first; that's the fix most likely to stick.\"]}),`\n`,(0,e.jsx)(i.h2,{id:\"faq\",children:\"FAQ\"}),`\n`,(0,e.jsx)(i.h3,{id:\"did-macos-27-remove-the-access-data-from-other-apps-prompt\",children:'Did macOS 27 remove the \"access data from other apps\" prompt?'}),`\n`,(0,e.jsx)(i.p,{children:`Yes. Apple's release notes say such access \"no longer prompts the user for authorization\" and is \"denied by default\". You manage it in Privacy & Security settings instead of answering a prompt when it happens.`}),`\n`,(0,e.jsx)(i.h3,{id:\"does-this-affect-apps-from-the-same-developer\",children:\"Does this affect apps from the same developer?\"}),`\n`,(0,e.jsx)(i.p,{children:'No. The rule applies to \"other developer teams\". Apps signed by the same developer team can still share data through their group containers, which is how suites of related apps keep working.'}),`\n`,(0,e.jsx)(i.h3,{id:\"is-full-disk-access-still-enough\",children:\"Is Full Disk Access still enough?\"}),`\n`,(0,e.jsx)(i.p,{children:\"According to Apple's own workaround for the command-line known issue, yes \\u2014 Full Disk Access grants access to app data containers. XProtect's new restrictions on commonly targeted data are the part Apple describes as separate, and these may still apply to some data.\"}),`\n`,(0,e.jsx)(i.h3,{id:\"why-cant-my-script-read-tccdb-anymore\",children:\"Why can't my script read TCC.db anymore?\"}),`\n`,(0,e.jsx)(i.p,{children:\"Apple's macOS 27 notes state that apps can no longer access the local TCC database directly. Use System Settings to review permissions, and your device management tool's reporting if you're an administrator.\"}),`\n`,(0,e.jsx)(i.h3,{id:\"is-it-safe-to-remove-the-quarantine-attribute-from-a-launchagent\",children:\"Is it safe to remove the quarantine attribute from a LaunchAgent?\"}),`\n`,(0,e.jsx)(i.p,{children:\"Only when you've confirmed what it runs, and that the program is signed by the developer you expect. Removing quarantine is exactly what malware wants you to do, which is why macOS 27 stopped loading quarantined agents in the first place.\"}),`\n`,(0,e.jsx)(i.h2,{id:\"conclusion\",children:\"Conclusion\"}),`\n`,(0,e.jsx)(i.p,{children:\"The theme of these macOS 27 changes is consistent: data that belongs to one app is no longer available to another just because both run under your account, and a file downloaded from the internet no longer turns into a background process just because it landed in the right folder. For most people that's a clear gain, since it's the same access Mac infostealers depended on.\"}),`\n`,(0,e.jsx)(i.p,{children:\"The cost is breakage you won't see announced. Scripts, backup tools, importers and even browser updaters can stop working quietly. Run the five-minute audit, grant access narrowly and temporarily where a tool really needs it, and when something goes quiet after the upgrade, check Privacy & Security before anything else.\"}),`\n`,(0,e.jsx)(i.p,{children:(0,e.jsxs)(i.em,{children:[\"Related reading: \",(0,e.jsx)(i.a,{href:\"/blog/macos-27-open-using-rosetta-ignored-intel-plugins-missing-fix-2026\",children:'macOS 27 ignores \"Open using Rosetta\": fixing missing Intel plug-ins'}),\" \\xB7 \",(0,e.jsx)(i.a,{href:\"/blog/mac-screen-recording-full-disk-access-permission-keeps-asking-fix-2026\",children:\"Screen Recording and Full Disk Access keeps asking\"}),\" \\xB7 \",(0,e.jsx)(i.a,{href:\"/blog/app-is-damaged-cant-be-opened-macos-tahoe-gatekeeper-quarantine-fix-2026\",children:'\"App is damaged\" and the quarantine attribute'}),\" \\xB7 \",(0,e.jsx)(i.a,{href:\"/blog/macos-27-golden-gate-release-day-update-guide-september-14-2026\",children:\"macOS 27 Golden Gate day-one update guide\"})]})})]})}function c(n={}){let{wrapper:i}=n.components||{};return i?(0,e.jsx)(i,{...n,children:(0,e.jsx)(o,{...n})}):o(n)}return f(w);})();\n;return Component;","toc":[{"title":"Key Takeaways","url":"#key-takeaways","depth":2},{"title":"What Changed: From a Prompt to a Default Denial","url":"#what-changed-from-a-prompt-to-a-default-denial","depth":2},{"title":"What Counts as \"Another App's Data\"","url":"#what-counts-as-another-apps-data","depth":2},{"title":"What It Looks Like When It Breaks","url":"#what-it-looks-like-when-it-breaks","depth":2},{"title":"Granting Access the Right Way","url":"#granting-access-the-right-way","depth":2},{"title":"For regular apps","url":"#for-regular-apps","depth":3},{"title":"For scripts, cron jobs and command-line tools","url":"#for-scripts-cron-jobs-and-command-line-tools","depth":3},{"title":"The XProtect Layer","url":"#the-xprotect-layer","depth":2},{"title":"Apps Can No Longer Read the Privacy Database","url":"#apps-can-no-longer-read-the-privacy-database","depth":2},{"title":"The Other Silent Change: Quarantined LaunchAgents","url":"#the-other-silent-change-quarantined-launchagents","depth":2},{"title":"Fixing a quarantined agent","url":"#fixing-a-quarantined-agent","depth":3},{"title":"A Five-Minute Audit, Before or After Upgrading","url":"#a-five-minute-audit-before-or-after-upgrading","depth":2},{"title":"When Not to Grant Access","url":"#when-not-to-grant-access","depth":2},{"title":"Troubleshooting Common Issues","url":"#troubleshooting-common-issues","depth":2},{"title":"\"Operation not permitted\" even with sudo","url":"#operation-not-permitted-even-with-sudo","depth":3},{"title":"A launchd job fails but the same command works in Terminal","url":"#a-launchd-job-fails-but-the-same-command-works-in-terminal","depth":3},{"title":"A backup tool silently skipped some app data","url":"#a-backup-tool-silently-skipped-some-app-data","depth":3},{"title":"An app lost a feature after the upgrade, with no error","url":"#an-app-lost-a-feature-after-the-upgrade-with-no-error","depth":3},{"title":"A background updater stopped updating","url":"#a-background-updater-stopped-updating","depth":3},{"title":"FAQ","url":"#faq","depth":2},{"title":"Did macOS 27 remove the \"access data from other apps\" prompt?","url":"#did-macos-27-remove-the-access-data-from-other-apps-prompt","depth":3},{"title":"Does this affect apps from the same developer?","url":"#does-this-affect-apps-from-the-same-developer","depth":3},{"title":"Is Full Disk Access still enough?","url":"#is-full-disk-access-still-enough","depth":3},{"title":"Why can't my script read TCC.db anymore?","url":"#why-cant-my-script-read-tccdb-anymore","depth":3},{"title":"Is it safe to remove the quarantine attribute from a LaunchAgent?","url":"#is-it-safe-to-remove-the-quarantine-attribute-from-a-launchagent","depth":3},{"title":"Conclusion","url":"#conclusion","depth":2}],"estimatedTime":17}