pam_limits module bug and its effects on pam applications
Joachim Falk
joachim.falk at gmx.de
Thu May 30 09:56:59 EST 2002
On 2001-10-26 at 13:35:50 Nicolas Williams <Nicolas.Williams at ubsw.com> wrote:
> On Fri, Oct 26, 2001 at 02:11:13PM +0200, Markus Friedl wrote:
> > On Fri, Oct 26, 2001 at 10:14:21AM +1000, Damien Miller wrote:
> > > On Thu, 25 Oct 2001, Ed Phillips wrote:
> > >
> > > > What is the reasoning behind this? Do we want to see a lastlog entry for
> > > > "ssh" whenever a user runs remote command? Do other OSes have
> > > > pam_open_session that does more meaningful things than Solaris 8?
> > > > Well... I guess the more I think about it, it's probably better to go
> > > > ahead an call pam_open_session even for the non-interactive case since
> > > > someone might want to implement a PAM module at their site that logs every
> > > > ssh connection... and if we don't call pam_open_session, then they don't
> > > > even have that capability if they wanted it.
> > >
> > > Some people set rlimits using session modules. Someone even filed a Bugtraq
> > > report about it.
> >
> > is this the right way?
>
> It's *a* right way.
>
> > isn't this an abuse of the PAM module? (perhaps file a Bugtraq report...)
>
> Why would it be?
On 2001-09-07 at 21:21:10 Nalin Dahyabhai <nalin at redhat.com> wrote:
> On Wojtek Pilorz <wpilorz at bdk.pl> wrote:
> > On Wed, 5 Sep 2001, Nalin Dahyabhai wrote:
> > > Date: Wed, 5 Sep 2001 17:31:10 -0400
> > > From: Nalin Dahyabhai <nalin at redhat.com>
> > > To: Ognyan Kulev <ogi at fmi.uni-sofia.bg>
> > > Cc: openssh-unix-dev at mindrot.org
> > > Subject: Re: pam_limits and OpenSSH
> > >
> > > On Wed, Sep 05, 2001 at 04:53:05PM +0300, Ognyan Kulev wrote:
> > > > Perhaps the daemon first sets process limits and then switches to the
> > > > user and/or fork(). But fork() cannot succeed because there is a
> > > > process number limit to 40 that is applied to root. This is my
> > > > hypothesis. I didn't look at sources. What you think about all this?
> > > > Do you need more information? I use Debian GNU/Linux potato and OpenSSH
> > > > 1.2.3-9.3.
> > >
> > > This is exactly the case. The process limit is set while the server
> > > is still running as the superuser, so it can't fork() to start the
> > > child (which would then do a setuid() to the user's ID).
> > >
> > > Opening the PAM session after performing the fork() and setuid() fixes
> > > this for pam_limits, but breaks other modules which expect to be running
> > > with superuser privileges when their pam_open_session() handlers are
> > So what about opening PAM session after performing fork but before
> > setuid() ? Would it be correct ?
> It's been a while since I looked at what's going on in that area of
> the tree, but IIRC the child exec()s the user's shell, and opening
> the session in the child makes it difficult for the parent to close
> the session when the user logs out. This depends on which modules
> are in use, though -- some modules handle this sort of situation
> just fine, while others will just fail.
> >
> > > called. This was the crux of the whole pam_open_session mess from a few
> > > months ago -- my apologies for setting it in motion.
> > >
> > > Other process limits are going to have similar effects on sshd, and I
> > > don't see a clean way to handle process limits within PAM in this case.
> > >
> > > Hope this cleared things up a bit,
> > >
> > > Nalin
> > >
> > Best regards,
A pam module which sets resource limits in pam_sm_open_session is
just inherently broken. There is no way to fulfill 2 contradictory
requirements to make this work.
We have the following requirements:
1) pam_sm_open_session & pam_sm_close_session
must be called as root
> > > Opening the PAM session after performing the fork() and setuid() fixes
> > > this for pam_limits, but breaks other modules which expect to be running
> > > with superuser privileges when their pam_open_session() handlers are
2) pam_sm_open_session & pam_sm_close_session
must be called in the same process
> It's been a while since I looked at what's going on in that area of
> the tree, but IIRC the child exec()s the user's shell, and opening
> the session in the child makes it difficult for the parent to close
> the session when the user logs out. This depends on which modules
> are in use, though -- some modules handle this sort of situation
> just fine, while others will just fail.
The contradictory requirement:
3) There must not be a fork as root after calling pam_sm_open_session
> > > > Perhaps the daemon first sets process limits and then switches to the
> > > > user and/or fork(). But fork() cannot succeed because there is a
> > > > process number limit to 40 that is applied to root. This is my
> > > > hypothesis. I didn't look at sources. What you think about all this?
> > > > Do you need more information? I use Debian GNU/Linux potato and OpenSSH
> > > > 1.2.3-9.3.
I suggest to fix pam_limits to implement limits setting in pam_sm_setcred:
The flow would than be:
parent: child:
(sshd daemon) (sshd daemon later
user shell/command)
pam_start
|
v
pam_authenticate
|
v
pam_open_session
|
v
fork ------------------------------------------+
| |
v v
wait for child to finish pam_setcred to establish credentials
| |
v v
pam_close_session setuid/gid to authenticated user
| |
v v
pam_setcred call to cleanup credentials exec shell/command
|
v
pam_end
But this requires that pam_setcred( pamh, PAM_ESTABLISH_CRED)
and pam_setcred( pamh, PAM_DELETE_CRED ) can be called in different
processes. If this is not the case i don't know of a way to ever
implement resource limit settings in a reliable way.
--
More information about the openssh-unix-dev
mailing list