[apparmor] Note: NVIDIA drivers are mapping user-writable files by default

Vincas Dargis vindrg at gmail.com
Sun Feb 11 10:42:36 UTC 2018


On 2/8/18 11:25 PM, Jamie Strandboge wrote:
>> There is a choice to deny it.
> 
> Of course. My point was that an nvidia user of the profiled application
> is going to expect 3d acceleration from the drivers so a profile that
> is meant to work with nvidia should do that (but see below where I
> respond to your upstream docs). An admin or profile author can choose
> to use nvidia-strict, nvidia, neither, etc.
I'm afraid lazy profile writer might just include `nvidia` without 
needing to write `deny @{HOME}/#[0-9]*` manually. `aa-logprof` probably 
will suggest `nvidia` by default.

This will be better when (uhm, if?) overriding denies will be 
implemented though. `nvidia-strict` would deny, `nvidia` include and 
override to allow.

> For the named shared memory files, yes this is potentially an issue,
> but an exploitable issue would be a bug in the attacked application.

Well, AppArmor is promoted to provide protection from bugs: "enforcing 
good behavior and preventing even unknown application flaws from being 
exploited" [0] :)

> Applications using shared memory will use an unpredictable path to open
> with O_CREAT|O_EXCL, then unlink the file, then pass the fd to the
> processes it cares about coordinating with (look in /dev/shm now-- you
> won't see anything, as opposed to `sudo lsof|grep '/shm/'` which should
> show a lot if you have a browser open).
> 
> The paths chosen by the nvidia driver are not ideal, but in practice,
> barring bugs, it is mainly that there isn't perfect isolation between
> applications (ie, app A and app B can coordinate to share with the
> globbed file rules). The other thing it allows is that if an attacker
> took control of the profiled application, it could then write out files
> that could be mmap'd PROT_EXEC by the application. This is a valid
> point, but if you have that much control of the application you don't
> need to write out those files.
> 
> My point is that the abstractions are meant to be generally usable and
> erring on the side of security in an abstraction that is clearly meant
> to work with something such that it breaks that something, isn't useful
> to anyone. I also mentioned that these would need to be investigated,
> which you've done below, which I responded to.

About "The paths chosen by the nvidia driver are not ideal" - could we 
(try to) communicate with NVIDIA to suggest better solution? What could 
that be?

Meanwhile, if I understood correctly, improvement from AppArmor side 
could be introduced that would allow to specify rules for shared memory 
"stuff" only? So that allowing `owner [shared?] @{HOME}/#[0-9] rwm` 
would not actually allow to mmap "real" file?


>> I'm betting on this because it doesn't seem we have a lot of
>> graphic-intensive applications with AppArmor profile that might feel
>> a
>> hit due to disabled optional NVIDIA optimizations.
> 
> The AppArmor project doesn't nor does Ubuntu, Debian, OpenSUSE, Tails,
> etc, but there are consumers of apparmor that absolutely do (ie, there
> are a lot of games packaged as snaps, and snappy uses AppArmor).

True.

> With this information, I would then suggest adding comments to the
> nvidia abstraction on the above. Then someone profiling blender could
> see that and add the necessary rules to the blender profile for the
> optimizations.
> 
> So yes, whenever we get deny overrides, we could add deny rules to the
> nvidia abstraction to silence the denials, but not sooner IMO.
> 
>>
>>> I would instead suggest that *if* we wanted
>>> to split these accesses, we do something more like:
>>>
>>>    * abstractions/nvidia-strict: all the safe accesses
>>>    * abstractions/nvidia: #include nvidia-strict plus less desirable
>>>      accesses
>>>
>>> In this manner, profiles continue to work with new nvidia accesses,
>>> but
>>>    profilers can choose to do something more strict if they desire.
>>
>> So if profile includes `<abstractions/nvidia-strict>`, they would
>> have
>> to add these
>> `deny @{HOME}/#[0-8]* rwm`,
>> `deny /tmp/.gl* rwm`
>> manually, in addition to the include?
> 
> With what is available today, yes, but see above.

I guess I have to agree that probably the best we can do.

So to wrap up, plan would be:

1. Move `abstactions/nvidia` content into `nvidia-strict`. 
`nvidia-strict` should have comment that it does not provide some NVIDIA 
optimizations and some `deny` rules are recommended to be added 
manually. Else, suggest to use `nvidia` if really needed.

2. Create new `abstractions/nvidia` that includes `nvidia-strict`. Add a 
_big_ warning documenting that it provides NVIDIA optimization that 
could potentially reduce security, suggest to use `nvidia-strict` for 
non-performance-critical applications instead.

In the future:

3. Deny these optimizations in `nvidia-strict` by default, add overrides 
into `nvidia` abstraction when that's becomes possible.

ACK?

Any more alternatives?

[0] https://gitlab.com/apparmor/apparmor/wikis/home#description



More information about the AppArmor mailing list