SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

GitLab GraphQL 코드 인젝션 취약점 (CVE-2026-19478)

EQST Now | 2026.08.21

NOW Briefing

Brief 1 GitLab CE(커뮤니티 에디션)·EE(엔터프라이즈 에디션) 18.2~19.2 대에서 GraphQL 디렉티브 처리 과정의 코드 인젝션 취약점(CVE-2026-19478)이 공개됐습니다. GitLab은 2026년 8월 17일 정기 릴리스 일정 밖 긴급 패치를 배포했습니다.
Brief 2 GitLab 권고문 기준으로 특정 조건에서 인증 없이 보낸 원격 요청만으로 공개 프로젝트와 사용자 데이터를 변조하거나 삭제할 수 있습니다. 공개 PoC는 확인되지 않았지만 watchTowr가 보안 권고문과 패치 내용만으로 재현했고, SecurityWeek 보도 기준으로 공개 이틀 뒤 실제 공격 시도가 관측됐습니다.
Brief 3 직접 설치해 운영하는 인스턴스는 19.2.4 / 19.1.6 / 19.0.8 / 18.11.11 중 자신의 버전 계열에 맞는 패치로 즉시 올려야 합니다. 즉시 업그레이드가 어렵다면 /api/graphql 엔드포인트의 미인증 접근을 차단해야 합니다.

GitLab GraphQL 코드 인젝션 취약점 (CVE-2026-19478)

■ 개요

GitLab은 소스 코드 저장소와 CI/CD(코드 통합·배포 자동화)를 함께 제공하는 개발 플랫폼입니다. 이번 취약점은 그 API 계층인 GraphQL(클라이언트가 필요한 데이터 항목만 골라 요청하는 API 방식) 처리부에 있습니다. 영향 범위는 직접 설치해 운영하는(self-managed) GitLab CE/EE 18.2~18.11.10, 19.0~19.0.7, 19.1~19.1.5, 19.2~19.2.3입니다. GitLab.com과 GitLab Dedicated는 이미 패치된 버전으로 운영 중이며 고객이 취할 조치가 없다고 GitLab이 명시했습니다.

GitLab 권고문은 "특정 조건에서" 미인증 사용자가 원격으로 공개 프로젝트와 사용자 데이터를 변조·삭제할 수 있다고 설명합니다. 공개 프로젝트는 로그인 없이 조회할 수 있으므로 인터넷에 노출된 인스턴스가 1차 공격 표면이며, 보도 기준으로 공격에는 자격증명도 사용자 상호작용도 필요하지 않습니다. CSO Online은 저장소 삭제 외에 머지 기록 위조, 메인테이너 차단 같은 저장소 상태 변조 시나리오도 함께 지적했습니다.

공개 PoC는 확인되지 않았습니다. 다만 watchTowr는 권고문과 패치 내용만으로 수 분 내에 재현했다고 밝혔고, 8월 19일 자사 미끼 서버(허니팟) 네트워크에서 관측한 첫 실제 공격 시도를 공개했습니다. 2026년 8월 21일 기준 CISA KEV 목록에는 등재되지 않았습니다. 정기 일정 밖 긴급 패치였고 재현 장벽도 낮은 것으로 분석됐으므로, 다음 정기 점검 주기를 기다리지 말고 즉시 조치해야 합니다.

■ 요약

항목 내용
CVE ID CVE-2026-19478 (GraphQL 디렉티브 처리 중 임의 메서드 호출)
CVSS 점수 CVSS v3.1 9.4
취약점 유형 CWE-94, 코드 인젝션
영향/위험 • 특정 조건에서 미인증 원격 요청으로 공개 프로젝트 변조·삭제 가능
• 공개된 사용자 데이터 변조 가능
• 머지 기록 위조·메인테이너 차단 등 저장소 상태 변조 가능(CSO Online 보도 기준)
• 공개 직후 실제 공격 시도 관측됨(watchTowr 허니팟 기준)
취약 버전 • GitLab CE/EE 18.2 ~ 18.11.10
• GitLab CE/EE 19.0 ~ 19.0.7
• GitLab CE/EE 19.1 ~ 19.1.5
• GitLab CE/EE 19.2 ~ 19.2.3
• GitLab.com·GitLab Dedicated 해당 없음(패치 적용 완료)
패치 버전 • 18.11.11
• 19.0.8
• 19.1.6
• 19.2.4

■ 임의 메서드 호출 경로

이번 취약점은 롤링 배포(구·신 버전 인스턴스가 함께 떠 있는 상태에서 순차 교체하는 배포 방식)를 지원하는 기능에서 시작됩니다. GitLab은 @gl_introduced(version:) 디렉티브(질의문에 붙여 처리 방식을 지정하는 지시자)를 제공해, 클라이언트가 아직 구버전 인스턴스에 없는 필드를 요청해도 GraphQL 스키마(API가 제공하는 필드 목록 정의) 오류가 나지 않게 합니다. 요청 전처리 단계가 미래 버전 노드를 걷어내면서 내부 플래그 contain_future_fields를 세우고, 실행 시점에 원본 질의문을 복원합니다.

문제는 그 플래그가 켜진 상태에서 스키마에 없는 필드를 대신 만들어 주는 폴백 로직입니다. 패치 전 폴백 필드 생성 메서드 fallback_field는 공격자가 보낸 필드 이름으로 GraphQL 필드 객체를 즉석에서 생성하면서 리졸버(필드 값을 계산하는 담당 객체)를 지정하지 않았습니다. graphql-ruby는 리졸버가 없는 필드를 만나면 대상 객체에서 필드 이름과 같은 이름의 메서드를 호출해 값을 구하므로, 필드 이름이 그대로 서버 객체의 메서드 호출이 됩니다. OX Security 분석 기준으로 디렉티브 처리가 필드 단위 권한 검사보다 먼저 이뤄지고 공개 프로젝트는 미인증 조회가 가능하기 때문에, 읽기 질의처럼 보이는 요청이 상태 변경 메서드까지 닿습니다.

# [패치 전] lib/gitlab/graphql/version_filter/future_field_fallback.rb
def fallback_field(name:)
  GraphQL::Schema::Field.new(
    owner: self,
    name: name,
    type: GraphQL::Types::Boolean,
    fallback_value: nil
  )
end
# [패치 후]
def fallback_field(name:)
  GraphQL::Schema::Field.new(
    owner: self,
    name: name,
    resolver_class: Resolvers::NilResolver
  )
end

GitLab은 요청된 필드 이름과 무관하게 항상 nil을 반환하는 리졸버 클래스 Resolvers::NilResolver를 새로 추가해 폴백 필드에 고정했습니다. 롤링 배포 중 미래 필드에 널 값을 돌려주는 원래 동작은 유지하면서, 필드 이름을 메서드로 해석하는 분기만 제거했습니다.

■ 탐지 및 점검

• 웹 서버와 리버스 프록시 접근 로그에서 /api/graphql 요청에 @gl_introduced 문자열이 포함된 항목을 검색합니다. watchTowr가 제시한 선제적 위협 탐색 지표이며, 미인증 세션에서 발생한 요청을 우선 확인해야 합니다.

• 패치 적용 이전 구간을 대상으로, 공개 프로젝트의 삭제·이름 변경·가시성 변경 이력을 사용자 인증 기록과 대조해 대응하는 인증 기록이 없는 변경을 점검 대상으로 삼습니다.

• 프로젝트 멤버십과 메인테이너 권한 변경 이력, 머지 리퀘스트 상태 변경 이력을 감사 로그와 대조해 출처가 확인되지 않는 변경을 찾습니다.

• 익명 세션에서 발생한 GraphQL 상태 변경 요청과, 이전에 관측된 적 없는 IP에서 짧은 시간에 집중된 GraphQL 요청을 확인합니다.

• 공개 저장소의 최신 커밋·태그 해시를 백업본이나 개발자 로컬 클론과 대조해 저장소 상태가 변조되지 않았는지 검증합니다.

📌 NOTE

GitLab은 확인된 침해 사례를 보고하지 않았고, 벤더가 공개한 해시·도메인·IP 형태의 IoC도 없습니다.
현재 활용 가능한 탐지 근거는 @gl_introduced 요청 패턴과 인증 기록 없는 상태 변경이라는 행위 지표뿐이므로, 시그니처 기반 탐지가 아니라 행위 기반 점검으로 접근해야 합니다. @gl_introduced 요청 자체는 정상 클라이언트도 사용할 수 있으므로 단독 신호는 추가 점검 대상으로 다뤄야 합니다.

■ 대응 방안

• 직접 설치해 운영하는 인스턴스를 18.11.11, 19.0.8, 19.1.6, 19.2.4 중 현재 마이너 버전 계열에 맞는 버전으로 즉시 업그레이드합니다. GitLab.com과 GitLab Dedicated 이용 조직은 별도 조치가 필요하지 않습니다.

• 패치 이전 구간의 웹 로그와 감사 로그를 보존 기간이 만료되기 전에 별도 보관해 사후 조사에 사용할 수 있게 합니다.

• 즉시 업그레이드가 어렵다면 리버스 프록시나 웹 방화벽(WAF)에서 /api/graphql 엔드포인트의 미인증 접근을 차단하고, 패치 완료 후 원복합니다.

• 인터넷에 직접 노출된 인스턴스는 VPN이나 IP 허용 목록 뒤로 옮겨 미인증 조회 경로 자체를 축소합니다.

• 저장소 변조 정황이 확인되면 백업이나 개발자 로컬 클론에서 상태를 복구하고, 해당 저장소를 참조하는 CI/CD 파이프라인의 산출물을 재검증합니다.

💡 TIP

GitLab은 이번 수정을 네 개 버전 계열에 대한 긴급 릴리스로 동시에 배포했습니다.
상위 마이너 버전으로 올라가지 않아도 현재 계열 안에서 패치를 받을 수 있으므로, 대규모 업그레이드 계획을 먼저 세우느라 패치 적용을 미룰 필요가 없습니다.

[참고 자료]

GitLab 19.2.4 긴급 패치 릴리스 안내

NVD - CVE-2026-19478 상세

GitLab 수정 커밋 패치 원문

패치 전 취약 코드 원본 (v19.2.2-ee)

OX Security - GitLab GraphQL 취약점 기술 분석

SecurityWeek - 공개 직후 악용 관측 보도

CSO Online - 공개 저장소 삭제·변조 가능성 보도

Help Net Security - GitLab.com·Dedicated 영향 여부

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.