SqWebMail security
This document discloses security-oriented issues regarding the SqWebMail
CGI application.
In this document:
* [1]User IDs and Passwords
* [2]Mailbox IDs
* [3]Authentication
* [4]Browser Security - History
* [5]Browser Security - Caching
* [6]Browser Security - HTML
* [7]Browser Security - Referer: Tags
* [8]Sending Mail
* [9]Setuid Root
User IDs and Passwords
SqWebMail's security scheme requires a valid userid/password to access an
account. The actual method for validating the userid and password is a
black-box module that can be easily replaced. The example black-box
implementation uses the PAM library, if available, or with the
/etc/passwd, /etc/shadow and the crypt() function.
It is possible to configure SqWebMail to transmit the userid and password
via secure HTTP. If secure HTTP is not available, the userid and password
is transmitted over the network in the clear, which can be picked up by a
sniffer.
Mailbox IDs
After a userid and password is authenticated, the authentication module
returns a 'mailboxid'. The mailboxid is used as a handle for the mailbox.
A mailboxid may not necessarily be the same as the userid, but the sample
authentication modules make them the same.
Technically, the mailboxid that's generated by recent versions of
sqwebmail are of the form "userid.method", where method represents the
authentication module that was used.
A mailboxid is sent with every HTTP request, in the request itself. Note
that the mailboxid is transmitted over the network in the clear. It is
also possible to use secure HTTP for the every HTTP request, not just
initial authentication, but this has not been tested.
Unless the mailboxid is the same as a userid, there aren't many security
considerations in having the mailboxid broadcasted over the network.
That's because the mailboxid in the HTTP request is usually validated
based on a time-limited IP address (see "[10]Authentication"). Note that
there certain other potential ways - in addition to network traffic
sniffing - for an unauthorized party to attempt to grab mailboxids. See
"[11]Browser Security - HTML", and "[12]Browser Security - Referrer:
Tags".
Authentication
Once the user ID and password are authenticated, authentication for
subsequent HTTP requests is based on a combination of an IP address, plus
a 128-bit random number that was generated during the login.
By default, SqWebMail permits access to the mailbox only from the same IP
address as the one where the user ID and password was authenticated from.
This can be selectively turned off at login time, in cases where the
client is behind a load-balancing firewall that uses multiple IP
addresses. In all cases, a 128-bit random number must be transmitted with
every HTTP request, and it must match the number generated during the
login, which is saved in the Maildir directory.
The Maildir directory must therefore have any group or world access rights
disabled. Additionally, every page served by SqWebMail includes HTTP
headers containing instructions to proxies and browsers that prohibit this
page from being cached. There are some buggy web browsers out there - most
of them originating in Redmond,WA - that ignore these caching directives,
and they end up saving the 128-bit random number in the local cache.
Unless access to the physical machine is secured, the local cache can be
trawled to obtain the 128-bit authentication token.
However, access to the mailbox is allowed only for a maximum period of
time after the initial authentication. Access is allowed only if the HTTP
requests come within a different, shorter period of time. If no access
requests have been made for a certain period of time, access will no
longer be available even if it comes from the right IP address, with the
right authentication token.
The IP address of the initial authentication, the dates and times
involved, are all stored in files in the maildir directory, with group and
world permissions turned off.
Browser Security - History
In certain situations a mailboxid is a part of the actual URL requested. A
browser may maintain a history file of visited URLs.
SqWebMail uses a frame window in an attempt to keep the browser from
recording visited URLs. This approach works for most popular web browsers
that support frames - these browsers do not maintain history for
individual frames. Note that frames are not required to access the full
SqWebMail functionality.
Browser Security - Caching
SqWebMail sets the expiration header on every HTTP page it serves.
Individual pages contain URLs and hidden fields with mailboxids. The
expiration header should keep the web pages from being saved in the
browser cache.
Browser Security - HTML
SqWebMail has the ability to display HTML E-mail, which leads to several
complicated situations regarding embedded Javascript or Java applets that
try to grab the mailboxid of the recipient (amongst other things).
SqWebMail attempts to remove all forms of scripting from HTML E-mail as
follows:
* The following HTML tags are removed: , ,
, , , , ,
, ,