Numerous exploits take advantage of /tmp’s open nature by uploading scripts or executables to it, then running them from it. While we may or may not be able to do something about the scripts being uploaded (not really possible in a shared hosting environment where any number of unknown clients’ scripts and so on have to be run regardless of their flaws) we can certainly keep them from being run from within /tmp. The noexec mount option makes it impossible to run shell scripts or binaries directly from a filesystem that has been mounted with it. The nosuid option keeps people from using or setting the setuid flag on any files.
If you’re not using LVM or you’re working with virtual machines tossing on another partition might not be practical. Fortunately /tmp works just as well when mounted from a partition image file. Follow through these shell commands, replacing the count= value for dd to whatever size you would like to make the /tmp image in megs. You won’t need much space, on a typical shared hosting server the most one tends to find in there is session data. You are welcome to make a sparse file image however the frequency of writes and deletes as well as the small required size makes this less practical than it might sound. I think 256 megs is a nice round number, unless you’re doing something fancy that actually needs /tmp files.
# dd if=/dev/zero of=/tmp.img bs=1M count=256 # mke2fs -j /tmp.img # chmod 600 /tmp.img # mkdir /mnt/tmp # mount -o loop /tmp.img /mnt/tmp # mv /tmp/* /mnt/tmp/ # umount /mnt/tmp # rmdir /mnt/tmp # mount -o loop,noexec,nosuid /tmp.img /tmp # chmod 777 /tmp # chmod +t /tmp
Now we can add the image to our /etc/fstab to ensure that it automounts on boot:
/tmp.img /tmp ext3 loop,nosuid,noexec 1 2