
Ruby 4.0.9, 3.4.12, 3.3.13은 정규식 엔진 Onigmo의 결함을 수정한다. 공격자가 조작한 문자열로 정규식을 컴파일하는 애플리케이션은 원격 코드 실행 위험에 노출될 수 있어 해당 버전 이상으로 업그레이드해야 한다.
GitLab은 사용자 제공 CI 설정 등의 정규식을 Ruby의 Regexp.new로 컴파일하는 과정에서 메모리 손상이 발생할 수 있고, 이를 서버 원격 코드 실행으로 이어지게 할 수 있다고 발견했다. GitLab은 자체 릴리스에 포함된 Ruby를 패치하고 다음 CVE를 부여했다.
- CVE-2026-89078: 정규식 파서의 이중 해제 문제. GitLab 19.4.1에서 수정했다.
- CVE-2026-93577: 정규식 컴파일러의 정수 오버플로 문제. GitLab 19.4.1에서 수정했다.
- CVE-2026-97229: CI/CD 정규식 컴파일러의 정수 오버플로 문제. GitLab 19.4.2에서 수정했다.
- CVE-2026-110264: 정규식 컴파일러의 정수 오버플로 문제. GitLab 19.5.1에서 수정했다.
Ruby에서 각 결함을 수정한 변경 사항과 해당 수정이 포함된 시리즈별 첫 버전은 다음과 같다.
| GitLab CVE | Ruby 결함 | 변경 사항 | Ruby 4.0 | Ruby 3.4 | Ruby 3.3 |
|---|---|---|---|---|---|
| CVE-2026-89078 | 대체(alternation) 뒤 패턴 분석이 실패할 때 발생하는 이중 해제 | #13332 | 4.0.0 | 3.4.12 | 3.3.13 |
| CVE-2026-93577, CVE-2026-97229 | 컴파일된 패턴 크기의 정수 오버플로 | #19020 | 4.0.8 | 3.4.12 | 3.3.13 |
| CVE-2026-110264 | 반복이 많은 패턴에서 내부 ID 오버플로 | #16801 | 4.0.9 | 3.4.12 | 3.3.13 |
Ruby 4.0.9, 3.4.12, 3.3.13에는 위 수정 사항이 모두 들어 있다. 취약점은 애플리케이션이 공격자가 통제하는 문자열을 정규식으로 컴파일할 때만 발생한다. 입력을 Regexp.new, Regexp.union, Regexp.compile에 전달하거나 /#{input}/처럼 정규식 리터럴에 삽입하는 경우가 이에 해당한다. 개발자가 작성한 정규식만 사용하는 애플리케이션은 영향을 받지 않는다.
Regexp.timeout은 이 결함을 막지 못하며, 패턴 길이 제한도 일부 결함이 짧은 패턴으로 유발될 수 있어 신뢰할 만한 방어책이 아니다. 업그레이드할 수 없다면 신뢰할 수 없는 입력으로 정규식을 컴파일하지 말아야 한다.
Ruby 3.3은 보통 취약점 수정만 제공하는 보안 유지보수 단계에 있지만, 이번에는 GitLab이 관련 문제에 CVE를 부여해 예외적으로 3.3.13을 출시했다.
Ruby 측은 이번 수정에 대한 CVE 식별자를 아직 요청하지 않았다. Ruby는 신뢰할 수 없는 입력으로 만든 정규식을 컴파일하고 사용하는 것을 일반적으로 안전하지 않은 행위로 봐 왔다. 다만 CVE-2022-28738 권고에서는 충분한 평가를 거쳐 정규식 컴파일 중 발생하는 이중 해제를 취약점으로 다뤘고, CVE-2024-27282도 같은 방식으로 처리했다.
현재 Regexp 문서는 신뢰할 수 없는 패턴을 서비스 거부 관점에서만 다루고 시간 초과 설정을 권한다. 신뢰할 수 없는 패턴의 컴파일이 Ruby에서 지원하는 사용 사례인지는 명확히 설명하지 않는다. Ruby 측은 문서화 방식과 이런 문제를 Ruby의 취약점으로 다룰지, CVE를 요청할지를 논의할 계획이며, 요청할 경우 해당 페이지를 갱신하겠다고 밝혔다. 그동안 보안 스캐너 등에서 추적할 때는 GitLab이 부여한 CVE를 사용하면 된다.
GitLab 버그 바운티 프로그램을 통해 #19020의 정수 오버플로를 발견한 요한 칼손(Johan Carlsson, joaxcar)과 문제를 보고하고 수정 조율을 도운 GitLab에 감사의 뜻을 전했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요