본문 바로가기
CVE 취약점

CVE-2026-17633 분석 — Langflow OSS 인증된 원격 코드 실행(RCE)

by WhiteGuidance 2026. 9. 22.
반응형

 


 

항목 내용
CVE ID CVE-2026-17633
CVSS 8.5 (HIGH)
CWE CWE-94 (Improper Control of Generation of Code)
영향 버전 Langflow OSS 1.0.0 ~ 1.10.3
공격 조건 인증된 사용자(권한 무관) + LANGFLOW_ALLOW_CUSTOM_COMPONENTS=true
취약 엔드포인트 POST /api/v1/custom_component

Langflow는 LLM 애플리케이션과 AI 에이전트 워크플로우를 시각적으로 구성할 수 있는 오픈소스 로우코드 플랫폼이다. 컴포넌트 동작을 Python 코드로 직접 정의할 수 있는 Custom Component 기능이 있는데, 이 기능이 이번 취약점의 공격 표면이다.

 

2026년 8월 5일 IBM이 공개한 보안 게시판에서 Langflow OSS 1.0.0~1.10.3에 영향을 주는 취약점 묶음이 공개되었고, 그중 /api/v1/custom_component 엔드포인트를 통한 인증된 RCE가 CVE-2026-17633이다.


취약점 원인 — 소스 코드 분석

1-1. 취약 엔드포인트

출처: langflow/api/v1/endpoints.py (1271번 라인 부근)

 

 

여기서 눈여겨봐야 할 부분은 "검증이 아예 없다"가 아니라 "검증 대상이 다르다"는 점이다. allow_custom_components 체크는 "이 사용자가 커스텀 컴포넌트를 만들 자격이 있는가"만 확인할 뿐, "그 코드 내용이 안전한가"는 전혀 보지 않는다. 실제 프로덕션 환경에서 흔히 켜져 있는 LANGFLOW_ALLOW_CUSTOM_COMPONENTS=true 설정에서는 사실상 이 체크마저 통과되고, 코드는 콘텐츠 검사 없이 그대로 다음 단계로 넘어간다.

 

Langflow에는 scan_code_security()라는 AST 기반 보안 스캐너가 별도로 존재하지만(2절에서 다룬다), 이 엔드포인트의 실행 경로에는 아예 연결되어 있지 않다.

1-2. 진짜 취약점은 prepare_global_scope()에 있다

custom_component()가 호출하는 build_custom_component_template()은 결국 lfx/custom/validate.pycreate_class()로 이어지고, 여기서 prepare_global_scope()가 호출된 뒤 코드가 exec()된다.

 

이 함수는 사용자가 제출한 코드를 AST로 파싱한 뒤, import문과 class/def/assign 계열 노드만 골라서 definitions에 담는다. 이게 핵심 함정이다.

  • 모듈 최상위에 os.system(...)처럼 그냥 함수를 호출하는 문장은 AST상 ast.Expr 노드다.
  • isinstance 체크 목록에 ast.Expr는 없다 → 이런 코드는 조용히 무시된다.
  • 반면 class 본문 안에 들어간 코드는 그 ClassDef 노드 자체의 일부이므로, 클래스가 정의되는 순간(exec() 실행 시점)에 그대로 함께 실행된다.


익스플로잇 체인

아래 다이어그램은 요청이 들어와서 실제 명령 실행까지 이어지는 전체 흐름을 보여준다.

 

정리하면 흐름은 다음과 같다.

인증된 사용자 (권한 무관)
        │
        ▼
POST /api/v1/custom_component  { "code": "<악성 Python 클래스>" }
        │
        ▼
build_custom_component_template()  →  create_class()
        │
        ▼
prepare_global_scope()  — ClassDef만 definitions에 수집, exec() 대상에 포함
        │
        ▼
compile_class_code()  →  exec(compiled_class, exec_globals)
        │
        ▼
클래스 본문이 정의 시점에 실행  →  RCE 성립

 

LLM 개입도, 보안 스캐너 우회도 필요 없다. HTTP 요청 한 번으로 끝난다.

 

 


참고 — 스캐너 자체는 왜 못 잡았나

Langflow에는 langflow/agentic/helpers/code_security.pyscan_code_security()라는 AST 기반 스캐너가 별도로 존재한다. 다만 이 스캐너는 Agentic Assistant 경로(LLM이 생성한 컴포넌트 코드를 검증하는 용도)에만 연결되어 있고, /api/v1/custom_component 엔드포인트에는 애초에 호출조차 되지 않는다.

 

즉 CVE-2026-17633은 "스캐너를 우회했다"기보다는 "스캐너가 붙어 있지 않은 경로를 그대로 탄 것"에 가깝다. 이 스캐너 자체의 탐지 로직에 존재하는 별도의 우회 가능성(vars() 미탐지로 인한 is_safe: True 판정, CVE-2026-17632)은 같은 코드베이스를 분석하는 과정에서 함께 발견된 연관 이슈이며, 별도의 CVE로 분류되어 있다.


패치 및 완화

  • Langflow 1.10.4 이상으로 업그레이드 — custom_component 엔드포인트에도 콘텐츠 검증 로직 적용
  • 프로덕션 환경에서 LANGFLOW_ALLOW_CUSTOM_COMPONENTS를 꼭 필요한 경우가 아니면 false로 유지
  • 커스텀 컴포넌트 기능을 사용해야 한다면, 해당 기능에 접근 가능한 사용자 계정을 최소한으로 제한
  • 컨테이너 실행 사용자의 그룹 권한(gid=0 부여 여부)을 점검하여 컨테이너 이탈·횡적 이동 경로를 축소

 

반응형