주피터 노트북 파일 렌더링 과정 악용 시 방어막 우회해 서버 권한 탈취
[보안뉴스 조재호 기자] 루비(Ruby)와 같은 메모리 안전(Memory-safe) 언어로 구축된 협업 플랫폼 깃랩(GitLab)에서 하위 C 언어 확장 모듈의 메모리 손상 취약점을 악용한 원격 코드 실행(RCE) 공격 경로가 밝혀졌다.

사이버보안 연구소 뎁스퍼스트(depthfirst)는 오픈 디펜스 이니셔티브 프로젝트의 일환으로 루비 환경에서 광범위하게 쓰이는 고성능 JSON Parser ‘Oj’ gem 모듈을 분석한 결과 총 18개의 주요 취약점과 7개의 메모리 안전성 위반 요소를 발견했다고 전했다. 이 중 버퍼 경계 초과 쓰기(Out-of-bounds write)와 힙 포인터 노출(Heap-pointer disclosure) 취약점 2종이 결합되어 깃랩 환경의 RCE 공격 체인으로 이어졌다.
이번 취약점의 핵심 진입점은 깃랩 내부의 주피터 노트북(Jupyter Notebook; .ipynb) 차이점(Diff) 렌더링 기능이다. 주피터 노트북 파일은 JSON 구조체로 저장된다. 깃랩은 사용자가 커밋한 노트북 파일의 변경 사항을 시각적으로 변환하기 위해 자체 내부 모듈인 ‘ipynbdiff’(ipynbdiff)를 거쳐 C 네이티브 확장으로 작성된 Oj Parser를 호출한다.
공격 메커니즘을 살펴보면, 검증되지 않은 중첩 스택 구조로 인한 버퍼 오버플로 버그가 Parser 내부 상태 포인터를 조작하는 쓰기 수단을 제공했다. 여기에 키 길이 변환 오류로 발생한 힙 포인터 노출 버그가 결합하면서 루비 런타임의 가상 머신 메모리 구성을 직접 제어할 수 있는 상태에 도달했다.
공격자는 프로젝트에 악의적으로 조작된 .ipynb 파일을 커밋한 뒤 웹 브라우저에서 해당 커밋의 차이점 페이지를 조회하는 것만으로 공격 코드를 실행할 수 있다. 요청을 받은 웹서버 워커 프로세스인 푸마(Puma) 내부에서 Oj C 확장에 저장소 데이터가 전달되며 원격 코드 실행이 완료된다.
해당 취약점은 Oj Parser 코드에 2021년 8월 8일 처음 유입된 이후 약 5년 동안 방치되었다. 깃랩에는 2022년 7월 모듈 업데이트와 함께 도입되어 깃랩 CE 및 EE 15.2.0 버전부터 18.11.4 및 19.0.1 버전까지 영향을 미쳤다. 깃랩 측은 보고를 받은 직후 Oj 3.17.3 버전으로 패치한 보안 업데이트를 긴급 배포했다.
문광석 한국정보공학기술사회 미래융합기술원장은 “최근 많은 공격의 시발점이 된 GitHub외에도 내부적인 Repository로 각광 받는 Gitlab도 안전할 수 없다는 점이 확인된 사건”이라며 “단순 패치를 넘어 사용자 입력이 도달하는 내부 Parser까지 확장해 좀 더 큰 입력 범위의 위협 모델링으로 ‘Secure by Design’ 방식의 검토가 필요할 것” 이라고 말했다.
[조재호 기자(zephyr@boannews.com)]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>














