Skip to content

AppArmor profile enforcement unconditionally skipped in rootless mode #796

@phil-02

Description

@phil-02

Summary

pkg/apparmor/internal/supported/supported.go returns "AppArmor is not supported on rootless containers" unconditionally when unshare.IsRootless() is true. The comment in apparmor_linux.go justifies this as "requires root", but aa_change_onexec() operates by writing to /proc/self/attr/exec — this does not require elevated privileges and works from unprivileged processes on kernels that support it.

The result is that podman info reports apparmorEnabled: false on rootless systems with AppArmor fully operational, and apparmor_profile in containers.conf is silently ignored.

Affected files

  • pkg/apparmor/internal/supported/supported.goIsSupported() hard-gates on IsRootless()
  • pkg/apparmor/apparmor_linux.go — lines 86–87, 152–153, 265–269

Comparison with Docker

Docker applies docker-default to all containers automatically. Switching to rootless Podman silently removes this layer without warning.

Proposed fix

Replace the unconditional IsRootless() guard with a runtime capability probe:

  1. Attempt aa_change_onexec() with a known-loaded profile in a test exec
  2. If it succeeds, AppArmor is usable in this rootless context
  3. If it returns EPERM/EACCES, fall back gracefully and log a clear warning

This respects kernel-level restrictions (apparmor_restrict_unprivileged_unconfined) without hardcoding a blanket "rootless = no AppArmor" rule. The existing verifierImpl interface already provides the right abstraction for mocking this in tests.

Environment

  • containers/common: 0.57.4
  • Kernel: 6.17.0 (Ubuntu)
  • apparmor_restrict_unprivileged_unconfined: 0
  • apparmor_restrict_unprivileged_userns: 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    commonRelated to "common" package

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions