Detect Zammad Improper Privilege Management Local Privilege Escalation (CVE-2026-102490) in IBM QRadar
Detects exploitation and exposure of CVE-2026-102490, an actively-exploited (CISA KEV) improper privilege management (CWE-269) vulnerability in Zammad GmbH's Zammad help desk / ticketing platform. The flaw allows a lower-privileged local or authenticated actor to escalate privileges within the Zammad application context, obtaining agent or admin-level capabilities they were not granted. This detection surfaces vulnerable Zammad deployments, anomalous privilege/role changes in Zammad audit logs, and local escalation artifacts on hosts running the Zammad service (typically Ruby/Rails under a dedicated 'zammad' service account backed by Elasticsearch and PostgreSQL).
MITRE ATT&CK
- Tactic
- Privilege Escalation
QRadar Detection Query
SELECT QIDNAME(qid) AS event, sourceip, destinationip, username, "Process Name" AS process, payload AS raw, DATEFORMAT(starttime,'yyyy-MM-dd HH:mm:ss') AS time
FROM events
WHERE LOGSOURCETYPENAME(devicetype) ILIKE '%Linux%'
AND (UTF8(payload) ILIKE '%zammad%' OR "Process Name" ILIKE '%ruby%' OR "Process Name" ILIKE '%rails%')
AND (UTF8(payload) ILIKE '%permission%' OR UTF8(payload) ILIKE '%role%' OR UTF8(payload) ILIKE '%Users::Permission%' OR UTF8(payload) ILIKE '%admin%')
AND (UTF8(payload) ILIKE '%grant%' OR UTF8(payload) ILIKE '%assign%' OR UTF8(payload) ILIKE '%add%')
ORDER BY starttime DESC LAST 24 HOURS QRadar AQL searching Linux event payloads from Zammad hosts for permission/role grant activity tied to the Zammad application — an indicator of CVE-2026-102490 privilege escalation.
Data Sources
Required Tables
False Positives & Tuning
- Administrator-initiated role assignments through normal Zammad operations.
- Identity provider synchronization updating Zammad permissions.
- Maintenance/migration tasks run during patching windows.
Other platforms for CVE-2026-102490
Testing Methodology
Validate this detection against 3 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.
- Test 1Zammad role escalation via rails console (lab)
Expected signal: Zammad production.log and PostgreSQL history entry recording a role change to Admin for the target user; process telemetry for the ruby/rails rake invocation under the zammad account.
- Test 2Direct permission grant to low-privileged user (lab)
Expected signal: production.log 'Users::Permission' / permission grant entry and corresponding history row.
- Test 3Suspicious zammad-account process referencing permissions (lab)
Expected signal: ProcessRollup2 / auditbeat process event: ruby/rails executed by user 'zammad' with command line containing 'Permission' and 'admin'.
References (5)
- https://nvd.nist.gov/vuln/detail/CVE-2026-102490
- https://zammad.com/en/product/releases/
- https://community.zammad.org/t/take-care-local-privilege-escalation-cve-2026-102490-is-reported-as-being-actively-exploited/21297/2
- https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk
- https://www.cisa.gov/news-events/directives/bod-26-04-implementation-guidance-prioritizing-security-updates-based-risk
Response Playbook
Triage
- Confirm the affected host is running Zammad and identify the installed version (`zammad run rails r 'puts Version.get'` or check the package version); compare against the fixed release listed at https://zammad.com/en/product/releases/.
- Review the Zammad activity/audit log (Admin > System > Monitoring, or the `history` table in PostgreSQL) for recent role or permission changes — specifically any user granted the Admin or Agent role without a corresponding authorized admin action.
- Correlate the timestamp of any suspicious privilege change with web access logs and session data to identify the source user_id, IP address, and session that triggered the escalation.
- Determine whether the escalating account was a newly created or previously low-privileged (customer) account, which strongly indicates exploitation rather than legitimate administration.
Containment
- Isolate or restrict external access to the Zammad instance (block at reverse proxy / WAF) until the patch is applied, as this vulnerability is on the CISA KEV list and actively exploited.
- Revoke elevated roles from any account that was escalated without authorization and force a password reset plus session invalidation (`zammad run rails r 'Setting.set(...)'` / delete sessions) for affected and admin accounts.
- Apply the vendor-fixed Zammad release immediately per CISA BOD 26-04 prioritization guidance; schedule an emergency change if outside normal windows.
Evidence Collection
- Preserve the Zammad `production.log`, the PostgreSQL `history` and `users`/`roles`/`permissions` tables, and reverse-proxy access logs covering the suspected exploitation window.
- Capture the current role/permission assignments for all accounts (`zammad run rails r 'User.all.each{|u| puts "#{u.login}: #{u.roles.pluck(:name)}"}'`) as a baseline snapshot and export the OS-level auditd log for the zammad service account.
Escalation Criteria
- !Escalate to incident response if any customer-tier or newly registered account obtained Admin/Agent privileges, or if privileged actions (ticket data export, user impersonation, config change) followed the escalation.
- !Escalate to management and legal/compliance if evidence shows data access or exfiltration via the escalated account, given KEV status and potential breach-notification obligations.
Investigation Guide
Related Techniques
Forensic Artifacts
- >
Zammad `production.log` entries showing permission/role assignment - >
PostgreSQL `history` table rows recording role grants - >
Reverse-proxy/web access logs for the exploiting session - >
auditd records for the zammad service account - >
Zammad session records in the database
Tuning Guidance
Baseline which accounts and automation (LDAP/SAML sync, onboarding workflows) legitimately modify Zammad roles, and whitelist those user_ids/source IPs. Narrow the regex to the exact log signature emitted by your Zammad version's permission-change code path once observed. Focus alerting on escalations where the target account was previously a customer or was created within the last 24 hours, which dramatically reduces false positives from routine administration.
Hunting Queries
Surface all Zammad role/permission grant activity over the past week to baseline normal admin behavior and spot anomalous escalations.
Syslog | where TimeGenerated > ago(7d) | where SyslogMessage has "zammad" and SyslogMessage has_any ("Admin","role","permission") | where SyslogMessage matches regex @"(?i)(grant|assign|add).{0,30}(admin|role)" | project TimeGenerated, Computer, SyslogMessage index=linux (source="*zammad*production.log" OR sourcetype=syslog host="zammad*") ("role" OR "permission" OR "Admin") | rex field=_raw "(?i)user[_ ]?id[=:]\s*(?<uid>\d+)" | stats count values(_raw) as events by uid, host | where count > 0 Atomic Red Team Tests
Simulates an unauthorized grant of the Admin role to a low-privileged user through the Zammad rails runner, reproducing the audit-log side-effect of CVE-2026-102490.
Command
zammad run rails r 'u = User.find_by(login: "[email protected]"); u.roles = Role.where(name: ["Admin"]); u.save!' Cleanup
zammad run rails r 'u = User.find_by(login: "[email protected]"); u.roles = Role.where(name: ["Customer"]); u.save!' Expected Telemetry
Zammad production.log and PostgreSQL history entry recording a role change to Admin for the target user; process telemetry for the ruby/rails rake invocation under the zammad account.
Expected Detection
KQL/SPL/EQL rules fire on the permission/role grant referencing 'Admin' on a zammad host.
Grants an elevated permission (admin.user) directly, emulating privilege manipulation without a full role change.
Command
zammad run rails r 'u = User.find_by(login: "[email protected]"); u.permissions = ["admin.user"]; u.save!' Cleanup
zammad run rails r 'u = User.find_by(login: "[email protected]"); u.permissions = []; u.save!' Expected Telemetry
production.log 'Users::Permission' / permission grant entry and corresponding history row.
Expected Detection
Rules match the 'permission'/'Users::Permission' signature in process args and application logs.
Runs a rake task under the zammad service account that references permission tables, generating the process-launch telemetry the endpoint rules key on.
Command
sudo -u zammad bash -c 'cd /opt/zammad && bundle exec rails r "puts Permission.pluck(:name).grep(/admin/)"' Cleanup
echo 'no cleanup required — read-only enumeration' Expected Telemetry
ProcessRollup2 / auditbeat process event: ruby/rails executed by user 'zammad' with command line containing 'Permission' and 'admin'.
Expected Detection
CrowdStrike CQL and Elastic EQL rules match ruby/rails process by the zammad user referencing permission/admin.