인증된 임의 파일 업로드로 이어지는 원격 코드 실행 — Webkul Krayin CRM 2.2.x의 CVE-2026-38526에 대한 기술 분석 및 통제된 재현.
인증된 사용자의 임의 파일 업로드로 이어지는 원격 코드 실행 — Webkul Krayin CRM 2.2.x의 CVE-2026-38526에 대한 기술 분석 및 통제된 재현.
CVE-2026-38526은 Webkul Krayin CRM 2.2.x에 영향을 미치는 인증된 사용자의 임의 파일 업로드 취약점입니다.
취약한 기능은 애플리케이션의 TinyMCE 업로드 엔드포인트를 통해 노출됩니다:
POST /admin/tinymce/upload
애플리케이션은 업로드할 수 있는 파일 유형을 충분히 제한하지 않습니다. 인증된 사용자는 .php와 같은 서버 측 실행 가능 확장자를 가진 파일을 제출할 수 있습니다. 애플리케이션은 업로드된 파일을 저장하고 접근 가능한 URL을 반환합니다.
배포 환경에서 업로드 위치로부터의 PHP 실행이 허용되는 경우, 업로드된 파일은 이후 웹 서버를 통해 요청될 수 있으며, 그 결과 웹 애플리케이션 프로세스의 컨텍스트에서 원격 코드 실행이 발생합니다.
공개된 CVE 기록은 이 취약점을 CVSS 3.1: 9.9 (Critical)로 평가합니다.
이 저장소에는 취약점에 대한 저의 기술 분석과 통제된 재현이 포함되어 있습니다.
이 취약점은 이미 CVE-2026-38526으로 공개적으로 공개되었습니다. 본 작업은 취약점의 발견을 주장하지 않습니다. 이 연구의 목적은 취약한 구현을 이해하고, 통제된 환경에서 익스플로잇 경로를 재현하며, 파일 업로드 문제가 원격 코드 실행으로 전환되는 조건을 조사하는 것이었습니다.
이 취약점은 Hack The Box GCSB 2026 Nexus 머신에서도 사용되었으며, 이는 해당 문제를 연구하기 위한 실용적인 환경을 제공했습니다.
제품: Webkul Krayin CRM 영향을 받는 버전: 2.2.x 취약점: 임의 파일 업로드 결과적 영향: 원격 코드 실행 인증: 필요 공격 벡터: 네트워크 CWE: CWE-434 — 위험한 유형의 파일 무제한 업로드 CVSS: 9.9 Critical CVE: CVE-2026-38526
취약한 기능은 다음에 의해 처리됩니다:
/admin/tinymce/upload
이 엔드포인트는 file 매개변수를 통해 업로드된 파일을 받습니다. 관련 애플리케이션 로직은 원본 파일명으로부터 저장 파일명을 도출하며 원래 확장자를 유지합니다.

이 동작은 애플리케이션이 단순히 업로드된 객체를 받아들이는 것이 아니라, 공격자가 제어하는 실행 가능 확장자를 유지하고 결과 객체를 애플리케이션 저장 메커니즘을 통해 접근 가능하게 만들기 때문에 중요합니다.
주요 문제는 업로드된 파일에 대한 서버 측 검증이 불충분하다는 것입니다.
애플리케이션은 저장 파일명을 구성할 때 클라이언트가 제공한 원래 확장자를 사용합니다. 실행 가능한 파일 유형이 저장 계층에 도달하는 것을 막는 충분히 제한적인 허용 목록이 없습니다.
관련 흐름은 다음과 같습니다

생성된 파일명을 사용하는 것만으로는 근본적인 문제를 해결하지 못합니다.
예를 들어, shell.php를 .php와 같은 생성된 파일명으로 변경하더라도, 서버가 계속 .php 파일을 실행 가능한 PHP 코드로 해석한다면 업로드된 파일을 안전하게 만들지 못합니다.
무제한 업로드가 자동으로 원격 코드 실행을 의미하지는 않습니다.
실행 경로는 업로드된 파일에 대한 서버의 처리 방식에 따라 달라집니다.
취약한 배포 시나리오에서 체인은 다음과 같습니다

업로드 디렉터리에 대해 PHP 실행이 비활성화된 경우, 근본적인 임의 파일 업로드 약점이 남아 있더라도 직접적인 RCE 경로는 방지될 수 있습니다.
wget:
wget https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/upload.py
wget https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/marker.php
curl:
curl -LO https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/upload.py
curl -LO https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/marker.php
2. 파일을 다음 위치에 배치합니다
poc/
├── upload.py
└── marker.php
3. Python 환경을 생성하고 의존성을 설치합니다
python3 -m venv .venv
source .venv/bin/activate
pip install requests
4. PoC를 실행 가능하게 만듭니다
chmod +x poc/upload.py
6. 실행합니다
python3 poc/upload.py \
--url http://[Lab_IP:PORT] \
--email [email protected] \
--password 'YOUR_PASSWORD'
익스플로잇을 위해서는 취약한 기능에 접근할 수 있는 인증된 계정이 필요합니다.
개략적으로 설명하면 다음과 같습니다:
결과적인 실행 컨텍스트는 기반 배포 환경에 따라 결정됩니다. 일반적인 Linux 배포 환경에서는 다음과 같은 웹 서버 서비스 계정일 수 있습니다:
www-data
이는 자동으로 운영체제의 root 권한을 제공하지는 않습니다. 추가적인 영향은 침해된 환경의 권한과 구성에 따라 달라집니다.
취약한 동작은 세 가지 중요한 작업으로 요약할 수 있습니다.
업로드된 파일을 가져옵니다
$file = request()->file('file');
애플리케이션은 클라이언트가 제공한 파일을 수신합니다.
클라이언트가 제어하는 확장자를 유지합니다
$filename = md5($file->getClientOriginalName().time())
.'.'.$file->getClientOriginalExtension();
파일 이름 자체는 변경되지만 원래 확장자는 유지됩니다. 이는 중요한 구분입니다: 파일 이름 무작위화는 파일 유형 검증이 아닙니다.
파일을 저장하고 노출합니다
$path = $file->storeAs($this->storagePath, $filename);
return [
'file' => $path,
'file_name' => $file->getClientOriginalName(),
'file_url' => Storage::url($path),
];
애플리케이션은 파일을 저장하고 클라이언트에 해당 URL을 제공합니다.
익스플로잇에 성공하면 공격자는 웹 애플리케이션의 권한으로 코드를 실행할 수 있습니다.
배포 환경에 따라 공격자는 다음을 수행할 수 있습니다:
애플리케이션 파일 읽기
애플리케이션 구성에 액세스
데이터베이스 자격 증명 또는 기타 비밀 정보 획득
애플리케이션 데이터 수정
추가 악성 코드 배포
침해된 호스트에서 접근 가능한 다른 시스템으로 피벗
추가 권한 상승 시도
실제 영향은 침해된 애플리케이션 프로세스의 권한과 기반 시스템의 보안 구성에 따라 달라집니다.
안전한 구현은 단일 확장자 검사에 의존하지 않고 여러 계층의 보호를 사용해야 합니다.
명시적으로 필요한 파일 유형만 허용해야 합니다. 예를 들어:
.jpg
.jpeg
.png
.gif
.webp
정확한 허용 목록은 애플리케이션의 정당한 요구 사항을 반영해야 합니다.
다음에만 의존하지 마십시오:
업로드된 파일은 서버에서 생성한 이름을 받아야 하며, 공격자가 제어하는 실행 가능한 확장자를 유지해서는 안 됩니다.
사용자 업로드 콘텐츠를 위한 디렉터리에서는 PHP 및 기타 서버 측 인터프리터를 비활성화해야 합니다. 이는 업로드 검증 제어가 우회되더라도 추가적인 보안 경계를 제공합니다.
가능한 경우, 업로드된 콘텐츠는 실행 가능한 웹 루트 외부에 저장하고 통제된 메커니즘을 통해 제공해야 합니다.
업로드 기능이 실제로 필요한 인증된 사용자와 역할만 엔드포인트에 접근할 수 있어야 합니다.
CVE-2026-38526은 이 연구 이전에 공개적으로 공개되었습니다.
이 저장소는 취약점에 대한 저의 독립적인 기술 분석과 통제된 재현을 나타냅니다. 이는 최초 발견이나 CVE 할당을 주장하지 않습니다.
연구자: Gabriel D. Ishengoma
중점 분야: 취약점 연구 / 공격적 보안
CVE-2026-38526 MITRE CVE 레코드: https://cve.org/CVERecord?id=CVE-2026-38526
NVD CVE-2026-38526: https://nvd.nist.gov/vuln/detail/CVE-2026-38526
Webkul Krayin CRM 업스트림 소스 코드: https://github.com/krayin/laravel-crm
CVE-2026-38526 공개 보안 권고: https://github.com/advisories/GHSA-7xqf-8v3m-6q9w
Hack The Box GCSB 2026 Nexus: https://app.hackthebox.com/machines/Nexus
Krayin CRM 2.2.x에 대한 독립 기술 분석: https://github.com/Ish3ng0m4