Absinthe-graphql 압생트의 비효율적인 알고리즘 복잡성 취약성으로 인해 2차 조각 이름 고유성 검증을 통해 인증되지 않은 서비스 거부가 허용됩니다. 'Elixir.Absinthe.Phase.Document.Validation.UniqueFragmentNames':run/2는 모든 조각에 대해 반복하고 각 조각에 대해 Duplicate?/2를 호출합니다. 이는 Enum.count(fragments, &(&1.name == name)) — 조각 목록의 전체 선형 스캔을 평가합니다. 결과는 문서당 O(N²) 비교입니다. 여기서 N은 조각 정의 수입니다.
Absinthe-graphql 압생트의 비효율적인 알고리즘 복잡성 취약성으로 인해 2차 조각 이름 고유성 검증을 통해 인증되지 않은 서비스 거부가 허용됩니다.
'Elixir.Absinthe.Phase.Document.Validation.UniqueFragmentNames':run/2는 모든 조각에 대해 반복하고 각 조각에 대해 Duplicate?/2를 호출합니다. 이는 Enum.count(fragments, &(&1.name == name)) — 조각 목록의 전체 선형 스캔을 평가합니다. 결과는 문서당 O(N²) 비교입니다. 여기서 N은 호출자가 제공한 조각 정의 수입니다.
input.fragments는 GraphQL 쿼리 본문에서 직접 구축되므로 N은 공격자가 완전히 제어할 수 있습니다. 최소 크기 조각 정의는 대략 16바이트이므로 ~1MB 문서는 ~60,000개의 조각을 전달하고 이 단일 검증 단계 내에서 ~3.6 × 10⁹ 비교를 강제합니다. 인증, 스키마 지식 또는 특별한 구성이 필요하지 않습니다.
이 문제는 압생트 1.2.0부터 1.10.2까지 영향을 미칩니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 87.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 87.00 |
VPI 공식 vpi-v1 기준