[Python-Dev] Possible bugs and security holes in getpass.py

Jeff Epler jepler at unpythonic.net
Mon Dec 1 22:55:16 EST 2003


On Mon, Dec 01, 2003 at 06:53:18PM -0800, Oleg Zabluda wrote:
> I am comparing getpass.py
> (http://cvs.osafoundation.org/index.cgi/osaf/chandler/python/Lib/getpass.py)
> and getpass.c from glibc
> (http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/misc/getpass.c?rev=1.18&content-type=text/x-cvsweb-markup&cvsroot=glibc).

Many of the differences you cite seem related to glibc-specific
internals (I don't know what it means to 'lock "stdin"', open 'in "c"
mode', or 'set _IO_FLAGS2_NOTCANCEL', when talking about portable stdio
code, though I'm not a posix/SuS expert).  glibc-specific code is
unlikely to be included in Python, for obvious reasons.

> 4. getpass.c explicitly flushes "stdin" after outputting the promt and before
>    reading the password.

In 2.2, I think the marked lines are supposed to perform those
functions:
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new) ### HERE
        passwd = _raw_input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old) ### HERE

> Suggestion/RFC: either implement the same functionality or a portion
> thereof in getpass.py, or implement it using getpass(3) directly, at least
> when linking with glibc.

I think that a _getpass module on systems that provide getpass(3) would
be appropriate.  The block at the bottom of getpass.py would have
another level added to deal with the import of _getpass and its absence:

try:
   import _getpass
except:
   existing block, but indented more
else:
   getpass = _getpass.getpass

There's probably nothing subtle about writing _getpassmodule.c, and
distutils should be able to handle its absence gracefully (?).

Before I'm +1 on doing this, though, here's what the linux (redhat 9)
manpage has to say about getpass:
        SYNOPSIS
               #include <unistd.h>

               char *getpass( const char * prompt );

        DESCRIPTION
               This function is obsolete. Do not use it.
                                ^^^^^^^^
The opengroup web page you mention says it is "LEGACY", with this
explanation:
        This function was marked LEGACY since it provides no functionality
        which a user could not easily implement, and its name is
        misleading.
... how important is getpass, and did the opengroup really
underestimate the subtlety of its implementation that greatly?

Jeff



More information about the Python-Dev mailing list