9f9ee5344d
HarfangLab and SentinelOne both send the process that acted to actor.* — process.username and sourceProcessInfo.user to actor.user.name, the process itself to actor.process.* — and keep user.name for the person the event happened to: HarfangLab's top_impacted_users, SentinelOne's login account. Cortex XDR filled neither slot correctly. XDR labels the acting process actor_process_* and its account actor_effective_username; the mappers sent the process to process.* and the account to user.name, which the OCSF catalogue calls Target User. A rule written on actor.user.name or actor.process.name matched HarfangLab and SentinelOne and skipped Cortex, and a rule reading user.name as the victim read the attacker. process.* is not free-for-all either: in the SentinelOne (targetProcessInfo) and Carbon Black (childproc_*) mappers it holds the process acted upon, so Cortex's actor was sitting in the target's seat. get_incidents_full had the collision in the open: the incident's impacted users[] and the first alert's user_name both wrote user.name, and last non-empty wins, so the actor overwrote the impacted user on every incident carrying both. Tenants using the shipped templates pick this up on the next sync; a forked mapper, or a column or rule pointed at the old Cortex paths, needs repointing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>