AccessControl Cluster
Cluster ID: 0x001F |
Endpoint: Fixed on Endpoint 0 (root endpoint)
AccessControl is the permission management hub of a Matter device -- it determines "who" can perform "what operations" on "which resources".
Every Matter device must implement this Cluster on Endpoint 0.
It has no commands; all configuration is done by directly writing to the ACL attribute.
ACLs are isolated by Fabric -- each Fabric (control domain) maintains an independent list of access control entries without interfering with each other. After Commissioning is complete, the device automatically creates an Administer privilege entry for the Commissioner, which is the foundation for all subsequent operations. If the ACL is misconfigured, the device may become "unreachable" and can only be recovered via factory reset.
Attributes
The attributes of the AccessControl Cluster are divided into two groups: ACL Data (read/write permission configuration) and Capacity Limits (read-only device capability limits). Click on an attribute ID in the summary table below to jump to its detailed description.
| ID | Name | Type | Group | Description |
|---|---|---|---|---|
0x0000 |
ACL | list<AccessControlEntryStruct> | ACL Data | Access control entry list (core attribute) |
0x0001 |
Extension | list<AccessControlExtensionStruct> | ACL Data | Vendor-specific extension data |
0x0002 |
SubjectsPerAccessControlEntry | uint16 | Capacity Limits | Maximum number of Subjects per ACL entry |
0x0003 |
TargetsPerAccessControlEntry | uint16 | Capacity Limits | Maximum number of Targets per ACL entry |
0x0004 |
AccessControlEntriesPerFabric | uint16 | Capacity Limits | Maximum number of ACL entries per Fabric |
0x0005 |
CommissioningARL | list<CommissioningAccessRestrictionEntryStruct> | Access Restrictions | Access restriction list during Commissioning phase |
0x0006 |
ARL | list<AccessRestrictionEntryStruct> | Access Restrictions | Runtime access restriction list |
ACL Data (0x0000, 0x0001)
Access control entries and extension data -- the core writable attributes of AccessControl.
| ID | Name | Type | Description |
|---|---|---|---|
0x0000 |
ACL (Access Control List) | list<AccessControlEntryStruct> | The device's access control entry list. Each entry defines a "who can do what" rule. Isolated by Fabric -- each Fabric can only read and write its own entries. Writing requires a full replacement (incremental modification of individual entries is not supported) and requires Administer privilege. See AccessControlEntryStruct for struct details |
0x0001 |
Extension (Extension Data) | list<AccessControlExtensionStruct> | Vendor-specific permission extensions. Each entry contains TLV-encoded data of up to 128 bytes. Standard Matter implementations typically do not use this field. Requires the EXTS feature. Writing requires Administer privilege |
Writing ACL is a full replacement operation -- you must write the complete entry list at once; you cannot modify just one entry. If the newly written list does not include your own Administer entry, you will permanently lose administrative access to the device, and the only recovery is a factory reset. It is recommended to read the current ACL first, modify it, then write the entire list back.
Capacity Limits (0x0002 ~ 0x0004)
Read-only attributes that describe the device's capacity limits for ACL entries. Read these values before writing ACL to avoid exceeding the device's capabilities.
| ID | Name | Type | Description |
|---|---|---|---|
0x0002 |
SubjectsPerAccessControlEntry | uint16 | Maximum length of the subjects list in a single ACL entry. Minimum value is 4 |
0x0003 |
TargetsPerAccessControlEntry | uint16 | Maximum length of the targets list in a single ACL entry. Minimum value is 3 |
0x0004 |
AccessControlEntriesPerFabric | uint16 | Maximum total number of ACL entries a Fabric can have. Minimum value is 4 (enough for at least one administrator entry and a few user entries) |
Typical values for most devices: SubjectsPerAccessControlEntry = 4, TargetsPerAccessControlEntry = 3, AccessControlEntriesPerFabric = 4. Resource-constrained devices (such as battery-powered sensors) may have smaller values. Always read these three values before planning during development.
Access Restrictions (0x0005, 0x0006) — MNGD Feature
The Access Restriction List (ARL) is an advanced feature introduced by the MNGD (Managed Device) feature, allowing device manufacturers to restrict access to certain resources even if the ACL permits it. Most consumer devices do not implement this feature.
| ID | Name | Type | Description |
|---|---|---|---|
0x0005 |
CommissioningARL | list | Access restrictions during the Commissioning phase. The device informs the Commissioner which resources are restricted during commissioning. Requires the MNGD feature |
0x0006 |
ARL | list | Runtime access restriction list. Even if the ACL grants permission, resources listed in the ARL remain inaccessible. Requires the MNGD feature |
Struct Definitions
AccessControlEntryStruct — Access Control Entry
The core data structure of ACL. Each record defines the privilege level that a set of subjects (who) have on a set of targets (which resources).
| Field | Type | Description |
|---|---|---|
| Privilege | AccessControlEntryPrivilegeEnum | Granted privilege level (View / Operate / Manage / Administer) |
| AuthMode | AccessControlEntryAuthModeEnum | Authentication mode (PASE / CASE / Group) |
| Subjects | list<subject-id> / null |
List of subjects allowed to access (Node ID or Group ID).
null means all Nodes within the same Fabric are allowed access
|
| Targets | list<AccessControlTargetStruct> / null |
Scope of allowed access targets.
null means all Endpoints and Clusters on the device are accessible
|
| FabricIndex | fabric-idx | Fabric index this entry belongs to (automatically populated by the device; does not need to be specified manually) |
null in ACL means "no restriction", not "deny".
Subjects = null means all Nodes within the same Fabric match;
Targets = null means all Endpoints and Clusters on the device are in scope.
The default administrator entry typically sets Targets = null because administrators need access to everything.
AccessControlTargetStruct — Access Target
Defines the specific resource scope an ACL entry allows access to. At least one of the three fields must be specified; unspecified fields mean no restriction.
| Field | Type | Description |
|---|---|---|
| Cluster | cluster-id / null | Restrict to a specific Cluster. null = no Cluster restriction |
| Endpoint | endpoint-no / null | Restrict to a specific Endpoint. null = no Endpoint restriction |
| DeviceType | devtype-id / null | Restrict to a specific device type. null = no device type restriction |
Endpoint and DeviceType cannot be specified simultaneously -- either match precisely by Endpoint number,
or match broadly by device type. If both are set, the device will reject the entry.
The most common approach is to specify only Endpoint.
AccessControlExtensionStruct — Extension Data
A vendor-specific extension structure that requires the EXTS feature to be enabled. Rarely used in standard Matter development.
| Field | Type | Description |
|---|---|---|
| Data | octstr (max 128 bytes) | TLV-encoded extension data, content defined by the vendor |
| FabricIndex | fabric-idx | Fabric index this entry belongs to |
Enum Types
AccessControlEntryPrivilegeEnum — Privilege Levels
Defines the privilege level granted by an ACL entry. Privileges are inclusive -- higher-level privileges automatically include all capabilities of lower-level privileges. For example, Operate includes the capabilities of View, and Administer includes all capabilities.
Administer ⊃ Manage ⊃ Operate ⊃ View. After assigning Operate privilege to a user, they automatically have View capability, so there is no need to add a separate View ACL entry.
AccessControlEntryAuthModeEnum — Authentication Mode
Specifies the authentication mode that an ACL entry matches. Different authentication modes determine the meaning of the IDs in the Subjects field.
Events
The AccessControl Cluster records ACL change history through events. Each time the ACL or Extension attribute is written, the device generates a corresponding event. These events are important for security auditing and troubleshooting.
| ID | Name | Priority | Description |
|---|---|---|---|
0x00 |
AccessControlEntryChanged | Info | An ACL entry has changed (added, modified, or removed). Event data includes the change type (Changed/Added/Removed), the latest entry content, the operator's Node ID, and the Fabric index |
0x01 |
AccessControlExtensionChanged | Info | Extension data has changed. Structure is similar to the previous event, recording additions, deletions, and modifications to extension data. Requires the EXTS feature |
0x02 |
FabricRestrictionReviewUpdate | Info | Fabric access restriction review update. Triggered when ARL rules change. Requires the MNGD feature |
In production environments, it is recommended to subscribe to the AccessControlEntryChanged event.
If someone accidentally modifies the ACL (e.g. accidentally deletes the administrator entry), the event log can help quickly identify the issue.
Feature Bitmap
The AccessControl Cluster declares the device's supported extension capabilities through the FeatureMap (0xFFFC):
Most consumer devices have a FeatureMap of 0x0000 (no features enabled).
EXTS is for vendor devices with custom permission requirements, and MNGD is for cloud-platform-managed devices.
Example Data
A typical smart light's AccessControl Cluster read result after Commissioning is complete and a user privilege entry has been added:
{
// --- ACL entries (list, independently maintained per Fabric) ---
"0x0000": [ // ACL — AccessControlEntryStruct list
{
"privilege": 5, // Administer (administrator)
"authMode": 2, // CASE authentication
"subjects": [112233], // Bound to Commissioner Node ID
"targets": null, // null = can access all Endpoints and Clusters
"fabricIndex": 1
},
{
"privilege": 3, // Operate (operate privilege)
"authMode": 2, // CASE authentication
"subjects": null, // null = all Nodes within the same Fabric
"targets": [ // Restrict the accessible scope
{ "cluster": null, "endpoint": 1, "deviceType": null }
],
"fabricIndex": 1
}
],
// --- Capacity Limits ---
"0x0002": 4, // SubjectsPerAccessControlEntry = 4
"0x0003": 3, // TargetsPerAccessControlEntry = 3
"0x0004": 4 // AccessControlEntriesPerFabric = 4
}
The first ACL entry (Privilege = 5, Administer) is automatically created during Commissioning and must never be deleted. When adding user privileges, first read the complete ACL list, append the new entry, then write the entire list back. Note that Extension (0x0001) only exists when the FeatureMap includes the EXTS feature.
Common Scenarios
Scenario 1: Default Administrator ACL (Auto-Generated After Commissioning)
After the device completes Commissioning, it automatically creates an administrator privilege entry for the Commissioner (typically a phone App or Hub):
- Privilege = Administer (5) -- highest privilege
- AuthMode = CASE (2) -- certificate-based secure authentication
- Subjects = [Commissioner's Node ID] -- only this controller
- Targets = null -- can access everything on the device
This ACL entry is the foundation for all subsequent operations. If it is accidentally deleted, the device can no longer be controlled and can only be recovered via factory reset.
Scenario 2: Add Operate Privilege for a Family Member
The administrator wants a family member (another phone) to be able to control lights and switches, but not modify device configuration:
- Read the current ACL list (ensure it contains the administrator entry)
- Append a new entry:
- Privilege = Operate (3)
- AuthMode = CASE (2)
- Subjects = [family member's Node ID]
- Targets = [{ endpoint: 1 }] (only allow operations on the functional Endpoint)
- Write the complete list containing both the administrator entry and the new entry to the ACL
After writing, the family member can turn lights on and off, but cannot modify ACL, device name, power-on behavior, or other management-level configurations.
Scenario 3: Set Up Group Multicast Privilege
You need to control a group of lights simultaneously via multicast, e.g. "all living room lights":
- First configure the Group Key for each light (via the GroupKeyManagement Cluster)
- Add a Group privilege entry in each light's ACL:
- Privilege = Operate (3)
- AuthMode = Group (3)
- Subjects = [Group ID]
- Targets = [{ endpoint: 1 }]
- Then send OnOff commands to the Group, and all lights respond simultaneously
The privilege level in Group mode can only go up to Operate; Manage or Administer operations are not allowed through Group.
Scenario 4: Troubleshoot "Access Denied" Issues
When the device returns an UNSUPPORTED_ACCESS or ACCESS_DENIED error, follow these troubleshooting steps:
- Read the device's ACL (0x0000) and verify whether there is an entry matching the current Node
- Check whether the matching entry's Privilege is sufficient (e.g. writing attributes requires Manage, modifying ACL requires Administer)
- Check whether the AuthMode matches (a CASE-authenticated Node will not match a Group-type ACL entry)
- Check whether Targets covers the target Endpoint and Cluster
- Verify capacity limits -- read SubjectsPerAccessControlEntry and AccessControlEntriesPerFabric to see if limits are exceeded