3.11 kacs.impersonation.started

  • Event type: kacs.impersonation.started
  • Defined in: kacs.evman
  • Tier: standard
  • Gating: none — every impersonation attempt that names a client token is recorded
  • Cardinality: once per attempt

The record that a thread took on, or tried to take on, a client's identity by impersonating its token. The subject is the server — the token that acted, as it stood before the switch — and the object is the client token. Successes and refusals are both recorded.

Impersonation is per thread, so emitter.thread.tid names the thread that changed identity, not emitter.process.pid. Records the thread writes afterwards carry the client's token in their header, until a kacs.impersonation.reverted record ends it.

The level can be lowered without the attempt failing. object.token.impersonation is the level the client token offered, and object.token.impersonation-permitted the level KACS let the server have. Where the second is lower — the server lacked SeImpersonatePrivilege for a different user, or the client's integrity was above the server's — the impersonation succeeded at Identification, which can query the client's identity but not act as it.

The GUID is the installed token's. A lowered level installs a new token, so object.token.guid and object.token.id on a success are that token's, and they match the emitter.token.guid of the thread's later records. Exactly when the level was lowered they differ from the GUID of the token the client handed over.

3.11.1 Fields #

FieldTypePresenceMeaning
subject.token.sidbin.sidvia subjectThe user SID of the effective token the operation ran under.
subject.token.groupsbin.sid[]via subjectThe group SIDs carried by the effective token.
subject.token.group-attributesuint.flags[]via subjectPer-group attribute bitmasks, positionally parallel to subject.token.groups.
subject.token.integrityuint.integrityvia subjectThe integrity RID of the effective token.
subject.token.iduint.luidvia subjectThe token's own LUID, identifying this specific token rather than the logon session it belongs to.
subject.token.auth-iduint.luidvia subjectThe LUID of the logon session the effective token belongs to.
subject.token.typestr.enumvia subjectWhether the effective token is a primary token or an impersonation token.
subject.token.impersonationuint.enumvia subjectThe impersonation level of the effective token.
subject.token.uiduintvia subjectThe Linux UID this token projects onto, for correlating a Peios event with Linux-side audit data.
emitter.process.piduintvia subjectThe process ID the record was written from.
emitter.process.namestrvia subjectThe kernel's name for the emitting process, typically the executable's basename.
emitter.process.executablestr.pathvia subjectThe path the emitting process was executed from, resolved at exec with symbolic links already followed.
subject.pip.typeuint.enumvia subjectThe Protected Isolated Process type in force for the access check.
subject.pip.trustuintvia subjectThe PIP trust level in force for the access check.
emitter.thread.tiduintrequiredThe thread that wrote the record, where the operation is scoped to a thread rather than to its process.
object.kindstr.enumrequiredAlways token.
object.token.guidbin.guidrequiredThe durable GUID of the token the operation acted on.
object.token.iduint.luidrequiredThe LUID of the token the operation acted on, for token-open and token-adjust checks.
object.token.sidbin.sidrequiredThe client: whose identity the server took on or asked for.
object.token.typestr.enumrequiredprimary only on a refusal: a primary token cannot be impersonated.
object.token.integrityuint.integrityrequiredThe integrity level of the token the operation acted on, as an integrity RID.
object.token.auth-iduint.luidoptionalAbsent only for a token with no logon session.
object.token.restrictedboolrequiredWhether the token is restricted: whether it carries restricting SIDs that every access check must also satisfy.
object.token.impersonationuint.enumrequiredThe level the client token offered: the level asked for.
object.token.impersonation-permitteduint.enumoptionalThe level the gate allowed. Absent when the attempt was refused before the gate answered.
privilege.namestr.enumoptionalSeImpersonatePrivilege, present when the server impersonated a different user, or across a restriction difference, and needed the privilege to do it at the level asked. The privilege is then marked used.
privilege.heldboolwhen privilege.name == SeImpersonatePrivilegeAlways true where present: a server without the privilege is not refused but lowered to Identification, which impersonation-permitted shows.
outcome.successboolrequiredWhether the operation succeeded.
outcome.errnoint.errnowhen outcome.success == falseThe error the operation failed with, as a negative errno.
outcome.reasonstr.enumoptionalOn a refusal, where KACS knows why: the token handed over was a primary token (EINVAL); a restricted server tried to impersonate an unrestricted token of its own user, which would escape its restriction (EPERM); the token handle lacked TOKEN_IMPERSONATE (EACCES); or the identity could not be projected onto the thread's Linux credentials. Absent on a refusal for want of memory.

Values here (open set): primary-token · restriction-escape · no-impersonate-access · projection-failed.

Every record also carries the header fields of the envelope, which no payload repeats.

Generated from kacs.evman by pkm/tools/gen-events-book.py. Edit the fragment, not this page.

Edit this page