Repository navigation
Load roost launch policies only from configured role roots - #26
Merged
Merged
Conversation
ehrlich-b
force-pushed
the
fix/roost-runtime-policy
branch
4 times, most recently
from
October 7, 2026 08:54
042788a to
878ddaa
Compare
ehrlich-b
force-pushed
the
fix/roost-runtime-policy
branch
from
October 7, 2026 08:58
878ddaa to
8cf1360
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Security fix for shared and org roosts (found by an adversarial review of
harden/all, reproduced on maina07f698; v0.147 and v0.148 have the same discovery path by source).Hole: an authenticated member could create
egg.yamlin a subdirectory of their writable role path, for exampleeng/sub/egg.yamlwithro:/opt/wingthing/support, launch withcwd=eng/subthrough MCP or headless runs, and mount another role's tree. A role policy's relativedeny-write:./egg.yamlalso left the root policy writable from a subdirectory session.Fix: on shared and org roosts, every authenticated launch (browser and fork, native and direct MCP
terminal_start/agent_start, headlessagent_run/swarm with the policy frozen at submission, continuation) uses only theegg.yamlat the deepest configured wing path root containing the cwd, under strict rules:egg.yamlmust be a regular file, read no-follow from its descriptor, withbase:absent,none, or the built-indefault.egg.yamlis write-denied in every roost session, and missing targets aren't created.egg.yamlstill says "ask the wing owner".Personal wings keep full workspace discovery.
Behavior changes to look at:
egg.yaml, file-pathbase:references, nested configured roots, and roots that are or pass through a symlink. Relative rules in the role policy are anchored to the role root. Slide's Ansible config (sibling/opt/wingthing/<role>roots, regular file,base: none) is unaffected.Evidence: new tests for each rule (selected-root ACL across browser, MCP, forks, agents and swarms; protection of every root without creating targets; regular-file and base refusal; macOS case; omitted cwd). They fail on the previous version and pass here. A Slide-template compatibility test checks that audit, permission skip, env passthrough and the other-role denies survive. Full
egg,eggclient,localmcp,localrelay,wingandconfigsuites, builds and tagged vets pass.