macOS now comes with a vulnerability scanner called mrt. It’s installed within the MRT.app bundle in /System/Library/CoreServices/MRT.app/Contents/MacOS/ and while it doesn’t currently have a lot that it can do – it does protect against the various bad stuff that is actually available for the Mac. To use mrt, simply run the binary with a -a flag for agent and then a -r flag along with the path to run it against. For example, let’s say you run a launchctl command to list LaunchDaemons and LaunchAgents running:
launchctl list
And you see something that starts with com.abc. Let me assure you that nothing should ever start with that. So you can scan it using the following command:
sudo /System/Library/CoreServices/MRT.app/Contents/MacOS/mrt -a -r ~/Library/LaunchAgents/com.abc.123.c1e71c3d22039f57527c52d467e06612af4fdc9A.plist
What happens next is that the bad thing you’re scanning for will be checked to see if it matches a known hash from MRT or from /System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.yara and the file will be removed if so.
A clean output will look like the following:
2018-09-24 21:19:32.036 mrt[48924:4256323] Running as agent
2018-09-24 21:19:32.136 mrt[48924:4256323] Agent finished.
2018-09-24 21:19:32.136 mrt[48924:4256323] Finished MRT run
Note: Yara rules are documented at https://yara.readthedocs.io/en/v3.7.0/. For a brief explanation of the json you see in those yara rules, see https://yara.readthedocs.io/en/v3.5.0/writingrules.html.
So you might be saying “but a user would have had to a username and password for it to run.” And you would be correct. But XProtect protects against 247 file hashes that include about 90 variants of threats. Those are threats that APPLE has acknowledged. And most malware is a numbers game. Get enough people to click on that phishing email about their iTunes account or install that Safari extension or whatever and you can start sending things from their computers to further the cause. But since users have to accept things as they come in through Gatekeeper, let’s look at what was allowed.
To see a list of hashes that have been allowed:
spctl --list |
When you allow an app via spctl the act of doing so is stored in a table in
sudo sqlite3 /var/db/SystemPolicy |
Then run .schema to see the structure of tables, etc. These include feature, authority, sequence, and object which contains hashes.
On the flip side, you can search for the com.apple.quarantine attribute set to com.apple.quarantine:
xattr -d -r com.apple.quarantine ~/Downloads |
And to view the signature used on an app, use codesign:
codesign -dv MyAwesome.app |
To sign a package:
productbuild --distribution mycoolpackage.dist --sign MYSUPERSECRETIDENTITY mycoolpackage.pkg |
To sign a dmg:
codesign -s MYSUPERSECRETIDENTITY mycooldmg.dmg |
However, in my tests, codesign is used to manage signatures and sign, spctl only checks things with valid developer IDs and spctl checks items downloaded from the App Store. None of these allow for validating a file that has been brought into the computer otherwise (e.g. through a file share).
Additionally, I see people disable Gatekeeper frequently, which is done by disabling LSQuarantine directly:
defaults write com.apple.LaunchServices LSQuarantine -bool NO |
And/or via spctl:
spctl --master-disable |
Likewise, mrt is running somewhat resource intensive at the moment and simply moving the binary out of the MRT.app directory will effectively disable it for now if you’re one of the people impacted.