DEEP DIVE REPORT

CVE-2026-67324 대응 가이드: GitPython unsafe-option 가드 우회와 커맨드 인젝션 위험

SecurityDesk
2026.08.03 조회 1

CVE-2026-67324 대응 가이드: GitPython 결합형 단축 옵션 우회와 명령 실행 위험

요약
CVE-2026-67324는 GitPython 3.1.50 이하에서 Repo.clone_from()에 전달되는 결합형 단축 옵션 -u<값>을 안전하지 않은 옵션으로 제대로 식별하지 못하는 문제입니다. 외부 입력이 multi_options로 흘러들어가는 애플리케이션은 Git의 업로드 헬퍼 실행으로 이어질 수 있으므로, GitPython 3.1.51 이상으로 업데이트하고 옵션 전달 경로를 즉시 점검해야 합니다.

위협 요약

이 취약점은 공격자가 제어하는 clone 옵션이 GitPython의 안전장치를 우회해 Git에 전달될 때 발생합니다. 악용에 성공하면 GitPython을 실행하는 계정의 권한으로 지정된 업로드 헬퍼가 실행될 수 있어, 소스코드·배포 자격증명 접근이나 CI/CD 환경 침해로 확대될 수 있습니다. 공개 CVE 레코드의 CVSS v4 기본 점수는 9.3(Critical), CVSS v3.1 기본 점수는 9.8(Critical)입니다.

취약점 개요

GitPython의 기본 안전장치는 --upload-pack 또는 그 단축형 -u처럼 명령 실행에 영향을 줄 수 있는 옵션을 차단하도록 설계돼 있습니다. 그러나 CVE-2026-67324에서는 -u<값>처럼 옵션과 값이 붙은 형태가 이 검사에서 누락됩니다. CVE 레코드는 영향을 받는 범위를 GitPython 3.1.50 이하, 수정 버전을 3.1.51로 명시합니다.

취약점은 CWE-78(OS 명령 인젝션)으로 분류되며, 공개 레코드의 CVSS v4 기본 점수는 9.3(Critical), CVSS v3.1 기본 점수는 9.8(Critical)입니다. 다만 실제 노출 여부는 애플리케이션이 공격자가 영향을 줄 수 있는 값을 clone 옵션으로 전달하는지에 달려 있습니다.

기술적 분석

문제 경로는 Repo.clone_from(..., multi_options=..., allow_unsafe_options=False)입니다. 정상적으로는 --upload-pack=<도우미>-u <도우미>처럼 위험한 옵션을 막아야 하지만, 결합형 -u<도우미>가 안전성 검사에 포착되지 않을 수 있습니다.

이 우회가 성공하면 Git은 지정된 업로드 헬퍼를 실행할 수 있습니다. 따라서 위험의 핵심은 GitPython이 셸 문자열을 단순히 이어 붙인다는 데 있지 않고, 차단돼야 할 Git 옵션이 실행 단계까지 전달될 수 있다는 데 있습니다. 공격자가 옵션 값 또는 그에 영향을 주는 입력을 제어하고, 해당 코드 경로가 실행돼야 실제 악용으로 이어집니다.

영향 범위

위험한 구성의 예는 웹훅, API, CI 작업 또는 자동화 서비스가 외부 사용자의 요청에서 저장소 주소·동기화 설정·추가 clone 옵션을 받아 GitPython의 multi_options로 전달하는 경우입니다. 특히 입력을 옵션 목록으로 그대로 변환하거나, 신뢰 경계가 다른 시스템에서 전달된 값을 재검증 없이 사용하는 흐름을 우선 확인해야 합니다.

성공적으로 악용되면 GitPython을 실행하는 계정 권한으로 임의의 도우미 명령이 실행될 수 있습니다. 그 결과 소스코드와 배포 자격증명 접근, 빌드·배포 파이프라인 변조, 동일 호스트 내 추가 침해로 확대될 수 있습니다. 반대로 애플리케이션이 공격자 제어 옵션을 전혀 전달하지 않거나 고정된 신뢰 옵션만 사용한다면 직접적인 공격 표면은 작아집니다.

영향 가능 여부는 외부 또는 신뢰도가 낮은 입력이 multi_options에 도달하는지에 좌우됩니다. 웹훅, API, CI 작업 또는 자동화 서비스가 저장소 주소·동기화 설정·추가 clone 옵션을 받아 그대로 전달하는 환경을 우선 점검해야 합니다.

배포 환경과 잠금 파일에서 GitPython 버전을 확인합니다. pip show GitPython, pipdeptree, requirements*.txt, poetry.lock, uv.lock 등으로 3.1.50 이하의 직접·간접 의존성을 찾습니다. 컨테이너 이미지와 CI 러너의 독립된 Python 환경도 빠뜨리지 않아야 합니다.

Repo.clone_from 호출과 multi_options 사용처를 검색해 각 호출부의 옵션이 상수인지, HTTP 요청·저장소 메타데이터·작업 큐·환경 변수 등 외부 또는 신뢰도가 낮은 데이터에서 왔는지 추적합니다. 이미 완료된 작업 로그에서 -u 또는 --upload-pack 사용 흔적을 찾을 때는 조사 목적의 읽기 전용 검토를 우선하고, 의심 행위가 있으면 실행 계정의 자격증명 교체와 격리를 포함한 사고 대응 절차를 적용합니다.

대응 방안

  1. GitPython을 3.1.51 이상으로 업데이트하고, 잠금 파일을 갱신한 뒤 애플리케이션과 빌드 이미지에 실제 반영됐는지 확인합니다.
  2. 외부 입력을 multi_options에 전달하지 않습니다. 기능상 필요한 경우 허용된 옵션·값의 고정 목록을 코드에서 정의하고, 그 목록 밖의 값과 결합형 단축 옵션은 거부합니다.
  3. 저장소 URL, 브랜치, ref와 옵션을 서로 다른 타입과 검증 규칙으로 처리합니다. URL이나 브랜치 입력을 옵션 배열로 재사용하지 않습니다.
  4. GitPython 실행 계정에는 최소 권한을 부여하고, 배포용 비밀값·클라우드 권한·호스트 쓰기 권한을 분리합니다. CI에서는 일회성 자격증명과 격리된 러너를 사용합니다.
  5. 수정 후에는 안전하지 않은 옵션 거부가 유지되는지 회귀 테스트를 추가하고, 실제 서비스 경로에서 외부 입력이 옵션으로 전달되지 않는지 코드 리뷰와 로그 검토로 검증합니다.

참고문헌

  • CVE Program — CVE-2026-67324: https://www.cve.org/CVERecord?id=CVE-2026-67324
  • GitHub Security Advisory — GHSA-v396-v7q4-x2qj: https://github.com/advisories/GHSA-v396-v7q4-x2qj
  • GitPython 3.1.51 릴리스: https://github.com/gitpython-developers/GitPython/releases/tag/3.1.51
  • PyPI — GitPython 3.1.51: https://pypi.org/project/GitPython/3.1.51/
  • VulnCheck — GitPython 3.1.50 Authentication Bypass via Joined Short Options: https://www.vulncheck.com/advisories/gitpython-authentication-bypass-via-joined-short-options

본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.

로그인

아직 댓글이 없습니다.

첫 번째 댓글을 작성해보세요!

IT 도구 서랍

→ Unix: 2025-01-15T09:30:00
→ 날짜: 1736934600

→ ASCII: ABC
→ 문자: 65 66 67

ASCII 코드표 — 클릭하면 입력란에 추가

DecHex약어설명
DecHex문자
DecHex문자

→ 유니코드: 홍길동
→ 문자: \ud64d\uae38\ub3d9