Skip to contentSkip to conversation

How to temporary change 'current' (task)

DISCUSSION Vasiliy Kulikov 4 participants 7 messages Jun 17, 2011

lore
Share & tools
lore
#0 lore raw

Hi,

I wonder whether there is a simple way to temporary switch 'current' to another task and then switch it back with minimum side effects? I need it to call "reversed" ptrace_may_access() with swapped current and target task. Introducing ptrace_task_may_access_me() would produce too much noise in LSM (it also needs reversed security_ptrace_access_check()), which is too loud for my needs.

Specifically, I need it to filter taskstats and proc connector requests for a restriction of getting other processes' information:

http://permalink.gmane.org/gmane.linux.kernel/1155354

As the check is handled in the context of the ptrace target process, ptrace_may_access() doesn't fit my needs.

Thanks,

Signature · 1 line
Vasiliy
#1 lore raw

Vasiliy,

Quoted 2 lines · Vasiliy Kulikov

I wonder whether there is a simple way to temporary switch 'current' to another task and then switch it back with minimum side effects?

I strongly recommend that we don't. Doing so would introduce security risks similar to what we saw with set_fs(USER_DS). Even if you implement everything right and safely, you would set an extremely bad precedent, encouraging others to do risky things like that. Under the security hardening project, we should be moving the kernel away from those things, not introducing more of them.

So you need to find another way to achieve your objective (or maybe choose not to achieve it).

...and you meant "temporarily". ;-)

Sorry for not answering your question directly (I don't know the answer), yet I hope this opinion helps.

Alexander

#2 lore raw
Quoted 10 lines · Solar Designer
Quoted 2 lines · Vasiliy Kulikov

I wonder whether there is a simple way to temporary switch 'current' to another task and then switch it back with minimum side effects?

I strongly recommend that we don't. Doing so would introduce security risks similar to what we saw with set_fs(USER_DS). Even if you implement everything right and safely, you would set an extremely bad precedent, encouraging others to do risky things like that. Under the security hardening project, we should be moving the kernel away from those things, not introducing more of them.

Yes, you might be right, but it looks like the most simple solution. In the netlink listeners case the task triggers a broadcast message (on exec(), fork(), setuid(), etc.) and delivers the message to the listeners. The official way to filter these messages (actually, skbs) is providing a filter function to netlink_broadcast_filter(). This filter would do ptrace_may_access()-like check. The check would be processes in the context of the emmitter process (ptrace target).

Arbitrary filtering on the receivers' side looks technically rather difficult and unreasonable to me and unlikely to be applied.

Much more simple, but dubious solution is disabling such netlink sockets for unprivileged users. This would deny harmless process tracking for the same user without any actual need.

Thanks,

Signature · 1 line
Vasiliy
#3 lore raw
Quoted 4 lines · Vasiliy Kulikov
Quoted 3 lines · Solar Designer
Quoted 2 lines · Vasiliy Kulikov

I wonder whether there is a simple way to temporary switch 'current' to another task and then switch it back with minimum side effects?

BTW, as HARDEN_PROC restricts not only procfs, but also netlink sockets, it should be moved into sysctls. I think about (according to already implemented dmesg_restricted and kptr_restricted):

kernel.proc_restricted

kernel.proc_restricted_gid

And, as net restriction is no more associated with proc restrictions:

net.core.conninfo_restricted

net.core.conninfo_restricted_gid

Thanks,

Signature · 2 lines
Vasiliy Kulikov
http://www.openwall.com - bringing security into open computing environments
#4 lore raw
Quoted 3 lines · Vasiliy Kulikov

kernel.proc_restricted

kernel.proc_restricted_gid

Or even kernel.procinfo_restricted{,gid}.

Signature · 2 lines
Vasiliy Kulikov
http://www.openwall.com - bringing security into open computing environments
#5 lore raw
In reply to Vasiliy Kulikov
Quoted 4 lines · Vasiliy Kulikov

Hi,

I wonder whether there is a simple way to temporary switch 'current' to another task and then switch it back with minimum side effects?

No.

Quoted 6 lines

I need
it to call "reversed" ptrace_may_access() with swapped current and target task. Introducing ptrace_task_may_access_me() would produce too much noise in LSM (it also needs reversed security_ptrace_access_check()), which is too loud for my needs.

Quoted 7 lines

Specifically, I need it to filter taskstats and proc connector requests for a restriction of getting other processes' information:

http://permalink.gmane.org/gmane.linux.kernel/1155354

As the check is handled in the context of the ptrace target process, ptrace_may_access() doesn't fit my needs.

looking at __ptrace_may_access() it doesn't look too hard to make it take two task arguments and use __task_cred() twice instead of current_cred().

It of course needs extending security_ptrace_access_check() as well, but that comes with the territory.

#6 lore raw
Quoted 5 lines · Peter Zijlstra
Quoted 2 lines · Vasiliy Kulikov

I wonder whether there is a simple way to temporary switch 'current' to another task and then switch it back with minimum side effects?

No.

After a moment's thought, it would also break some synchronization that relies on some structures are accesses only from the current task.

Quoted 14 lines
Quoted 6 lines

I need
it to call "reversed" ptrace_may_access() with swapped current and target task. Introducing ptrace_task_may_access_me() would produce too much noise in LSM (it also needs reversed security_ptrace_access_check()), which is too loud for my needs.

Quoted 7 lines

Specifically, I need it to filter taskstats and proc connector requests for a restriction of getting other processes' information:

http://permalink.gmane.org/gmane.linux.kernel/1155354

As the check is handled in the context of the ptrace target process, ptrace_may_access() doesn't fit my needs.

Quoted 6 lines

looking at __ptrace_may_access() it doesn't look too hard to make it take two task arguments and use __task_cred() twice instead of current_cred().

It of course needs extending security_ptrace_access_check() as well, but that comes with the territory.

Well, yes, but it implies pushing explicit ptrace actor into LSM modules. OK, it should be not as noisy as I initially thought - almost all current LSMs already use "current" as an explicit argument in theirs internal functions.

Thank you,

Signature · 1 line
Vasiliy