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

GitLab Ruby 정규식 정수 오버플로 미인증 RCE 취약점 (CVE-2026-110264)

EQST Now | 2026.10.23

NOW Briefing

Brief 1 GitLab이 번들한 Ruby 정규식 엔진의 정수 오버플로 취약점(CVE-2026-110264)이 공개됐습니다. 2014년 7.0부터 패치 직전까지의 self-managed 버전이 대상입니다.
Brief 2 GitLab 권고 기준으로 조건이 충족되면 미인증 공격자가 서버에서 임의 코드를 실행할 수 있습니다.
Brief 3 self-managed 인스턴스를 18.11.13·19.0.10·19.1.9·19.2.9·19.3.6·19.4.3·19.5.1 중 해당 버전으로 즉시 업그레이드해야 합니다.

‍

GitLab Ruby 정규식 정수 오버플로 미인증 RCE 취약점 (CVE-2026-110264)

‍

■ 개요

‍

GitLab은 소스 코드 저장소와 CI/CD를 함께 제공하는 데브옵스 플랫폼으로, 조직이 직접 서버에 설치해 운영하는 방식(self-managed)으로도 널리 쓰입니다. 국내에서는 GitLab 공식 파트너가 self-managed 설치와 고가용성 구성, 한국어 문서, 기술지원을 제공하고 있으며, 금융권의 자체 구축 사례도 공개돼 있습니다. 2026년 10월 21일 GitLab은 긴급 패치 릴리스를 배포하면서 CVE-2026-110264를 공개했습니다. GitLab 권고에 따르면 정규식 컴파일 과정의 정수 오버플로로 특정 조건에서 미인증 사용자가 서버에서 임의 코드를 실행할 수 있었던 취약점입니다.

영향 범위는 2014년에 나온 7.0부터 패치 직전 버전까지이며, GitLab 권고 기준으로 커뮤니티 에디션(CE)과 엔터프라이즈 에디션(EE) 모두가 대상입니다. GitLab이 산정한 CVSS v3.1 점수는 10.0으로, 인증 없이 공격이 가능하고 영향이 다른 구성요소까지 확장되는 점이 반영됐습니다. 취약점 유형은 정수 오버플로(CWE-190)이고, 보고자는 HackerOne 버그 바운티를 통해 신고한 joaxcar입니다. GitLab.com은 이미 패치된 버전으로 운영 중이고 Dedicated 테넌트도 해당 수정이 포함된 버전을 사용하고 있어, 실제 조치 대상은 self-managed 인스턴스입니다.

근본 원인은 GitLab이 번들한 Ruby의 정규식 엔진 Onigmo에 있습니다. Ruby 팀은 10월 23일 4.0.9·3.4.12·3.3.13을 내놓으면서 이 취약점을 포함한 Onigmo 수정을 반영했지만, 별도의 Ruby CVE는 발급하지 않고 GitLab이 발급한 CVE를 참조했습니다. Ruby 공지에 따르면 이 취약점은 공격자가 제어하는 문자열을 정규식으로 컴파일하는 경우에만 도달할 수 있습니다. Ruby의 정규식 생성 메서드 Regexp.new·Regexp.union·Regexp.compile에 넘기거나 정규식 리터럴에 보간하는 방식이 여기에 해당합니다. 같은 패턴으로 외부 입력을 정규식으로 컴파일하는 자체 Ruby 서비스가 있다면 GitLab과 별개로 점검 대상입니다.

‍

■ 요약

‍

항목 내용
CVE ID CVE-2026-110264 (정규식 컴파일러 정수 오버플로)
CVSS 점수 CVSS v3.1 10.0
취약점 유형 CWE-190, 정수 오버플로로 인한 범위를 벗어난 쓰기(OOB write)
영향/위험 • 특정 조건에서 미인증 원격 코드 실행 가능(GitLab 권고 기준)
• 정규식 매칭 시점의 범위를 벗어난 쓰기로 메모리 손상 발생
• GitLab 보안팀 탐지 문서 기준, 힙 조작이 병행되면 git 사용자 권한으로 코드 실행 가능
취약 버전 • 7.0 이상 18.11.13 미만
• 19.0 이상 19.0.10 미만
• 19.1 이상 19.1.9 미만
• 19.2 이상 19.2.9 미만
• 19.3 이상 19.3.6 미만
• 19.4 이상 19.4.3 미만
• 19.5 이상 19.5.1 미만
패치 버전 • 18.11.13
• 19.0.10
• 19.1.9
• 19.2.9
• 19.3.6
• 19.4.3
• 19.5.1

‍

■ 오버플로 발생 지점과 패치

‍

Onigmo는 정규식을 컴파일할 때 반복 구문마다 내부 식별 번호(반복 ID)를 붙여 바이트코드에 심습니다. GitLab 보안팀 탐지 문서에 따르면 이 ID는 부호 있는 16비트 슬롯에 저장되지만, 개수를 세는 카운터는 그보다 넓은 정수입니다. 반복이 32,767개를 넘으면 ID가 음수로 래핑됩니다. 컴파일은 오류 없이 끝나고, 실제 메모리 손상은 그 패턴으로 문자열을 매칭할 때 반복 명령이 범위를 벗어난 쓰기를 수행하면서 발생합니다.

ruby/ruby 저장소의 패치 커밋 493d26dcdea8b2f0ac5d28e057b401bc809e7fae는 이 래핑을 컴파일 단계에서 거부합니다. 아래는 그 커밋의 regcomp.c 변경 가운데, 반복 노드를 컴파일하는 compile_range_repeat_node() 함수에 해당하는 구간입니다. 반복 카운터를 증가시킨 직후 ID 저장 타입(MemNumType)으로 형변환해 부호 있는 16비트 범위를 넘겨 값이 0 이하로 떨어졌는지 확인하고 새 오류 코드를 반환합니다.

@@ -703,6 +704,7 @@ compile_range_repeat_node(QtfrNode* qn, int target_len, int empty_info,
   if (r) return r;
   r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */
   reg->num_repeat++;
+  if ((MemNumType)reg->num_repeat <= 0) return ONIGERR_TOO_MANY_RANGE_REPEAT;
   if (r) return r;
   r = add_rel_addr(reg, target_len + SIZE_OP_REPEAT_INC);
   if (r) return r;

같은 커밋은 오류 코드 ONIGERR_TOO_MANY_RANGE_REPEAT를 새로 정의하고, 반복 10만 개 패턴이 RegexpError로 거부되는지 확인하는 회귀 테스트를 추가했습니다. 널 체크 ID에 대해서도 같은 방식의 검사(ONIGERR_TOO_MANY_NULL_CHECK)가 함께 들어갔습니다. 수정은 Ruby의 PR #16801로 반영됐으며, GitLab은 10월 21일 패치 릴리스에서 자체 번들 Ruby(3.3·3.4·4.0)에 이 수정을 담아 먼저 배포했고 Ruby 측 정식 릴리스는 10월 23일에 나왔습니다.

‍

■ 미인증 입력이 닿는 경로

‍

GitLab은 저장소의 .org 파일을 HTML로 렌더링합니다. Org 모드(이맥스에서 쓰이는 구조화된 텍스트 형식)는 헤드라인이 TODO·DONE 같은 상태 키워드로 시작할 수 있고, 문서 안의 #+TODO: 줄로 어떤 키워드를 쓸지 직접 정의할 수 있습니다. GitLab 보안팀 탐지 문서에 따르면 이 렌더링을 담당하는 Ruby 라이브러리(젬)는 org-ruby 0.9.12이며, Gitlab::OtherMarkup·gitlab-markup 경로로 호출됩니다. 이 젬이 문서에 선언된 키워드를 그대로 정규식으로 컴파일하기 때문에, .org 페이로드를 올릴 수 있는 공개 프로젝트 하나만으로 인증 없이 취약 경로에 도달한다는 것이 문서의 설명입니다.

아래는 org-ruby version-0.9.12 태그의 lib/org-ruby/headline.rb에서 헤드라인 앞의 상태 키워드를 떼어내는 parse_keywords 메서드입니다. 문서가 선언한 키워드 목록으로 만든 정규식(re)에 헤드라인의 첫 단어가 걸리면, 그 단어를 문자열 보간으로 끼워 넣어 Regexp.new로 다시 컴파일합니다. 목록을 만들 때는 Regexp.escape로 특수문자를 막지만, 이 재컴파일 구간에는 같은 처리가 없어 문서가 제공한 문자열이 정규식 문법으로 해석됩니다.

    def parse_keywords
      re = @parser.custom_keyword_regexp if @parser
      re ||= KeywordsRegexp
      words = @headline_text.split
      if words.length > 0 && words[0] =~ re then
        @keyword = words[0]
        @headline_text.sub!(Regexp.new("^#{@keyword}\s*"), "")
      end
    end

⚠️ WARN

GitLab 권고는 악용 전제 조건을 상세히 공개하지 않았습니다.
미인증 사용자가 볼 수 있는 공개 프로젝트가 없더라도 영향 버전이라면 패치 대상입니다.
패치 외의 임시 대응책은 권고에 제시되지 않았습니다.

‍

■ 탐지 및 점검

‍

• 운영 중인 인스턴스의 버전을 확인해 영향 범위에 드는지 먼저 확정합니다.

• 예외 로그 exceptions_json.log에서 마크업 렌더러의 Timeout::Error 급증을 점검합니다. GitLab 보안팀 탐지 문서는 OtherMarkup 클래스와 .org 파일명이 함께 기록된 타임아웃을 동일 클라이언트가 30분 안에 5회 이상 유발하는 패턴을 탐지 기준으로 제시합니다.

• 요청 로그 production_json.log에서 URL 경로에는 .org가 없는데 요청에 전달된 파일 경로만 .org로 끝나는 미리보기 요청이 있는지 확인합니다. 탐지 문서는 이 불일치를 Org 렌더러를 강제로 호출하는 신호로 봅니다.

• 저장소에 비정상적으로 긴 #+TODO:·#+SEQ_TODO:·#+TYP_TODO: 선언(탐지 문서 기준 500자 이상)이 들어간 .org 파일이 있는지 점검하고, 커밋 작성자와 공개 범위를 함께 확인합니다.

• Puma·Sidekiq 등 애플리케이션 프로세스의 반복 비정상 종료와 git 사용자 권한에서 생성된 예기치 않은 자식 프로세스를 점검합니다.

✅ CHECK

위 로그 항목을 쓰려면 exceptions_json.log와 production_json.log가 로그 수집 대상에 들어가 있어야 합니다.
수집 범위에서 빠져 있으면 위 로그를 바탕으로 과거 시도 여부를 사후 확인하기 어렵습니다.

‍

■ 대응 방안

‍

• self-managed 인스턴스를 사용 중인 분기의 패치 버전(18.11.13, 19.0.10, 19.1.9, 19.2.9, 19.3.6, 19.4.3, 19.5.1) 이상으로 업그레이드합니다.

• 수정이 GitLab 번들 Ruby에 포함돼 배포되므로, 패키지나 컨테이너 이미지 단위로 업그레이드해 번들 런타임까지 교체해야 합니다.

• 즉시 업그레이드가 불가능하다면 인스턴스의 인터넷 노출 범위와 미인증 사용자가 접근할 수 있는 프로젝트 범위를 줄여 공격 표면을 낮춥니다.

• 사용자 입력을 Regexp.new에 넘기는 자체 Ruby 애플리케이션은 해당 코드 경로를 점검하고 Ruby 4.0.9·3.4.12·3.3.13 이상으로 올립니다.

• 위 점검에서 침해가 의심되는 흔적이 나오면 해당 인스턴스가 보관한 러너 등록 토큰, 배포 키, 개인 접근 토큰의 교체를 우선 검토합니다.

💡 TIP

GitLab.com과 Dedicated는 이미 패치된 상태이므로, 일반 독자는 사내에서 쓰는 GitLab이 self-managed 설치본인지만 확인하면 됩니다.
self-managed라면 운영 담당 조직에 업그레이드 적용 여부만 확인하면 됩니다.

‍

[참고 자료]

• GitLab 긴급 패치 릴리스 19.5.1 외

• CVE-2026-110264 공식 레코드

• Ruby — GitLab CVE 관련 정규식 컴파일 수정 공지

• Ruby 4.0.9 릴리스 공지

• ruby/ruby 패치 커밋 493d26d — 반복·널 체크 ID 오버플로 거부

• org-ruby version-0.9.12 — lib/org-ruby/headline.rb

• org-ruby version-0.9.12 — lib/org-ruby/parser.rb

• GitLab 보안팀 — Org 모드 렌더 오류 급증 탐지 문서

• 인포그랩 — GitLab 파트너 서비스 소개

• 금융권 GitLab 기반 DevSecOps 구축 사례 웨비나

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

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

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

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

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