[BUG] Identify.TriggerEffect does not validate EffectIdentifier: Reserved values answer SUCCESS and reach the delegate as kUnknownEnumValue

Author: j-ororkeCreated Sep 18, 2026Updated Sep 18, 2026
Labelsbugneeds triage

Reproduction steps

Repro step using chip-tool:

  1. chip-tool identify trigger-effect 3 0 1 -> SUCCESS.

IdentifyCluster::InvokeCommand decodes TriggerEffect and acts on EffectIdentifier without ever checking it against the enum.

Per Identify §1.2.7.2.1, the field "SHALL contain one of the non-reserved values in EffectIdentifierEnum", which defines only {0x00 Blink, 0x01 Breathe, 0x02 Okay, 0x0B ChannelChange, 0xFE FinishEffect, 0xFF StopEffect}. Interaction Model §8.9.4 says a command field that violates its constraints SHOULD be answered with CONSTRAINT_ERROR, so this is a SHOULD deviation, not a conformance failure, but the value also reaches application code in a state no application can act on.

IdentifyCluster.cpp:163-199:

cpp
mEffectIdentifier = data.effectIdentifier;
mEffectVariant    = data.effectVariant;

// Other effects: cancel and trigger new effect.
auto err = SetIdentifyTime(IdentifyTimeChangeSource::kClient, 0);
mIdentifyDelegate->OnTriggerEffect(*this);
return err;

DataModel::Decode folds any unrecognized value to kUnknownEnumValue (= 3 for this enum), so a reserved EffectIdentifier is neither kFinishEffect nor kStopEffect, falls to the "other effects" branch, invokes the delegate, and returns SUCCESS. The delegate then reads kUnknownEnumValue from GetEffectIdentifier().

Observed on all-clusters-app at 954268d via TC-IDM-9.1, on endpoints 1-4:

EP1 Identify.TriggerEffect.EffectIdentifier accepted violating payload
    (value 3 is not defined by EffectIdentifierEnum)
EP1 Identify.TriggerEffect.EffectIdentifier accepted violating payload
    (value 12 is not defined by EffectIdentifierEnum)

Bug prevalence

Always

GitHub hash of the SDK that was being used

954268d

Platform

linux

Platform Version(s)

No response

Anything else?

Not a code-driven migration regression: the pre-migration ember identify-server.cpp also returned Status::Success unconditionally (src/app/clusters/identify-server/identify-server.cpp:257).

Source: project-chip/connectedhomeip