When dealing with high traffic sites, especially media based or community based sites, there is always the risk of javascript, virus, XSS or other malicious injection of badness when giving a community of users the ability to upload files to your site.
There are several things to consider when evaluating all “points of entry” that are available to the public, into your systems.
Most content management and community based systems use libraries such as Imagemagick to process images (such as profile pictures) into their proper format and size.
Believe it or not, it is hard to actually inject code or other malicious data into the actual image to survive this sanitizing process. There is still risks , however. The library version you are running may be vulnerable to exploits itself.
As always, a good rule of thumb is to ensure all possible aspects of your systems are up to date and that you are aware of any security vulnerabilities as they come out so they can either be patched or addressed in some other way.
One thing to consider, especially when dealing with thousands of users and even more uploads is a scheduled scan of your user uploads using free virus scanning tools such as clamscan. This is an endpoint reporting strategy that can at least cover your ass in the event that something else was missed or a 0day vulnerability exploited.
It should be noted that the virus scans themselves aren’t intended to protect the linux systems themselves, but rather the opportunistic ‘spreading’ of compromised images and code that having an infected file on a public community based system can provide.
Its very simple to implement clamav (daemonization is not necessary), clamscan is all we need to execute regular scans at 10, 15, 30 or 60 minute intervals.
Once clamscan is implemented, definitions updated (and regular update cronjobs in place) you can roll out a script similar to the one we have here to implement the scheduled scans :
#!/bin/bash # Scheduled Scan of user uploaded files # Usage : ./virusscan.sh /folder SUBJECT="[VIRUS DETECTED] ON `hostname` !" EMAIL="you@yourdomain.com" LOG=/var/log/clamav/scan.log # Clear out old logs -- the email alerts should be archived if we need to go back to old alerts echo "" > $LOG # Check if the folder is empty -- only scan if this is an active node in a clustered system # look for empty dir if [ "$(ls -A $1)" ] then # Scan files clamscan $1 -r --infected --scan-pdf --scan-elf --log=$LOG # Check the last set of results. If there are any "Infected" counts that aren't zero, we have a problem. cat $LOG | grep Infected | grep -v 0 if [ $? = 0 ] then cat $LOG | mail -s "$SUBJECT" $EMAIL -- -F Antivirus -f antivirus@yourdomain.com fi else echo "directory empty -- doing nothing" exit 0; fi
The actual cronjob entry can look something like this :
0 */1 * * * /bin/bash /usr/local/bin/virusscan.sh "/your/path/to/user/uploaded/files/" > /dev/null 2>&1
It seems like a rather simple solution — but it does provide a venue for additional sanitizing of user input. In our experience , it is best to only report on anything that clamscan might find. You can, however tell clamscan to simply delete any suspected infections it finds.