Folder Actions On Yosemite Broken? Use launchd Instead

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:

/Library/LaunchAgents 
/Library/LaunchDaemons 
/Users/your_user/LaunchAgents

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.

#!/bin/bash 
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:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>RollYourOwn.MalwareDetection.Yosemite</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/bin/malwaredetection.sh</string>
	</array>
	<key>RunAtLoad</key>
	<false/>
	<key>QueueDirectories</key>
	<array>
		<string>/Library/LaunchAgents</string>
		<string>/Library/LaunchDaemons</string>
		<string>/Users/username/Library/LaunchAgents</string>
	</array>
</dict>
</plist>

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
     com.apple.FinderInfo
     com.apple.TextEncoding

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.