🇰🇷 한글 설명
absinthe-graphql 라이브러리의 fragment 이름 중복 검증 과정에서 발생하는 비효율적인 알고리즘 복잡도 취약점입니다. 공격자가 조작된 GraphQL 쿼리를 전송할 경우, 서버가 중복 검증을 위해 과도한 연산을 수행하게 되어 서비스 거부(DoS) 상태에 빠질 수 있습니다.
💡 쉬운 설명
공격자가 아주 복잡하게 꼬인 질문지를 보내면, 서버가 그 질문지를 검사하다가 계산량이 너무 많아져서 멈춰버리는 문제입니다. 이로 인해 일반 사용자들이 서비스를 이용하지 못하게 될 수 있습니다.
🇺🇸 원문 (English)
Inefficient Algorithmic Complexity vulnerability in absinthe-graphql absinthe allows unauthenticated denial of service via quadratic fragment-name uniqueness validation.
'Elixir.Absinthe.Phase.Document.Validation.UniqueFragmentNames':run/2 iterates over all fragments and for each one calls duplicate?/2, which evaluates Enum.count(fragments, &(&1.name == name)) — a full linear scan of the fragment list. The result is O(N²) comparisons per document, where N is the number of fragment definitions supplied by the caller.
Because input.fragments is built directly from the GraphQL query body, N is fully attacker-controlled. A minimum-size fragment definition is roughly 16 bytes, so a ~1 MB document carries ~60,000 fragments and forces ~3.6 × 10⁹ comparisons inside this single validation phase. No authentication, schema knowledge, or special configuration is required.
This issue affects absinthe: from 1.2.0 before 1.10.2.
📍 영향받는 시스템
absinthe: 1.2.0 버전부터 1.10.2 미만 버전
⚔️ 공격 벡터
인증되지 않은 공격자가 대량의 fragment 정의를 포함한 악의적인 GraphQL 쿼리를 전송하여 서버 자원을 고갈시킴
🛡️ 대응 방법
absinthe 라이브러리를 1.10.2 이상의 최신 버전으로 업데이트하십시오.
🔧 검증 코드
출력된 absinthe의 버전이 1.10.2 미만(예: 1.2.0 ~ 1.10.1)인지 확인하십시오.
mix deps info absinthe | grep -E 'absinthe \([0-9]+\\.[0-9]+\\.[0-9]+\\)'