You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A link at a project config folder is now refused wherever it points.
The plugin dist changes in lib/repo-fs.js and the version string; the new tests, the write guard in scripts/lib/repo-fs.mjs (a repo script, not part of the dist) and the test roster are the room's own tooling.
Security
A link planted at a folder above the project config no longer redirects the config read or the configure.mjs write(shipped: lib/repo-fs.js; repo script: scripts/lib/repo-fs.mjs). A cloned repository could carry a directory link (a Windows junction or a POSIX symlink) at .claude, at .claude/coal, or at the same folders under .agents or .gemini, aimed at another folder of the same project. The reader asked only that the config file's real path lie inside the project, so loadConfig read the coalhearth.json found in that other folder, and scripts/configure.mjs wrote the config and its .bak there. A link aimed outside the project was already refused (2.6.1). Fix: folderChain in lib/repo-fs.js examines every folder between the project root and the file with lstat and refuses a link at any of them, wherever it points; the read and the write guard both ask it. The project root itself is not walked, so a project opened through a linked path still reads its own files; a folder that does not exist yet ends the check as plain; a folder that cannot be examined is refused. A file link at a config name inside the project is still honored when its target is a regular file inside the project: it can only point at another file of the same repository, which the repository could carry at the config path itself, and configure.mjs replaces such a link when it writes, never writing through it. Affected: every tag from v2.2.0 through v2.8.4 for the config read, and from v2.5.0 for configure.mjs (through v2.6.0 the same read and write followed any link; from v2.6.1 a link that stays inside the project), read in the code of each tag; the behavior was run on the v2.8.4 line only. Verified on Windows 11 with Node 24.19 with a junction at .claude and at .claude/coal; the POSIX symlink legs run on the CI legs. A link swapped in between the check and the open or write is not covered, as for the other link classes. The advisory record is in SECURITY.md. Fixed in commit e418b42 — test: lib/folder-pin.test.js, scripts/folder-pin.test.mjs.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
A link at a project config folder is now refused wherever it points.
The plugin dist changes in
lib/repo-fs.jsand the version string; the new tests, the write guard inscripts/lib/repo-fs.mjs(a repo script, not part of the dist) and the test roster are the room's own tooling.Security
configure.mjswrite (shipped:lib/repo-fs.js; repo script:scripts/lib/repo-fs.mjs). A cloned repository could carry a directory link (a Windows junction or a POSIX symlink) at.claude, at.claude/coal, or at the same folders under.agentsor.gemini, aimed at another folder of the same project. The reader asked only that the config file's real path lie inside the project, soloadConfigread thecoalhearth.jsonfound in that other folder, andscripts/configure.mjswrote the config and its.bakthere. A link aimed outside the project was already refused (2.6.1). Fix:folderChaininlib/repo-fs.jsexamines every folder between the project root and the file withlstatand refuses a link at any of them, wherever it points; the read and the write guard both ask it. The project root itself is not walked, so a project opened through a linked path still reads its own files; a folder that does not exist yet ends the check as plain; a folder that cannot be examined is refused. A file link at a config name inside the project is still honored when its target is a regular file inside the project: it can only point at another file of the same repository, which the repository could carry at the config path itself, andconfigure.mjsreplaces such a link when it writes, never writing through it. Affected: every tag from v2.2.0 through v2.8.4 for the config read, and from v2.5.0 forconfigure.mjs(through v2.6.0 the same read and write followed any link; from v2.6.1 a link that stays inside the project), read in the code of each tag; the behavior was run on the v2.8.4 line only. Verified on Windows 11 with Node 24.19 with a junction at.claudeand at.claude/coal; the POSIX symlink legs run on the CI legs. A link swapped in between the check and the open or write is not covered, as for the other link classes. The advisory record is inSECURITY.md. Fixed in commite418b42— test:lib/folder-pin.test.js,scripts/folder-pin.test.mjs.Release page · CoalHearth
All reactions