Skip to content

runtime: preserve sandbox controls across explicit exec envs - #3440

Closed
adilalperenciftci wants to merge 1 commit into
aether-lang-dev:mainfrom
adilalperenciftci:fix/sandbox-exec-env-inherit
Closed

adilalperenciftci wants to merge 1 commit into
aether-lang-dev:mainfrom
adilalperenciftci:fix/sandbox-exec-env-inherit

Conversation

@adilalperenciftci

Copy link
Copy Markdown
Contributor

Summary

I reproduced an allowed execve dropping cross-process containment whenever the caller supplied its own envp. Omitting the sandbox entries, or replacing them with empty/stale values, started the child without the preload layer and grant source.

This change:

  • rebuilds explicit child environments on the stack while a preload sandbox is active;
  • preserves application-provided non-control entries;
  • removes caller-provided sandbox control values and appends the current process's LD_PRELOAD, AETHER_SANDBOX_*, and AETHER_CAPSICUM entries;
  • refuses the exec with EPERM if an active sandbox has no non-empty preload or grant source to carry forward;
  • caps environment scanning at 4096 entries and returns E2BIG beyond that bound.

Verification

  • BEFORE: both omitted-control and overridden-control explicit environments read a file outside the child grants and exited zero.
  • AFTER: both cases remain contained and the read is denied.
  • Allowed exec with an inherited read grant: passed.
  • Explicit ONLY=explicit plus current LD_PRELOAD and grant source all reached the child.
  • Sandbox fork-grant, clone-fence, preload-lookup, and child signal-safety integrations: passed.
  • make check-tests: passed.
  • make test: 634 passed, 0 failed on Ubuntu VM.
  • make check-changelog: passed.

The optional i386 clone probe skipped because Zig is not installed in the VM.

Signed-off-by: Adil Alperen Çiftci <adilalperenciftci@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 29, 2026 08:32

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@paul-hammant

Copy link
Copy Markdown
Collaborator

Thanks, reviewed and folded into the batch #3456 with your authorship kept on the commit. One change on top: the controls are snapshotted at startup rather than copied from live environ, which the contained process can edit (f92a672, with a test of that case). This PR will be closed when #3456 merges.

🤖 Generated with Claude Code

@paul-hammant

Copy link
Copy Markdown
Collaborator

Merged as part of #3456 (merge 9364d6b), with your authorship on the commit. Thank you, @adilalperenciftci: this was a real fix, carefully tested, and it's appreciated.

🤖 Generated with Claude Code

adilalperenciftci pushed a commit to adilalperenciftci/aether that referenced this pull request Oct 29, 2026
pos += snprintf(...) could pass buf[8192] (snprintf returns the would-be
length), so the following (pos+1)-byte write read past the stack buffer.
Fail the spawn (-1) when an entry does not fit, on Linux and BSD. Adds
sandbox_grant_overflow. ATOMIC_VAR_INIT is deprecated since C17.

docs: note aether-lang-dev#3436 and aether-lang-dev#3440 behaviour in containment-sandbox.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants