My roll-your-own malware detection has been having troubles in OS X Yosemite. It appears that it increases CPU usage to abnormal amounts. I have come up with two alternative solutions that you may want to try.
To detect many pieces of malware, you will want to monitor these folders:
There are other folders to watch, which detect specific pieces of malware like the Backdoor.iWorm, but the three above should offer decent detection.
Two Methods to Replace Folder Actions On Yosemite
Malware Detection Using Hazel (Paid, But Easy)
This will be the easiest, but you also have to pay for the app.
Set up the Hazel rules as seen below for each of the folder mentioned above.
You will get a notification with the filename if something gets placed in those folders. It will then open the folder so you can decide if it needs to be deleted or if it is a legitimate file.
Malware Detection Using launchd (Free, More Technical, and Severely-limited)
Unfortunately, this method is more technical and does not work as well as Folder actions because the file and folder name do not get passed as arguments to the script. So those nice alert dialogs you used to get won’t have all the nifty information. But if you don’t feel like paying for Hazel, or having your CPU go crazy using Folder Actions, and still want to at least know if something is going on, then read on.
Ironically enough, you will be creating a file and putting it in one of the folders that Folder Actions may have previously been monitoring. This should also give you some insight as to why hackers are always trying to put files into these folders.
Script To Run When Items Are Added To The Folders
First, you will need a script that will execute when a new item is added into one of the folders. Since launchd won’t pass arguments to the script, you can just make a basic dialog that tells you an item was added to them.
osascript -e 'display dialog "Possible launchd threat detected..." with title "Roll-your-own Malware Detection"'
launchd .plist To Watch The Folders For Changes
The next process is much easier if you use a program like Lingon X, but I will show you how to manually create the file. I suggest using an app like TextWrangler because it works better for writing code. If you want to use TextEdit or some other editor, be sure it is set to plain-text and not rich-text.
Create a new file called RollYourOwn.MalwareDetection.Yosemite.plist with the following content:
Then, save it to /Library/LaunchAgents . Make sure the file has the correct user, group, and permissions by running these commands:
sudo chown root:wheel /Library/LaunchAgents/RollYourOwn.MalwareDetection.Yosemite.plist
sudo chmod 644 /Library/LaunchAgents/RollYourOwn.MalwareDetection.Yosemite.plist
You will also want to make sure any extended attributes are gone. Check if there are any with this command:
ls -l@ /Library/LaunchAgents/RollYourOwn.MalwareDetection.Yosemite.plist
If the result has an “@” symbol in it, then there are some extended attributes and they will be listed below the filename. For example, this is what mine look liked:
-rw-r--r--@ 1 root wheel 582B Oct 20 14:05 /Library/LaunchAgents/RollYourOwn.MalwareDetection.Yosemite.plist
To remove these, use xattr with the -d (delete) option
sudo xattr -d com.apple.FinderInfo /Library/LaunchAgents/RollYourOwn.MalwareDetection.Yosemite.plist
sudo xattr -d com.apple.TextEncoding /Library/LaunchAgents/RollYourOwn.MalwareDetection.Yosemite.plist
If you instead edited the text file from the command line in vim or nano , there are probably not any extended attributes to remove.
Now the launchd plist is ready. What you just made was your own little program that runs a custom script (for all users at login). It will run automatically and in the background. Now you might understand why hackers will try to install things in a similar fashion. They can have their malicious code executed every time someone logs into their Mac. But the file you just made runs code that will help rather than hinder.
The launchd plist utilized QueueDirectories, which will basically run the script as long as there is an item in it. You can also use WatchPaths, but it it much more sensitive to changes. Experiment with both to find out what is best for you.