Skip to content

phase0: add fallback.allowDaclMutation config option#282

Merged
MGudgin merged 1 commit into
mainfrom
user/gudge/downlevel_phase0
May 12, 2026
Merged

phase0: add fallback.allowDaclMutation config option#282
MGudgin merged 1 commit into
mainfrom
user/gudge/downlevel_phase0

Conversation

@MGudgin

@MGudgin MGudgin commented May 12, 2026

Copy link
Copy Markdown
Member

📖 Description

Introduces a new top-level fallback section on the MXC dev schema (0.6.0-dev), with a single occupant: allowDaclMutation (default: true). When the BaseContainer OS API is absent and bfscfg.exe is unavailable, MXC may fall back to applying DACL ACEs directly on policy paths (Tier 3 fallback). Because this modifies host filesystem security descriptors, operators need a way to refuse the fallback even though the original DACLs are restored on exit.

The fallback section names operator consent for host-impacting containment fallbacks. It is intentionally a section rather than a filesystem-scoped flag so future host-mutating fallbacks can land alongside as siblings without re-shuffling the schema. (Addresses review feedback on the prior shape.)

The default is true so that pre-GE Windows 11 builds — which currently have no other downlevel containment path — continue to work out of the box. Setting the field to false causes runs that would require Tier 3 to fail fast with a clear error (wired up in a later phase).

Plumbed through:

  • schemas/dev/mxc-config.schema.0.6.0-dev.json (new top-level fallback object with allowDaclMutation property)
  • RawFallback in config_parser.rs (new serde struct, optional on both RawConfig and the state-aware request envelope)
  • FallbackPolicy in models.rs (new struct with manual Default impl so allow_dacl_mutation defaults to true); ContainerPolicy gains a fallback: FallbackPolicy field
  • Mapping in load_request copies the value through, preserving the true default when the field is omitted
  • Three new unit tests covering default, explicit-true, explicit-false
  • docs/schema.md updated with a new Fallback Policy section

No runner code is touched in this phase; consumers of fallback.allow_dacl_mutation are added in subsequent phases (phase1+).

This is phase 0 of the downlevel containment stack (phase0 → phase5). Subsequent PRs build on this one.

🔗 References

Part of the downlevel containment series. Schema-doc coverage tracked separately in #285.

🔍 Validation

  • New unit tests in config_parser.rs cover the three field states (default, explicit true, explicit false).
  • No runner behavior changes in this PR — purely schema/config plumbing.

🤖 Generated with Claude Code

@MGudgin MGudgin requested a review from shschaefer May 12, 2026 03:10
Comment thread docs/schema.md Outdated
"readonlyPaths": ["C:\\data"], // Read-only access
"deniedPaths": ["C:\\Windows"] // Blocked paths
"deniedPaths": ["C:\\Windows"], // Blocked paths
"allowDaclFallback": true // Allow Tier 3 DACL fallback (default true)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

As we continue to move forward with features UI, outside-in, etc... we will find more than just the need to fallback DACLs. Can we promote this to a property of the process container, or a general property on virtualization fallback?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Force-pushed e1fb78c which lifts this out of filesystem into a new top-level fallback section. The field is now fallback.allowDaclMutation. Reasoning: we considered making it a single boolean at the container root vs. a structured section, and went with the section so future host-impacting fallbacks (UI, outside-in, etc.) can land as siblings without re-shuffling — and so an operator who has a different answer per axis isn't forced into a coupled one. Open to going coarser if you'd rather have a single root-level consent gate.

Comment thread docs/schema.md
}
```

### Filesystem Policy

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This document does not define all policies. Adding filesystem is ragged. We should probably add an issue to add documentation on all of the schema sections.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Filed #285 to track full schema documentation coverage. Will keep this PR's scope limited to the new allowDaclFallback field.

@microsoft-github-policy-service microsoft-github-policy-service Bot added Needs-Author-Feedback Issue needs attention from issue or PR author Needs-Attention Issue needs attention from Microsoft and removed Needs-Author-Feedback Issue needs attention from issue or PR author labels May 12, 2026
@MGudgin MGudgin force-pushed the user/gudge/downlevel_phase0 branch from f86d586 to e1fb78c Compare May 12, 2026 19:42
@MGudgin MGudgin changed the title phase0: add filesystem.allowDaclFallback config option phase0: add fallback.allowDaclMutation config option May 12, 2026
Introduces a new top-level `fallback` section on the MXC dev schema
(0.6.0-dev), with a single occupant: `allowDaclMutation` (default: true).
When the BaseContainer OS API is absent and bfscfg.exe is unavailable,
MXC may fall back to applying DACL ACEs directly on policy paths
(Tier 3 fallback). Because this modifies host filesystem security
descriptors, operators need a way to refuse the fallback even though
the original DACLs are restored on exit.

The fallback section names operator consent for host-impacting
containment fallbacks. It is intentionally a section rather than a
filesystem-scoped flag so future host-mutating fallbacks can land
alongside as siblings without re-shuffling.

The default is true so that pre-GE Windows 11 builds - which currently
have no other downlevel containment path - continue to work out of the
box. Setting the field to false causes runs that would require Tier 3
to fail fast with a clear error (wired up in a later phase).

Plumbed through:

- schemas/dev/mxc-config.schema.0.6.0-dev.json (new top-level fallback
  object with allowDaclMutation property)

- RawFallback in config_parser.rs (serde struct, optional on both
  RawConfig and the state-aware request envelope)

- FallbackPolicy in models.rs (new struct with manual Default impl so
  allow_dacl_mutation defaults to true); ContainerPolicy gains a
  fallback: FallbackPolicy field

- Mapping in load_request copies the value through, preserving the true
  default when the field is omitted

- Three new unit tests covering default, explicit-true, explicit-false

- docs/schema.md updated with a new Fallback Policy section

No runner code is touched in this phase; consumers of
fallback.allow_dacl_mutation are added in subsequent phases.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@MGudgin MGudgin force-pushed the user/gudge/downlevel_phase0 branch from e1fb78c to ef387e8 Compare May 12, 2026 19:57
@MGudgin MGudgin merged commit 22fe99e into main May 12, 2026
8 checks passed
@MGudgin MGudgin deleted the user/gudge/downlevel_phase0 branch May 12, 2026 20:11
@microsoft-github-policy-service microsoft-github-policy-service Bot removed the Needs-Attention Issue needs attention from Microsoft label May 12, 2026
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.

2 participants