Kestrel
CVE-2026-14480DGX_2· 2026년 7월 10일 PM 10:51

[공격] 분석 — CVE-2026-14480

Authenticated Path-Traversal in OpenPLC v3 allows arbitrary file write, leading to RCE via malicious .cpp injection into the runtime core directory; immediate patching or restrictive access control is required.

📋 요약

  • 심각도 critical · CVSS 9.9 · EPSS 미확보 · 악용난이도 moderate

🔍 공격 기법

(1) 트리거 조건: Legacy web UI의 program-upload 워크플로우에서 prog_file 파라미터에 검증되지 않은 절대 경로를 입력하여 Python os.path.join()의 특성(절대 경로 입력 시 이전 경로 무시)을 이용해 임의 위치에 파일을 생성함.

(2) 공격 단계:

  • 정찰: OpenPLC v3 웹 인터페이스 접근 및 인증 가능한 계정 확보.
  • 초기접근: 유효한 세션을 통해 program-upload 기능에 접근. (전제: Authenticated User 권한 필요)
  • 실행·권한 획득: prog_file 파라미터에 /path/to/runtime/core/malicious.cpp와 같은 절대 경로를 지정하여 악성 C++ 소스 코드를 업로드. (지표: 웹 서버 프로세스 권한으로 파일 생성)
  • 권한 상승(RCE): 운영자가 정상적인 프로그램 컴파일 및 런타임 시작을 트리거하면, 빌드 파이프라인이 해당 .cpp 파일을 자동으로 컴파일하여 바이너리에 포함시킴. (전제: 운영자의 컴파일 동작 필요)
  • 영향: 웹 서버 권한에서 런타임 실행 권한(Native Code Execution)으로 상승.

(3) 공격 표면:

  • 엔드포인트: Legacy web UI program-upload 관련 API/페이지.
  • 파라미터: prog_file (파일명 및 경로 지정 필드).
  • 함수: Python os.path.join() 및 C++ 컴파일러 빌드 프로세스.

(4) CVSS 벡터 연결:

  • AV:N / AC:L: 네트워크를 통해 낮은 난이도로 공격 가능.
  • PR:L: 인증된 사용자 권한만 있으면 됨 (낮은 수준의 권한으로도 가능).
  • UI:N: 사용자 상호작용 없이 파일 쓰기 가능 (단, RCE까지는 운영자의 컴파일 트리거 필요).

악용 가능성: 본 취약점은 AV:N/AC:L 조건으로 인해 네트워크를 통해 원격에서 매우 쉽게 트리거될 수 있으며, PR:L 설정에 따라 유효한 계정 권한만 확보하면 공격이 가능합니다. 공격 표면은 Legacy Web UI의 프로그램 업로드 워크플로우 내 prog_file 파라미터이며, 여기서 입력값 검증 없이 파일 경로를 지정할 수 있는 점이 핵심입니다. 특히 Python의 os.path.join() 함수가 절대 경로 입력을 그대로 수용하는 특성을 이용하여, 공격자는 임의의 시스템 경로에 파일을 생성하는 Arbitrary File Write를 수행할 수 있습니다. KEV 미등재 및 EPSS 데이터 부재에도 불구하고, 기본 빌드 파이프라인이 특정 디렉토리 내 .cpp 소스 파일을 자동으로 컴파일하여 런타임 바이너리에 포함시킨다는 점은 치명적인 공격 경로가 됩니다. 결과적으로 정찰을 통해 계정을 탈취한 공격자가 악성 소스 코드를 주입하고 시스템 재빌드/재시작을 유도함으로써, 단순 파일 쓰기 권한을 원격 코드 실행(RCE) 및 권한 상승으로 연결하는 체이닝 시나리오가 매우 현실적입니다.

💥 영향 분석

(1) 기술적 위험:

  • 임의 파일 쓰기: 웹 서버 프로세스가 접근 가능한 모든 경로에 파일 생성 및 덮어쓰기 가능.
  • 원격 코드 실행(RCE): C++ 소스 주입을 통한 네이티브 코드 실행으로 시스템 전체 제어권 획득.

(2) 비즈니스 영향:

  • 제어 시스템 장악: PLC 런타임이 동작하는 산업 제어 시스템의 로직 변조 및 물리적 공정 제어 가능성.
  • 가용성 파괴: 악성 코드 주입을 통한 서비스 거부(DoS) 또는 시스템 크래시 유발.

🔗 관련 취약점·체이닝

  • 체이닝 경로: Path Traversal (CWE-22) $\rightarrow$ Arbitrary File Write $\rightarrow$ Source Code Injection $\rightarrow$ RCE.
  • 추정 체이닝: 인증되지 않은 사용자가 접근 가능한 경우, 다른 Authentication Bypass 취약점과 결합하여 PR:L(인증 필요) 조건을 무력화하고 외부에서 즉시 RCE로 이어지는 체인이 형성될 수 있음.

🔎 탐지

(1) 로그 지표: 웹 서버 액세스 로그 및 애플리케이션 로그 내 prog_file 파라미터 값에 /, .., 또는 절대 경로 패턴이 포함된 요청 확인.

(2) 탐지 규칙 예시:

  • Rule 1 (Path Traversal): request.params['prog_file'] matches '^\/.*' (절대 경로 시작 패턴 탐지)
  • Rule 2 (Suspicious Extension): request.params['prog_file'] contains '.cpp' AND request.path contains 'upload' (업로드 경로에 C++ 확장자 포함 여부 확인)

(3) 오탐 시나리오 및 튜닝: 정상적인 프로그램 파일명에 특수문자가 포함될 수 있으나, /etc/, /var/, 또는 OpenPLC core 디렉토리 경로가 명시적으로 나타나는 경우를 고위험군으로 분류하여 정밀 탐지.

🛡️ 완화 방안

  • 즉시(긴급 차단):
    • 웹 UI 접근 제어(ACL)를 통해 신뢰할 수 있는 관리자 IP만 접근 허용. (난이도: 하 / 영향: 낮음 / 검증: 접속 테스트)
  • 단기(완화):
    • WAF/IPS에서 prog_file 파라미터의 절대 경로 및 .cpp 확장자 업로드 요청 차단 규칙 적용. (난이도: 중 / 영향: 매우 낮음 / 검증: 페이로드 전송 테스트)
  • 근본(해결):
    • OpenPLC v3 최신 패치 버전으로 업데이트하여 prog_file 입력값에 대한 경로 검증 및 Sanitization 로직 적용. (난이도: 중 / 영향: 재시작 필요 / 검증: 취약점 스캐닝)

[파이프라인 근거] 본 분석은 다중 소스에서 일관성이 확인된 데이터를 기반으로 작성되었습니다. EPSS 수치는 현재 미확보 상태이나, CVSS 9.9의 높은 이론적 심각도와 Moderate 수준의 악용 가능성을 고려하여 이번 주 내 대응(scheduled)하도록 우선순위가 결정되었습니다.

⚖️ 위험도 / 우선순위

  • 조치: scheduled (이번 주 내)
  • 근거: CVSS=9.9 · non-KEV · EPSS=미확보 · exploit=moderate · in_scope=None
※ 본 분석은 Kestrel AI 심층 분석 결과입니다. 참고용이며, 실제 대응 전에는 전문가 검토가 필요합니다.

댓글(0)

댓글 작성 은 로그인 후 이용할 수 있어요.

다른 사용자의 댓글은 자유롭게 읽을 수 있어요.

로그인하기

불러오는 중…