🔍 CVE-2025-46720

3.1
CVSS Score
LOW
2025-05-05
2026-06-17 09:26
✅ 완료

🇰🇷 한글 설명

Node.js용 CMS인 Keystone에서 update 및 delete 뮤테이션 시 필터링 접근 제어를 우회할 수 있는 취약점이 발견되었습니다. 공격자는 여러 개의 고유 필터를 조합하여 읽기 권한이 없는 필드의 존재 여부나 값을 추론할 수 있습니다. 이 문제는 @keystone-6/core 6.5.0 버전에서 패치되었습니다.

💡 쉬운 설명

데이터를 수정하거나 삭제할 때, 원래는 볼 수 없어야 하는 정보(예: 이메일)를 필터 조건에 넣어봄으로써 그 정보가 무엇인지 알아낼 수 있는 문제입니다. 마치 비밀번호를 맞출 때까지 계속 질문을 던져서 정답을 찾아내는 것과 비슷합니다.

🇺🇸 원문 (English)

Keystone is a content management system for Node.js. Prior to version 6.5.0, `{field}.isFilterable` access control can be bypassed in `update` and `delete` mutations by adding additional unique filters. These filters can be used as an oracle to probe the existence or value of otherwise unreadable fields. Specifically, when a mutation includes a `where` clause with multiple unique filters (e.g. `id` and `email`), Keystone will attempt to match records even if filtering by the latter fields would normally be rejected by `field.isFilterable` or `list.defaultIsFilterable`. This can allow malicious actors to infer the presence of a particular field value when a filter is successful in returning a result. This affects any project relying on the default or dynamic `isFilterable` behavior (at the list or field level) to prevent external users from using the filtering of fields as a discovery mechanism. While this access control is respected during `findMany` operations, it was not completely enforced during `update` and `delete` mutations when accepting more than one unique `where` values in filters. This has no impact on projects using `isFilterable: false` or `defaultIsFilterable: false` for sensitive fields, or for those who have otherwise omitted filtering by these fields from their GraphQL schema. This issue has been patched in `@keystone-6/core` version 6.5.0. To mitigate this issue in older versions where patching is not a viable pathway, set `isFilterable: false` statically for relevant fields to prevent filtering by them earlier in the access control pipeline (that is, don't use functions); set `{field}.graphql.omit.read: true` for relevant fields, which implicitly removes filtering by these fields from the GraphQL schema; and/or deny `update` and `delete` operations for the relevant lists completely.

📍 영향받는 시스템

Keystone CMS (@keystone-6/core) 6.5.0 미만 버전

⚔️ 공격 벡터

update/delete 뮤테이션 시 isFilterable이 비활성화된 필드를 포함한 다중 where 절 필터링 시도

🛡️ 대응 방법

@keystone-6/core를 6.5.0 이상으로 업데이트하거나, 민감한 필드에 isFilterable: false를 정적으로 설정하십시오.

🔧 검증 코드

출력된 버전이 6.5.0 미만이면 취약한 상태이며, 6.5.0 이상이면 안전합니다.

Shell / Script
npm list @keystone-6/core

📊 CVSS Vector String

CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N

💻 영향받는 소프트웨어

Node.js