
CVE-2025-53652: Jenkins Git Parameter 분석
이 취약점은 Jenkins 빌드 파라미터의 사용자 제어 입력이 Git 체크아웃 명령에 안전하지 않게 주입되기 때문에 발생합니다.
사용자 입력은 빌드 파라미터(예: gitParameters)로 제공되며, 여기에는 악의적인 셸 명령이 포함될 수 있습니다.
이 파라미터는 GitParameterValue(StringParameterValue를 확장)로 래핑되며, 해당 GitParameterValue의 buildEnvironment() 메서드는 이를 살균 없이 빌드 컨텍스트의 환경 변수로 노출합니다.
SCM 체크아웃 프로세스 중에 Jenkins는 build.getEnvironment()를 통해 빌드 환경 변수를 로드합니다.
체크아웃에 사용되는 브랜치 이름(localBranchName)은 이러한 환경 변수에서 가져옵니다.
그런 다음 브랜치 이름은 CheckoutCommand.branch() 메서드에 직접 전달됩니다.
마지막으로, CheckoutCommand.execute()는 기본 Git CLI 명령을 호출하며, 브랜치 이름은 검증이나 이스케이프 없이 연결됩니다.
이로 인해 명령 삽입이 가능해져, 공격자가 Jenkins 빌드 호스트에서 임의의 셸 명령을 실행할 수 있습니다.
사용자 입력(예: HTTP POST JSON 페이로드)을 처리하는 createValue 메서드, Jenkins가 요청을 통해 사용자가 제공한 파라미터 값(예: "selected": "master; rm -rf /")을 수용하는 지점입니다.
입력은 입력 살균이나 검증 없이 StringParameterValue를 확장하는 GitParameterValue로 래핑됩니다.
즉, 원시 사용자 데이터가 빌드 파라미터로 수용되어 ParameterValue 인스턴스로 저장됩니다.

StringParameterValue를 확장하는 GitParameterValue 클래스, GitParameterValue는 StringParameterValue에서 상속하지만 살균 로직을 추가하지 않습니다.
생성자 체인은 사용자 입력이 이후 Jenkins가 환경 변수를 구성하는 데 사용할 객체에 저장된다는 것을 의미합니다.
이로써 악의적인 입력이 Jenkins의 빌드 환경 변수로 전파됩니다.
"
StringParameterValue 클래스와 해당 buildEnvironment 메서드, 이 메서드는 핵심적입니다 — 파라미터를 빌드 컨텍스트의 환경 변수로 노출하며, 다음과 같이 수행합니다.
"
env.put(name, value);
env.put(name.toUpperCase(Locale.ENGLISH), value);
값이 살균되지 않은 사용자 입력이므로, 악의적인 입력이 Jenkins의 환경 변수에 유입되어 Git 명령과 같은 이후 프로세스에서 접근할 수 있게 됩니다.
GitSCM 플러그인의 _checkout 메서드, 이 메서드는 build.getEnvironment(listener)를 호출하여 앞서 설정된 악의적인 환경 변수를 포함한 환경 변수들을 수집합니다.
이 변수들을 사용하여 브랜치 이름(localBranchName을 통해)을 가져오며, 이 이름은 이후 CheckoutCommand에 전달됩니다.
악의적인 파라미터의 환경 변수가 체크아웃 프로세스로 직접 유입됩니다.

CheckoutCommand 생성 및 사용자 입력으로 브랜치/ref 설정, CheckoutCommand.branch(localBranchName)는 살균되지 않은 환경 변수를 사용합니다.
localBranchName이 사용자 제어 환경 변수에서 비롯되었으므로, 체크아웃에 임의의 명령을 주입하며, 이는 execute()가 호출될 때 명령 삽입의 발판이 됩니다.

Git CLI 명령을 실행하는 CheckoutCommand.execute() 메서드, 주입된 브랜치 문자열이 이스케이프나 살균 없이 시스템의 Git CLI에 직접 전달되는 마지막 단계입니다. 그 결과, 악의적인 페이로드가 셸 명령으로 실행되어 Jenkins 호스트에서 원격 코드 실행이 가능해집니다.

이 분석은 Jenkins의 Git Parameter Plugin이 Git SCM 플러그인과 결합할 때 심각한 명령 삽입 취약점으로 이어질 수 있음을 보여줍니다.
사용자 제어 파라미터 값을 환경 변수로 안전하지 않게 노출하고, 이를 적절한 살균 없이 Git CLI 명령에 직접 전달함으로써, 공격자는 Jenkins 빌드 서버에서 임의의 명령을 실행할 수 있습니다.
이러한 신뢰 체인 붕괴—초기 악성 JSON 페이로드에서 최종 셸 실행까지—는 지속적 통합 시스템에서 엄격한 입력 검증과 빌드 파라미터의 안전한 처리의 중요성을 강조합니다.
사용자와 관리자는 Jenkins 및 모든 플러그인의 업데이트된 버전을 실행하고 있는지 확인하고, 셸 명령에 영향을 미치는 모든 파라미터를 주의 깊게 감사해야 합니다.
입력 살균, 허용 브랜치 화이트리스트, 빌드 환경 격리와 같은 완화 조치로 위험을 줄일 수 있습니다.
이 흐름을 이해하면 보안 전문가와 개발자가 Jenkins 또는 유사한 CI/CD 플랫폼에서 유사한 삽입 취약점을 탐지, 예방, 그리고 해결하는 데 필요한 통찰력을 얻을 수 있습니다.