This artifact collects information about Automator actions and workflows.
It can be used to identify malicious actions inserted into common/default workflows, or non-standard workflows.
name: MacOS.Sys.Automator
description: |
This artifact collects information about Automator actions and workflows.
It can be used to identify malicious actions inserted into common/default workflows, or non-standard workflows.
reference:
- https://support.apple.com/en-ae/guide/automator/welcome/mac
type: CLIENT
author: Wes Lambert - @therealwlambert
precondition: SELECT OS FROM info() WHERE OS =~ 'darwin'
parameters:
- name: ActionGlob
default: /System/Library/Automator/*/Contents/Info.plist
- name: WorkflowGlob
default: /Library/Application Support/Apple/Automator/Workflows/*/Contents/*.wflow
- name: UploadActions
default: N
type: bool
- name: UploadWorkflows
default: N
type: bool
sources:
- name: Actions
query:
LET ActionLocation = SELECT * from glob(globs=ActionGlob)
LET Actions = SELECT OSPath, Mtime, Atime, Ctime, Btime, plist(file=OSPath) AS AMAction FROM ActionLocation
SELECT * from foreach(
row=Actions,
query={
SELECT Mtime AS Timestamp,
get(field="AMName") AS Name,
get(field="AMApplication") AS Application,
get(field="AMIconName") AS IconName,
get(field="CFBundleExecutable") AS ExecutableName,
get(field="NSPrincipalClass") AS PrincipalClass,
get(field="CFBundleIdentifier") AS BundleIdentifier,
get(field="AMDefaultParameters") AS DefaultParameters,
get(field="NSHumanReadableCopyright") AS Copyright,
get(field="AMDescription") AS Description,
if(condition=UploadActions,
then=upload(file=OSPath,
mtime=Mtime,
atime=Atime,
ctime=Ctime,
btime=Btime)) AS Upload,
AMAction AS _Content
FROM AMAction
}
)
- name: Workflows
query: |
LET WorkflowLocation = SELECT * from glob(globs=WorkflowGlob)
LET Workflows = SELECT OSPath, Mtime, Atime, Ctime, Btime, plist(file=OSPath) AS AMWorkflow FROM WorkflowLocation
SELECT * from foreach(
row=Workflows,
query={
SELECT
Mtime AS Timestamp,
OSPath AS Name,
get(member="actions.action.ActionName") AS Actions,
get(field="state") AS State,
get(field="WorkflowIsShared") AS Shared,
get(field="workflowMetaData") AS WorkflowMetadata,
get(field="connectors") AS Connectors,
if(condition=UploadWorkflows,
then=upload(file=OSPath,
mtime=Mtime,
atime=Atime,
ctime=Ctime,
btime=Btime)) AS Upload,
AMWorkflow AS _Content
FROM AMWorkflow
}
)