[pkg-apparmor] Bug#1100135: Bug#1100135: Conflict between Podman Profile and Pasta profile breaks rootless network shutdown

intrigeri intrigeri at debian.org
Wed Mar 12 13:41:14 GMT 2025


Hi Sam, Stefano, others,

(almost fully quoting because the Sam's original report Cc'ed
pasta at packages.debian.org, while I believe he meant to write to
passt at packages.debian.org)

Sam Hartman (2025-03-11):
> Recently I started running into the following error shutting down
> containers with podman stop:
>
> 	* rootless netns: kill network process: permission denied
>         This error is produced by
>         golang-github-containers-common/libnetwork/internal/rootlessnetns/netns_linux.go
>         in the cleanup function:
>         	if err := n.cleanupRootlessNetns(); err != nil {
> 		multiErr = multierror.Append(multiErr, wrapError("kill network process", err))
> 	}
>
> And that function effectively just finds and kills the pasta or
> slirp4netns process:
> 	if err == nil {
> 		// kill the slirp/pasta process so we do not leak it
> 		err = unix.Kill(pid, unix.SIGTERM)
> 		if err == unix.ESRCH {
> 			err = nil
> 		}
>
> Looking at my kernel logs, I see that
> [  462.337636] audit: type=1400 audit(1741711021.533:118): apparmor="DENIED" ope
> ration="signal" class="signal" profile="pasta" pid=4552 comm="exe" requested_mas
> k="receive" denied_mask="receive" signal=term peer="podman"
> In other words, apparmor is preventing podman from cleaning up pasta.
>
> Podman is effectively supposed to be unconfined:
> Quoting /etc/apparmor.d/podman:
> # This profile allows everything and only exists to give the
> # application a name instead of having the label "unconfined"
>
> Although it turns out it's not really true that  podman can do anything
> because it turns out that the base abstraction specifically special
> cases the unconfined profile:
> (quoting /etc/apparmor.d/base)
>
>   # Allow unconfined processes to send us signals by default
>   signal (receive) peer=unconfined,
>
>   # Allow us to signal ourselves
>   signal peer=@{profile_name},
>
>   # Checking for PID existence is quite common so add it by default for now
>   signal (receive, send) set=("exists"),
>
>
> So, in other words, podman could send the signal if it were in the
> unconfined profile, but cannot because it has a profile at all.

Thank you Sam for educating me! I did not remember we had these rules
for unconfined processes.

> There's clearly a race condition involved somewhere. Some of my
> containers exhibit this behavior, but some do not.
> However, once it starts happening, it keeps happening, and it is common
> enough that it is breaking a lot of automation.
>
>
>
> On the apparmor side, I'd like to either see the bogus/empty podman
> profile removed   or to see signals from podman permitted by the pasta
> profile.

Thank you Sam for having gone to great lengths to investigate the
problem you were experiencing, up to the point where you could propose
these solutions.

I agree we should do 1 of those.

I would prefer we modify the pasta profile to allow signals
from podman, for 2 reasons:

 - It'll be necessary on Ubuntu, where removing the podman profile is
   not an option. It's not needed *yet* solely because the profile is
   not included in the Ubuntu package, which I'm guessing is a mistake
   that will be fixed at some point
   (https://bugs.launchpad.net/ubuntu/+source/passt/+bug/2077158).
   So we can as well fix this proactively. And the fix should probably
   be upstreamed.

 - It's 1 tiny but still useful step towards being able to some day
   stop accepting signals from unconfined processes.

Stefano, what do you think?

I believe this (untested) rule should do the job:

  signal (receive) peer=podman,

If we don't do that, then I'm fine with removing the podman profile,
which has limited value anyway in the context of Debian.

Cheers,
-- 
intrigeri



More information about the pkg-apparmor-team mailing list