I've completed my initial security review of the project. Of course, there is
no CVE history due to the project being new. The project consists of a fairly
simple PAM module and a helper application that uses the libfreerdp API to
authenticate to a remote RDP server.

I've given libpam-freerdp code a shallow security review. This should not be
considered a thorough code audit because I only looked for some of the more
common security issues. Some issues that I found in pam-freerdp.c are:

 * A named socket is created as root, inside of user home directories. There
   are quite a few things that can go wrong when a privileged process is doing
   things inside of a user-controlled directory.
    
   For example, there is currently a race condition between the call to bind()
   and the call to chmod(). After the bind(), the user could unlink
   $HOME/.freerdp-socket, a symlink could be created in its place that points
   to /etc/passwd, and then the chmod() would make /etc/passwd owned by the
   user.
    
   Please move all of the socket-based code after the fork() and set*id() calls.

 * The return values of malloc(), strdup(), mlock() and snprintf() are not
   checked.

 * Memory containing a copy of PAM_AUTHTOK should be memset() with 0's prior to
   munlock()/free().

 * It is a good idea to clear the environment, using clearenv(), when dropping
   privileges after fork().

 * It is a good idea to also drop all extra supplementary groups, using
   setgroups(1, &pwdent->pw_gid), when dropping privileges after fork().

 * The handling of session_pid doesn't look right to me. Do we really want to
   blindly kill a PID that we stored in a global variable at some point in the
   past? I think there are probably PID wrap around issues here.

 * The use of static global variables is not recommended by the PAM
   documentation. According to PAM_SET_DATA(3), "PAM modules may be dynamically
   loadable objects. In general such files should not contain static
   variables."
    
   Could everything in pam_sm_open_session() be moved to pam_sm_authenticate()
   to get rid of the need for the globals? If not, pam_set_data() should
   probably be used.

The issues that I found in freerdp-auth-check.c are:

 * pam-freerdp.c mlocks password buffers, but freerdp-auth-check.c
doesn't.

 * The freerdp ignore_certificate settings is set to true, which presumably
   disables certificate verification. I can't find any useful libfreerdp
   documentation, so I say 'presumably'. Since we're sending login credentials
   here, we really need to make proper use of encrypted protocols when
   possible.

   This setting should be set to false and it should be verified that TLS
   connections are attempted to be negotiated by default.

Security NAK while these items are being addressed. Please let me know if you
have any questions or if I misunderstood anything.


** Changed in: libpam-freerdp (Ubuntu)
     Assignee: Tyler Hicks (tyhicks) => (unassigned)

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1039634

Title:
  [MIR] libpam-freerdp

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/libpam-freerdp/+bug/1039634/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to