CVE-2025-30352: Directus `search` query parameter allows enumeration of non permitted fields

Published Mar 26, 2025
·
Updated

Summary

The search query parameter allows users with access to a collection to filter items based on fields they do not have permission to view. This allows the enumeration of unknown field contents.

Details

The searchable columns (numbers & strings) are not checked against permissions when injecting the where clauses for applying the search query. This leads to the possibility of enumerating those un-permitted fields.

PoC

- Create a collection with a string / numeric field, configure the permissions for the public role to not include the field created - Create items with identifiable content in the not permitted field - Query the collection and include the field content in the search parameter - See that results are returned, even tho the public user does not have permission to view the field content

Impact

This vulnerability is a very high impact, as for example Directus instances which allow public read access to the user avatar are vulnerable to have the email addresses, password hashes and potentially admin level access tokens extracted. The admin token and password hash extraction have a caveat, as string fields are only searched with a lower cased version of the search query.

Other sources

Directus is a real-time API and App dashboard for managing SQL database content. Starting in version 9.0.0-alpha.4 and prior to version 11.5.0, the search query parameter allows users with access to a collection to filter items based on fields they do not have permission to view. This allows the enumeration of unknown field contents. The searchable columns (numbers & strings) are not checked against permissions when injecting the where clauses for applying the search query. This leads to the possibility of enumerating those un-permitted fields. Version 11.5.0 fixes the issue.

MITRE

Affected Software

153 affected componentsFixes available
npm/directus>=9.0.0-alpha.4<11.5.0
11.5.0
Monospace Directus Node.js>=9.0.1<11.5.0
Monospace Directus Node.js=9.0.0-alpha10
Monospace Directus Node.js=9.0.0-alpha11
Monospace Directus Node.js=9.0.0-alpha12
Monospace Directus Node.js=9.0.0-alpha13
Monospace Directus Node.js=9.0.0-alpha14
Monospace Directus Node.js=9.0.0-alpha15
Monospace Directus Node.js=9.0.0-alpha16
Monospace Directus Node.js=9.0.0-alpha17
Monospace Directus Node.js=9.0.0-alpha18
Monospace Directus Node.js=9.0.0-alpha19
Monospace Directus Node.js=9.0.0-alpha20
Monospace Directus Node.js=9.0.0-alpha21
Monospace Directus Node.js=9.0.0-alpha22
Monospace Directus Node.js=9.0.0-alpha23
Monospace Directus Node.js=9.0.0-alpha24
Monospace Directus Node.js=9.0.0-alpha25
Monospace Directus Node.js=9.0.0-alpha26
Monospace Directus Node.js=9.0.0-alpha27
Monospace Directus Node.js=9.0.0-alpha31
Monospace Directus Node.js=9.0.0-alpha32
Monospace Directus Node.js=9.0.0-alpha33
Monospace Directus Node.js=9.0.0-alpha34
Monospace Directus Node.js=9.0.0-alpha35
Monospace Directus Node.js=9.0.0-alpha36
Monospace Directus Node.js=9.0.0-alpha37
Monospace Directus Node.js=9.0.0-alpha38
Monospace Directus Node.js=9.0.0-alpha39
Monospace Directus Node.js=9.0.0-alpha4
Monospace Directus Node.js=9.0.0-alpha40
Monospace Directus Node.js=9.0.0-alpha41
Monospace Directus Node.js=9.0.0-alpha42
Monospace Directus Node.js=9.0.0-alpha5
Monospace Directus Node.js=9.0.0-alpha6
Monospace Directus Node.js=9.0.0-alpha7
Monospace Directus Node.js=9.0.0-alpha8
Monospace Directus Node.js=9.0.0-alpha9
Monospace Directus Node.js=9.0.0-beta0
Monospace Directus Node.js=9.0.0-beta1
Monospace Directus Node.js=9.0.0-beta10
Monospace Directus Node.js=9.0.0-beta11
Monospace Directus Node.js=9.0.0-beta12
Monospace Directus Node.js=9.0.0-beta13
Monospace Directus Node.js=9.0.0-beta14
Monospace Directus Node.js=9.0.0-beta2
Monospace Directus Node.js=9.0.0-beta3
Monospace Directus Node.js=9.0.0-beta4
Monospace Directus Node.js=9.0.0-beta5
Monospace Directus Node.js=9.0.0-beta7
Monospace Directus Node.js=9.0.0-beta8
Monospace Directus Node.js=9.0.0-beta9
Monospace Directus Node.js=9.0.0-rc0
Monospace Directus Node.js=9.0.0-rc1
Monospace Directus Node.js=9.0.0-rc10
Monospace Directus Node.js=9.0.0-rc100
Monospace Directus Node.js=9.0.0-rc101
Monospace Directus Node.js=9.0.0-rc11
Monospace Directus Node.js=9.0.0-rc12
Monospace Directus Node.js=9.0.0-rc13
Monospace Directus Node.js=9.0.0-rc14
Monospace Directus Node.js=9.0.0-rc15
Monospace Directus Node.js=9.0.0-rc17
Monospace Directus Node.js=9.0.0-rc18
Monospace Directus Node.js=9.0.0-rc19
Monospace Directus Node.js=9.0.0-rc2
Monospace Directus Node.js=9.0.0-rc20
Monospace Directus Node.js=9.0.0-rc21
Monospace Directus Node.js=9.0.0-rc22
Monospace Directus Node.js=9.0.0-rc23
Monospace Directus Node.js=9.0.0-rc24
Monospace Directus Node.js=9.0.0-rc25
Monospace Directus Node.js=9.0.0-rc26
Monospace Directus Node.js=9.0.0-rc27
Monospace Directus Node.js=9.0.0-rc28
Monospace Directus Node.js=9.0.0-rc29
Monospace Directus Node.js=9.0.0-rc3
Monospace Directus Node.js=9.0.0-rc30
Monospace Directus Node.js=9.0.0-rc31
Monospace Directus Node.js=9.0.0-rc32
Monospace Directus Node.js=9.0.0-rc33
Monospace Directus Node.js=9.0.0-rc34
Monospace Directus Node.js=9.0.0-rc35
Monospace Directus Node.js=9.0.0-rc36
Monospace Directus Node.js=9.0.0-rc37
Monospace Directus Node.js=9.0.0-rc38
Monospace Directus Node.js=9.0.0-rc39
Monospace Directus Node.js=9.0.0-rc4
Monospace Directus Node.js=9.0.0-rc40
Monospace Directus Node.js=9.0.0-rc41
Monospace Directus Node.js=9.0.0-rc42
Monospace Directus Node.js=9.0.0-rc43
Monospace Directus Node.js=9.0.0-rc44
Monospace Directus Node.js=9.0.0-rc45
Monospace Directus Node.js=9.0.0-rc46
Monospace Directus Node.js=9.0.0-rc47
Monospace Directus Node.js=9.0.0-rc48
Monospace Directus Node.js=9.0.0-rc49
Monospace Directus Node.js=9.0.0-rc5
Monospace Directus Node.js=9.0.0-rc50
Monospace Directus Node.js=9.0.0-rc51
Monospace Directus Node.js=9.0.0-rc52
Monospace Directus Node.js=9.0.0-rc53
Monospace Directus Node.js=9.0.0-rc54
Monospace Directus Node.js=9.0.0-rc55
Monospace Directus Node.js=9.0.0-rc56
Monospace Directus Node.js=9.0.0-rc57
Monospace Directus Node.js=9.0.0-rc58
Monospace Directus Node.js=9.0.0-rc59
Monospace Directus Node.js=9.0.0-rc6
Monospace Directus Node.js=9.0.0-rc60
Monospace Directus Node.js=9.0.0-rc61
Monospace Directus Node.js=9.0.0-rc62
Monospace Directus Node.js=9.0.0-rc63
Monospace Directus Node.js=9.0.0-rc64
Monospace Directus Node.js=9.0.0-rc65
Monospace Directus Node.js=9.0.0-rc66
Monospace Directus Node.js=9.0.0-rc67
Monospace Directus Node.js=9.0.0-rc68
Monospace Directus Node.js=9.0.0-rc69
Monospace Directus Node.js=9.0.0-rc7
Monospace Directus Node.js=9.0.0-rc70
Monospace Directus Node.js=9.0.0-rc71
Monospace Directus Node.js=9.0.0-rc72
Monospace Directus Node.js=9.0.0-rc73
Monospace Directus Node.js=9.0.0-rc74
Monospace Directus Node.js=9.0.0-rc75
Monospace Directus Node.js=9.0.0-rc76
Monospace Directus Node.js=9.0.0-rc77
Monospace Directus Node.js=9.0.0-rc78
Monospace Directus Node.js=9.0.0-rc79
Monospace Directus Node.js=9.0.0-rc8
Monospace Directus Node.js=9.0.0-rc80
Monospace Directus Node.js=9.0.0-rc81
Monospace Directus Node.js=9.0.0-rc82
Monospace Directus Node.js=9.0.0-rc83
Monospace Directus Node.js=9.0.0-rc84
Monospace Directus Node.js=9.0.0-rc85
Monospace Directus Node.js=9.0.0-rc86
Monospace Directus Node.js=9.0.0-rc87
Monospace Directus Node.js=9.0.0-rc88
Monospace Directus Node.js=9.0.0-rc89
Monospace Directus Node.js=9.0.0-rc9
Monospace Directus Node.js=9.0.0-rc90
Monospace Directus Node.js=9.0.0-rc91
Monospace Directus Node.js=9.0.0-rc92
Monospace Directus Node.js=9.0.0-rc93
Monospace Directus Node.js=9.0.0-rc94
Monospace Directus Node.js=9.0.0-rc95
Monospace Directus Node.js=9.0.0-rc96
Monospace Directus Node.js=9.0.0-rc97
Monospace Directus Node.js=9.0.0-rc98
Monospace Directus Node.js=9.0.0-rc99

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade npm/directus to a version that resolves this vulnerability.

    Fixed in 11.5.0
  2. Upgrade

    Upgrade Directus to a version that resolves this vulnerability.

    Fixed in 11.5.0

Event History

Mar 26, 2025
CVE Published
via MITRE·05:18 PM
Data Sourced
via MITRE·05:18 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·06:15 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·06:15 PM
RemedyAffected Software
Advisory Published
via GitHub·06:44 PM
Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the severity of CVE-2025-30352?

CVE-2025-30352 has a severity rating that indicates a significant risk of unauthorized data enumeration.

2

How do I fix CVE-2025-30352?

To fix CVE-2025-30352, update to a patched version of the affected Directus package beyond version 11.5.0.

3

What are the potential impacts of CVE-2025-30352?

The potential impacts of CVE-2025-30352 include unauthorized access to sensitive data fields that users do not have permission to view.

4

Which versions of Directus are affected by CVE-2025-30352?

Directus versions from 9.0.0-alpha.4 up to 11.5.0 are affected by CVE-2025-30352.

5

Is authentication required to exploit CVE-2025-30352?

Exploitation of CVE-2025-30352 requires users to have access to the collection but does not require further authentication to exploit the vulnerability.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203