SITUATION Security research & response knowledge base UTC+09 · SEOUL
INTELLIGENCE REPORT TLP:CLEAR

Langflow CVE-2026-33017: Public Flow Endpoint RCE 분석

AI 워크플로 플랫폼의 인증 없는 코드 실행과 비밀 값 노출 위험

#cve-2026-33017#langflow#ai-security#rce#poc

TL;DR

  • 영향 범위: Langflow <= 1.8.2, 수정 버전 >= 1.9.0
  • 전제조건: 외부에서 접근 가능한 public flow와 그 UUID. 기본 AUTO_LOGIN=true 구성에서는 공격자가 이 조건을 직접 만들 수도 있다.
  • 핵심 원인: 인증 없는 public build route가 요청 본문의 data를 신뢰해 Python component 생성 경로의 exec()까지 전달한다.
  • 사고 판단 기준: 취약 버전만으로 침해를 확정하지 않는다. endpoint 접근과 Python 자식 프로세스·비정상 egress·secret 접근이 시간상 연결되는지 확인한다.

취약 코드 경로

POST /api/v1/build_public_tmp/{flow_id}/flow는 public flow 실행을 위해 인증 없이 열려 있다. 문제는 선택적 data 필드까지 받아 저장된 flow 대신 요청자가 보낸 node 정의로 graph를 구성했다는 점이다. 이 값은 start_flow_build()와 graph/component 생성 단계를 거쳐 sandbox 없이 exec()되는 Python 코드에 도달한다.

따라서 단순한 “인증 누락”보다 신뢰 경계가 없는 동적 코드 평가가 본질이다. route에 인증만 붙이는 임시 수정은 public flow라는 기능 요구와 충돌하며, 비인증 경로에서 외부 data를 제거하고 DB에 저장된 flow만 실행해야 한다.

anonymous POST
  └─ build_public_tmp(flow_id, data)
      └─ start_flow_build(data)
          └─ graph/component 생성
              └─ prepare_global_scope() → exec(attacker code)

노출 여부 판정

아래 네 조건을 별도로 기록한다. 하나의 “취약/안전” 값으로 합치면 우선순위와 침해 가능성을 설명하기 어렵다.

  1. 실제 배포 artifact가 <=1.8.2인가
  2. /api/v1가 인터넷 또는 비신뢰 네트워크에 노출됐는가
  3. public flow가 존재하거나 AUTO_LOGIN으로 생성 가능했는가
  4. 노출 기간에 build endpoint 요청 또는 후속 행위가 있었는가

수집과 타임라인

  • reverse proxy에서 POST /api/v1/build_public_tmp/<UUID>/flow의 시각, source IP, body size, status, latency
  • Langflow/Python 프로세스의 셸·네트워크 도구 실행
  • 환경 변수와 credential store 접근
  • 신규 flow·component와 DB 변경
  • 컨테이너의 비정상 egress

컨테이너를 재시작하기 전에 inspect 결과, image digest, mount, 환경 변수 이름 목록과 로그를 보존한다. 보고서에는 secret 값 자체를 넣지 않는다.

docker inspect --format '  ' <container>
docker logs --timestamps <container> 2>&1 | grep -E 'build_public_tmp|auto_login|Traceback'

프록시 예시(Nginx)는 endpoint 호출을 좁히는 1차 쿼리다. 정상 public-flow 실행도 포함되므로 POST body 크기 급증, 5xx, 동일 IP의 auto_login·flow 생성 요청을 묶어 판단한다.

zgrep -hE 'POST /api/v1/(build_public_tmp/.+/flow|auto_login|flows/)' /var/log/nginx/access.log*

EDR에서는 python/langflowsh, bash, curl, wget을 생성하거나 서비스 계정이 평소 접근하지 않던 cloud metadata·외부 IP로 통신한 행위를 찾는다. 이것이 endpoint 요청 직후라면 우선순위를 높인다.

안전한 검증과 패치 확인

공식 GitHub Advisory GHSA-vwmf-pq79-vjvx는 취약 코드 경로와 영향을 설명한다. 운영 endpoint에 Python code node를 전달하지 않고 버전과 route 노출을 확인한다.

python -m pip show langflow
docker ps --format ' ' | grep -i langflow

host의 pip show 결과가 컨테이너 배포 버전을 대표하지 않을 수 있다. 실행 중인 image digest를 기준으로 컨테이너 내부 package metadata와 SBOM을 확인한다. 업그레이드 후에는 clean image로 교체하고 다음을 검증한다.

  • package version이 1.9.0 이상
  • public build route가 요청자 제공 data를 실행하지 않음
  • AUTO_LOGIN과 public flow가 운영 요구에 맞게 제한됨
  • 기존 API key·DB credential·cloud token이 회전됨

오탐과 한계

route 접근만으로 RCE 성공을 의미하지 않는다. 반대로 애플리케이션 로그가 없다고 안전하지도 않다. 공격자가 정상 2xx 응답 없이 blind execution을 얻을 수 있고 컨테이너 로그가 재시작으로 소실될 수 있으므로 proxy, runtime, DNS/egress를 교차 확인한다.

대응

1.9.0 이상 수정 버전으로 올리고 public endpoint 노출을 제한한다. 환경 변수와 연결 저장소의 API Key를 회전하고, 컨테이너를 clean image로 재배포한다.

References