SECURITY
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:11k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1.                               SqWebMail security
  2.                                        
  3.    This document discloses security-oriented issues regarding the
  4.    SqWebMail CGI application.
  5.    
  6.    In this document:
  7.      * User IDs and Passwords
  8.      * Mailbox IDs
  9.      * Authentication
  10.      * Browser Security - History
  11.      * Browser Security - Caching
  12.      * Browser Security - HTML
  13.      * Browser Security - Referer: Tags
  14.      * Sending Mail
  15.      * Setuid Root
  16.        
  17. User IDs and Passwords
  18.    SqWebMail's security scheme requires a valid userid/password to access
  19.    an account. The actual method for validating the userid and password
  20.    is a black-box module that can be easily replaced. The example
  21.    black-box implementation uses the PAM library, if available, or with
  22.    the /etc/passwd, /etc/shadow and the crypt() function.
  23.    
  24.    It is possible to configure SqWebMail to transmit the userid and
  25.    password via secure HTTP. If secure HTTP is not available, the userid
  26.    and password is transmitted over the network in the clear, which can
  27.    be picked up by a sniffer. SqWebMail supports an alternate password
  28.    which is stored in a file in the Maildir directory. The file has read
  29.    and write permissions to the user only. If the alternate password is
  30.    compromised, only SqWebMail recognizes it, and only access to the
  31.    private mail will be available. Access to the main account will not be
  32.    compromised, if the account password is different.
  33.    
  34. Mailbox IDs
  35.    After a userid and password is authenticated, the authentication
  36.    module returns a 'mailboxid'. The mailboxid is used as a handle for
  37.    the mailbox. A mailboxid may not necessarily be the same as the
  38.    userid, but the sample authentication modules make them the same.
  39.    
  40.    Technically, the mailboxid that's generated by recent versions of
  41.    sqwebmail are of the form "userid.method", where method represents the
  42.    authentication module that was used.
  43.    
  44.    A mailboxid is sent with every HTTP request, in the request itself.
  45.    Note that the mailboxid is transmitted over the network in the clear.
  46.    It is also possible to use secure HTTP for the every HTTP request, not
  47.    just initial authentication, but this has not been tested.
  48.    
  49.    Unless the mailboxid is the same as a userid, there aren't many
  50.    security considerations in having the mailboxid broadcasted over the
  51.    network. That's because the mailboxid in the HTTP request is usually
  52.    validated based on a time-limited IP address (see "Authentication").
  53.    Note that there certain other potential ways - in addition to network
  54.    traffic sniffing - for an unauthorized party to attempt to grab
  55.    mailboxids. See "Browser Security - HTML", and "Browser Security -
  56.    Referrer: Tags".
  57.    
  58. Authentication
  59.    Once the user ID and password are authenticated, authentication for
  60.    subsequent HTTP requests is based on a combination of an IP address,
  61.    plus a 128-bit random number that was generated during the login.
  62.    
  63.    By default, SqWebMail permits access to the mailbox only from the same
  64.    IP address as the one where the user ID and password was authenticated
  65.    from. This can be selectively turned off at login time, in cases where
  66.    the client is behind a load-balancing firewall that uses multiple IP
  67.    addresses. In all cases, a 128-bit random number must be transmitted
  68.    with every HTTP request, and it must match the number generated during
  69.    the login, which is saved in the Maildir directory.
  70.    
  71.    The Maildir directory must therefore have any group or world access
  72.    rights disabled. Additionally, every page served by SqWebMail includes
  73.    HTTP headers containing instructions to proxies and browsers that
  74.    prohibit this page from being cached. There are some buggy web
  75.    browsers out there - most of them originating in Redmond,WA - that
  76.    ignore these caching directives, and they end up saving the 128-bit
  77.    random number in the local cache. Unless access to the physical
  78.    machine is secured, the local cache can be trawled to obtain the
  79.    128-bit authentication token.
  80.    
  81.    However, access to the mailbox is allowed only for a maximum period of
  82.    time after the initial authentication. Access is allowed only if the
  83.    HTTP requests come within a different, shorter period of time. If no
  84.    access requests have been made for a certain period of time, access
  85.    will no longer be available even if it comes from the right IP
  86.    address, with the right authentication token.
  87.    
  88.    The IP address of the initial authentication, the dates and times
  89.    involved, are all stored in files in the maildir directory, with group
  90.    and world permissions turned off.
  91.    
  92. Browser Security - History
  93.    In certain situations a mailboxid is a part of the actual URL
  94.    requested. A browser may maintain a history file of visited URLs.
  95.    
  96.    SqWebMail uses a frame window in an attempt to keep the browser from
  97.    recording visited URLs. This approach works for most popular web
  98.    browsers that support frames - these browsers do not maintain history
  99.    for individual frames. Note that frames are not required to access the
  100.    full SqWebMail functionality.
  101.    
  102. Browser Security - Caching
  103.    SqWebMail sets the expiration header on every HTTP page it serves.
  104.    Individual pages contain URLs and hidden fields with mailboxids. The
  105.    expiration header should keep the web pages from being saved in the
  106.    browser cache.
  107.    
  108. Browser Security - HTML
  109.    SqWebMail has the ability to display HTML E-mail, which leads to
  110.    several complicated situations regarding embedded Javascript or Java
  111.    applets that try to grab the mailboxid of the recipient (amongst other
  112.    things). SqWebMail attempts to remove all forms of scripting from HTML
  113.    E-mail as follows:
  114.      * The following HTML tags are removed: <SCRIPT>, </SCRIPT>, <APP>,
  115.        </APP>, <APPLET>, </APPLET>, <SERVER>, </SERVER>, <OBJECT>,
  116.        </OBJECT>, <HTML>, </HTML>, <HEAD>, </HEAD>, <BODY>, </BODY>,
  117.        <META>, <TITLE>, </TITLE>, <FRAME>, </FRAME>, <LINK>, <IFRAME> and
  118.        </IFRAME>.
  119.      * The following HTML attributes are stripped from every tag:
  120.        ONLOAD=, ONMOUSEOVER=, and all ON*= attributes; TARGET=, CODE=,
  121.        CODETYPE=, and LANGUAGE= are removed; TARGET=_blank is added to
  122.        all <A> tags.
  123.      * The HREF and SRC attributes are stripped, unless the URL starts
  124.        with one of the following: http:, https:, ftp:, gopher:, wais:, or
  125.        telnet, and cid:.
  126.      * The HREF and SRC attribute values are prefixed with a URL that
  127.        will resolve to SqWebMail, and with an additional TARGET="_blank"
  128.        attribute. A request to that resulting URL will result in a blank
  129.        page with a 0-second refresh to the original URL. This method
  130.        strips mailbox IDs from Referer: tags sent to external web site.
  131.        If the HREF attribute starts with a cid:, it is replaced by an
  132.        http: reference to SqWebMail that will return the specified MIME
  133.        part.
  134.      * IMG tags are removed and replaced with an A tag, in order to keep
  135.        the HTTP client from automatically loading any images from
  136.        external web sites, upon opening a given message.
  137.        
  138. Browser Security - Referer: Tags
  139.    See the previous section regarding how SqWebMail attempts to remove
  140.    mailbox IDs from Referer: tags.
  141.    
  142. Sending Mail
  143.    SqWebMail includes the ability to send mail. Issues regarding
  144.    transmitting E-mail from the HTTP client to the server are obvious.
  145.    SqWebMail runs a wrapper shell script in order to send the E-mail
  146.    message. The wrapper shell script normally runs qmail-inject,
  147.    sendmail, or something else, immediately. SqWebMail prepares a
  148.    complete E-mail message.
  149.    
  150.    SqWebMail depends on the mail server to read the headers for
  151.    recipients and to strip out the Bcc: header. SqWebMail uses the
  152.    black-box authentication module to set the contents of the From:
  153.    header and provide the envelope return address.
  154.    
  155.    The IP address of the HTTP client is not inserted into the headers,
  156.    however the wrapper and the mail server are invoked under the userid
  157.    of an authenticated user. The wrapper shell script can be modified to
  158.    insert the IP address, if so desired. The wrapper shell script has
  159.    access to the CGI REMOTE_ADDR environment variable.
  160.    
  161. Setuid Root
  162.    SqWebMail is invoked by the web server to handle each HTTP request.
  163.    SqWebMail must assume permissions of the mail client in order to be
  164.    able to access its mailbox. Additionally, SqWebMail must be able to
  165.    authenticate access passwords. For both of these reasons SqWebMail has
  166.    to be installed as a setuid root program.
  167.    
  168.    When virtual mailboxes are being used, it is possible to install
  169.    SqWebMail setuided to the virtual userid, instead of root. For that to
  170.    work, each account's Maildir must be created with the account password
  171.    already saved in Maildir/sqwebmail-webpass file, or a virtual domain
  172.    mechanism like vchkpw must be used.
  173.    
  174.    On some platforms this may not work without some additional tweaking.
  175.    If authenticating with sqwebmail setuided to the virtual userid
  176.    doesn't work:
  177.      * Verify that the password has been correctly set.
  178.      * Remove the source file authlib/changeuidgid.c. Replace everything
  179.        in that file with the following three lines of code, exactly as
  180.        shown:
  181. void authchangegroup() {}
  182. void authchangeuidgid() {}
  183. void authchangeusername() {}
  184.      * Recompile and reinstall.
  185.        
  186.    Immediately upon starting, SqWebMail's activity as root is as follows:
  187.      * Determine if the HTTP request is a request from a client that's
  188.        already logged in. The other possibilities are the login request
  189.        itself, or a couple of requests which are used to show the initial
  190.        login screen. This is determined by the presence of the extra path
  191.        in the HTTP request. This approach avoids the need to parse HTTP
  192.        arguments. If the extra path containing the login ID is present,
  193.        the login ID is extracted, SqWebMail changes to the account's
  194.        Maildir directory, and gives up root. The CGI environment is read,
  195.        and the request is authenticated (see Authentication, above).
  196.      * If it's a login screen, the appropriate forms are generated.
  197.      * If it's a login request, SqWebMail makes sure that the request
  198.        format is NOT a multipart/formdata POST, which takes the most
  199.        amount of code to interpret. Additionally, requests indicating
  200.        more than 128 bytes of posted data are rejected prior to even
  201.        parsing them. Barring all that, the userid/password is fetched
  202.        from the request, and processed. The multipart/formdata check
  203.        shouldn't be necessary given a 64 byte upper limit on
  204.        unauthenticated requests, but it can't hurt.