These docs are under active development and cover the v0.20 Kobicha security model.
On this page
§4.2

Token Structure

A token carries identity, policy, and metadata fields. Fields are organized by concern and annotated with mutability:

  • Fixed — set at creation, never changes. The security-critical identity fields fall into this category.
  • Adjustable — may be modified at runtime via the adjustment operations defined in this specification.
  • One-way — can be set or tightened but never cleared or loosened.

§4.2.1 Identity core (fixed)

Field Type Description
user_sid SID The token's primary identity.
user_deny_only bool If true, the user SID matches only deny ACEs, not allow ACEs. Set at creation (CreateToken or FilterToken). MUST be true when write_restricted is true.
groups SID_AND_ATTRIBUTES[] Group memberships. The set of SIDs is fixed at creation; per-group attribute flags are adjustable (see below).
logon_sid SID Per-authentication-event SID (S-1-5-5-X-Y). Ties the token to its logon session. This SID also appears in the groups array with SE_GROUP_LOGON_ID set — the standalone field is a convenience reference to the same SID.
restricted_sids SID_AND_ATTRIBUTES[]? Secondary SID list for restricted tokens. Null on unrestricted tokens. Set at creation (CreateToken or FilterToken). AccessCheck treats this list as presence-based: a restricting SID participates whenever it is present in the list, and SE_GROUP_ENABLED / SE_GROUP_USE_FOR_DENY_ONLY do not affect restricted-pass matching.
write_restricted bool If true, the restricted SID check applies only to write access. Set at creation (CreateToken or FilterToken).

The set of group SIDs on a token is fixed at creation — AdjustGroups MUST NOT add or remove SIDs. However, individual groups MAY be enabled or disabled by modifying SE_GROUP_ENABLED, subject to constraints: mandatory groups (SE_GROUP_MANDATORY) MUST NOT be disabled, and deny-only groups (SE_GROUP_USE_FOR_DENY_ONLY) MUST NOT be re-enabled.

A token MUST contain at most 1024 entries in its groups array, including the kernel-injected logon SID. CreateToken therefore accepts at most 1023 caller-supplied groups.

§4.2.2 Token type (fixed)

Field Type Description
token_type enum Primary or Impersonation.
impersonation_level enum Anonymous, Identification, Impersonation, or Delegation. Primary tokens MUST have impersonation_level set to Anonymous.

§4.2.3 Integrity (fixed)

Field Type Description
integrity_level enum Untrusted, Low, Medium, High, or System.
mandatory_policy flags NO_WRITE_UP (0x0001), NEW_PROCESS_MIN (0x0002). Per-token MIC enforcement policy. Set at creation time.

The mandatory_policy field is immutable. A process MUST NOT change its MIC constraints at runtime (neither loosen nor tighten).

ⓘ Informative
This is an intentional divergence. The reference model allows runtime modification of the mandatory policy, which reduces MIC to a constraint that only stops processes that do not actively try to bypass it. Immutability ensures MIC is a real security boundary.

§4.2.4 Privileges (adjustable)

A token MUST carry a set of privileges. Each privilege MUST have four independent states:

  • Present — the privilege exists on the token. A present privilege MAY be removed (permanent), but a privilege MUST NOT be added after creation.
  • Enabled — the privilege is currently active. Only present privileges MAY be enabled or disabled.
  • Enabled by default — the creation-time enabled state. AdjustPrivileges MAY restore all privileges to this state.
  • Used — the privilege has been exercised during this token's lifetime. Monotonic — once set, MUST NOT be cleared.

A privilege's lifecycle on a token: present and disabled → enabled → used → optionally disabled → optionally permanently removed. Removal clears the privilege from the present, enabled, and enabled-by-default states.

ⓘ Informative
An implementation MAY encode these states as bitmasks (e.g., four 64-bit integers where each bit position corresponds to a defined privilege). This encoding provides constant-time privilege checks and atomic multi-privilege operations.

§4.2.5 Elevation (one-way)

Field Type Description
elevation_type enum Default (non-elevated), Full (elevated), or Limited (filtered). Created as Default. Set to Full or Limited exclusively by KACS_IOC_LINK_TOKENS when a linked pair is established. Once set to Full or Limited, MUST NOT be changed back to Default on that token object. Role is sticky: relinking MAY replace the partner, but MUST NOT change a token from Full to Limited or from Limited to Full. DuplicateToken and FilterToken produce new token objects whose elevation_type starts again at Default because they are not part of any linked pair.

Linked token pairs are associated at the session level, not stored on individual tokens. See §4.6 for the pairing mechanism.

§4.2.6 Default object security (adjustable)

Field Description
owner_sid_index Index into [user_sid, groups...] selecting the default owner SID for new objects. 0 = user SID, 1..N = groups[0..N-1]. The referenced SID MUST be the user SID or a group with SE_GROUP_OWNER.
primary_group_index Index into [user_sid, groups...] selecting the default primary group SID for new objects. 0 = user SID, 1..N = groups[0..N-1]. The referenced SID MUST be the user SID or a group SID on the token.
default_dacl DACL applied to objects created by this token when no explicit SD is provided.
ⓘ Informative
An implementation MAY store the owner and primary group as indices into the token's SID arrays rather than as separate SID copies.

§4.2.7 Metadata (fixed)

Field Type Description
token_id LUID Unique identifier for this token instance.
token_guid UUID 128-bit identifier for this token instance. UUIDv4 per RFC 4122, generated by the kernel at creation time. Immutable. Used by KMES and kernel-internal consumers for identity stamping and event correlation.
auth_id LUID Logon session LUID. Links to the authentication event that produced this token.
source TOKEN_SOURCE Who minted this token. 8-character name + LUID.
created_at timestamp When the original token was minted by CreateToken. Copied unchanged by DuplicateToken, FilterToken, and NEW_PROCESS_MIN (tracks original minting time, not duplication time).
expiration timestamp When the token becomes invalid. Zero = no expiry. Not enforced by AccessCheck in v0.20.
origin LUID Originating logon session for derived tokens (S4U, network logon).

§4.2.8 Mutation tracking (adjustable)

Field Description
modified_id Counter incremented on any token adjustment. Serves as a cache invalidation key — if modified_id has changed since the last AccessCheck, cached decisions are stale.

Privilege-used accounting is audit/accounting state, not an access-decision input. Marking a privilege used MUST remain monotonic, but it MUST NOT bump modified_id.

§4.2.9 Session (adjustable)

Field Description
interactive_session_id Interactive session number. 0 for services, 1+ for interactive/remote. Changing this field requires SeTcbPrivilege.

§4.2.10 Claims and security attributes (fixed)

Field Type Description
user_claims CLAIM_ATTRIBUTES[] Name-value pairs from the user's directory object. Fed into conditional ACE evaluation.
device_claims CLAIM_ATTRIBUTES[] Name-value pairs from the machine's directory object.

§4.2.11 LCS registry credentials (fixed)

Field Type Description
lcs_scope_guids GUID[] Ordered private registry scope GUIDs used by LCS private hive routing. LCS checks this list in order before falling back to global hives.
lcs_private_layers string[] Registry layer names that are visible to this token even when disabled globally. Names use the LCS layer-name syntax and matching rules.

These fields are KACS-owned credential material for PSD-005. They are fixed at token creation and copied by token duplication and filtering. Attachment is authorized by the same trusted-token-minting gate as the rest of CreateToken: only a caller holding SeCreateTokenPrivilege can create a token carrying these fields.

§4.2.12 Device identity (fixed)

Field Type Description
device_groups SID_AND_ATTRIBUTES[]? Machine's group memberships for compound identity.
restricted_device_groups SID_AND_ATTRIBUTES[]? Filtered device groups for restricted tokens.

§4.2.13 Confinement (fixed)

Field Type Description
confinement_sid SID? Puts the token in a default-deny sandbox. Null = not confined. When set, AccessCheck switches to default-deny: access requires an explicit grant to this SID or to a SID present in confinement_capabilities. ALL_APPLICATION_PACKAGES participates only when it is present in confinement_capabilities; KACS MUST NOT synthesize it.
confinement_capabilities SID_AND_ATTRIBUTES[] Declared access capabilities for confined processes. Empty if none. The attributes field is carried for wire-format uniformity only; AccessCheck treats capability membership as presence-based and does not consult SE_GROUP_ENABLED or SE_GROUP_USE_FOR_DENY_ONLY for confinement SID matching.
isolation_boundary bool Enables namespace filtering on top of confinement. Objects outside the boundary are invisible, not just denied. Requires confinement_sid. Settable at creation; not enforced in v0.20.
confinement_exempt bool Escape hatch. Confinement restrictions are not evaluated.

§4.2.14 Audit (fixed at creation)

Field Type Description
audit_policy u32 Per-token audit overrides, encoded as a bitmask. Fixed at creation time — no adjustment ioctl exists. Additive — forces audit events that system-wide policy would not generate, but MUST NOT suppress events that system-wide policy requires.

Audit policy flags:

Flag Value Description
OBJECT_ACCESS_SUCCESS 0x0001 Audit successful object access operations.
OBJECT_ACCESS_FAILURE 0x0002 Audit failed object access operations.
PRIVILEGE_USE_SUCCESS 0x0004 Audit successful privilege exercises: the privilege contributed requested bits that survive to the final granted result.
PRIVILEGE_USE_FAILURE 0x0008 Audit failed privilege exercises: the privilege contributed requested bits during evaluation, but those bits do not survive to the final granted result.

Follows impersonation: if service A impersonates client B and client B's token has auditing enabled for a category, operations during impersonation are audited under client B's identity. Default value at creation: 0 (no per-token audit overrides).

§4.2.15 Credential projection (fixed)

Field Description
projected_uid Pre-computed Linux UID from the user SID's directory uidNumber attribute. 65534 if unmapped.
projected_gid Pre-computed Linux primary GID. 65534 if unmapped.
projected_supplementary_gids Pre-computed Linux supplementary GIDs from group SIDs where gidNumber attributes exist.

Computed by authd at token creation time, stored on the token. KACS MUST NOT resolve SID-to-UID mappings at runtime. Projection reflects all groups regardless of enabled/disabled state — AdjustGroups MUST NOT trigger projection recalculation.

§4.2.16 Token security (adjustable)

Field Description
security_descriptor The token's own SD. Controls who can query, adjust, duplicate, or impersonate this token.

§4.2.17 Internal

Field Description
refcount Reference count. Token is freed when the last reference drops. Not exposed to userspace.