Shell Programming and temporary files
I've been generally impressed with the coding standards that are enforced on C code in OpenSolaris, as checked by cstyle. However, similar automated checks don't exist for shell scripts. This, combined with a history of "/bin/sh is the one true shell", has led to inefficient scripts that very commonly have security vulnerabilities.
I'm hoping to breathe some life into this blog with a series of posts that describe some of the common problems and some potential solutions. I'll start with problems related to security problems with temporary files.
Consider the following bit of code taken from /usr/lib/lp/bin/lpadmin
.
293 # Do the LP configuration for a local printer served by lpsched 294 if [[ -x ${LPADMIN} && -n "${local}" ]] ; then 295 # enumerate LP configured printers before modification 296 PRE=/tmp/lpadmin-pre.$$ 297 (/bin/ls /etc/lp/printers 2>/dev/null ; /bin/ls /etc/lp/classes \ 298 2>/dev/null) >${PRE}
There are two problems here:
- A symbolic link vulnerability exists.
- The
TMPDIR
environment variable is not respected. If a user has a reason to want temporary files stored in a particular file system, utilities should respect the user's wishes.
The solution
For quite some time, Solaris has provided the mktemp command has existed to facilitate the secure creation of files. In the fix for this problem, I used mktemp
in a way that both creates the file securely and respects TMPDIR
.
41 MKTEMP="/usr/bin/mktemp -t" ... 300 PRE=$(${MKTEMP} lpadmin-pre.XXXXXX) 301 if [[ -z "${PRE}" ]] ; then 302 gettext "lpadmin: System error; cannot create temporary file\n" 1>&2 303 exit 2 304 fi 305 306 (/bin/ls /etc/lp/printers 2>/dev/null ; /bin/ls /etc/lp/classes \ 307 2>/dev/null) >${PRE}
No comments:
Post a Comment