Devlery
Blog/Open Source

웹사이트 한 번 열면 노트북에서 코드 실행, Ray 취약점에 걸린 3일 시한

CISA가 Ray의 원격 코드 실행 취약점 CVE-2025-62593(CVSS 9.4)을 8월 17일 KEV에 올리고 시한을 사흘 뒤로 걸었습니다. 표적은 서버가 아니라 개발자 노트북입니다.

웹사이트 한 번 열면 노트북에서 코드 실행, Ray 취약점에 걸린 3일 시한
AI 요약
  • CISA가 Ray 원격 코드 실행 취약점에 8월 20일 시한을 걸었습니다.
  • Ray를 켠 채 Firefox·Safari로 악성 페이지를 열면 셸이 실행됩니다.
  • 2.52.0에서 고쳤지만 DELETE 우회가 남아 2.54.0 이상이 안전합니다.

미국 사이버보안·인프라보안국(CISA)이 2026년 8월 17일 Ray의 원격 코드 실행 취약점 CVE-2025-62593(CVSS 9.4)을 「알려진 악용 취약점 목록(KEV)」에 올렸습니다. 조치 시한은 2026년 8월 20일, 사흘입니다. 예전 기준으로는 2주에서 3주가 나왔을 자리입니다.

Ray는 파이썬으로 여러 대의 기계에 일을 나눠 돌리는 프레임워크입니다. LLM 학습, 모델 서빙, 대용량 데이터 처리에 쓰이고 ray.init() 한 줄이면 노트북에서도 켜집니다. 그리고 이번 취약점이 노리는 곳이 바로 그 노트북입니다.

서버가 아니라 개발자 머신을 노린다

KEV 목록에 오르는 것은 보통 인터넷 경계에 놓인 장비입니다. VPN 게이트웨이, 방화벽, 웹 서버 같은 것들입니다. 이번에 오른 CVE-2025-62593은 다릅니다. CISA 항목 설명 자체가 "Ray를 개발 도구로 쓰는 개발자가 노출될 수 있다"고 적었고, 뒤에 "Firefox와 Safari를 통해 악용 가능"이라고 덧붙였습니다.

공격 시나리오는 이렇습니다. 개발자가 노트북에서 Ray를 켜 둡니다. 대시보드는 localhost에만 열려 있고 방화벽 바깥으로는 나가지 않습니다. 그 상태에서 Firefox나 Safari로 악성 웹페이지를 열거나, 광고 슬롯에 실린 악성 스크립트를 받습니다. 그러면 그 개발자 머신에서 임의 셸 명령이 실행됩니다. 클릭도 필요 없습니다.

GitHub 자문 데이터베이스에 등록된 CVE-2025-62593 화면. Critical 9.4, 영향 버전 2.52.0 미만, 수정 버전 2.52.0으로 표기되어 있다

요청을 보내는 것이 공격자가 아니라 개발자 자신의 브라우저이기 때문에 방화벽이 소용없습니다. 지금까지 Ray 보안 사고는 인터넷에 그대로 노출된 클러스터 이야기였는데, 이번에는 격리된 개발 환경이 표적입니다.

두 개의 우회를 겹쳤다

공격은 두 단계로 이루어집니다. 둘 다 그 자체로는 오래된 기법이고, 겹쳤을 때 처음 위험해집니다.

1. User-Agent 가드 우회

Ray는 User-AgentMozilla로 시작하는지만 검사

2. DNS 리바인딩

공격자 도메인을 127.0.0.1로 되돌려 동일 출처 정책 우회

/api/jobs에 잡 제출

인증 없음. 잡 제출이 곧 셸 실행

1단계. 취약 버전의 Ray는 브라우저에서 온 요청을 막으려고 User-Agent 헤더가 Mozilla로 시작하는지만 봤습니다. 그런데 fetch 명세상 Firefox와 Safari는 스크립트가 이 헤더를 바꾸는 것을 허용합니다. 값을 다른 문자열로 바꾸면 검사가 그대로 통과합니다. Chrome은 구현 차이로 이 헤더 변경을 허용하지 않아 영향받지 않습니다.

2단계. DNS 리바인딩은 공격자 도메인의 DNS 응답을 처음에는 공격자 서버로, 잠시 뒤에는 127.0.0.1로 되돌리는 기법입니다. 브라우저 입장에서는 같은 도메인이니 동일 출처 정책에 걸리지 않고, 실제로는 로컬 Ray 인스턴스에 요청이 갑니다.

두 우회를 겹치면 /api/jobs/api/job_agent/jobs/에 인증 없이 작업을 제출할 수 있습니다. Ray에서 작업 제출은 곧 임의 코드 실행입니다. 이 두 엔드포인트에 인증을 두지 않은 것은 Ray의 오래된 설계 결정입니다.

발견자는 Socket의 Jonathan Leitschuh(DNS 리바인딩 기법과 개념 증명 코드)와 Oligo의 Avi Lumelsky(fetch 우회)입니다. 공식 자문은 원인을 이렇게 적었습니다. "핵심 엔드포인트에 어떤 형태의 인증도 넣지 않겠다는 Ray 개발팀의 오랜 결정 때문에, 이번에는 개발 환경에서 브라우저를 통해 다시 한번 심각한 취약점으로 이어졌습니다."

패치는 한 번으로 끝나지 않았다

2.52.0의 수정은 차단 목록 방식이었습니다. 브라우저에서 온 POST와 PUT를 막는 것. 그런데 DELETE는 목록에 없었습니다.

그래서 CVE-2026-27482가 나왔습니다. 2.53.0 이하에서 브라우저 출처 DELETE 요청이 그대로 통과하고, 주요 DELETE 엔드포인트는 기본적으로 인증이 없습니다. 같은 DNS 리바인딩으로 Serve 서비스를 종료하거나 실행 중인 잡을 삭제할 수 있습니다. CVSS는 3.1로 낮지만, 첫 패치가 막은 것이 공격 기법이 아니라 당시 알려진 HTTP 메서드 세 개뿐이었다는 사실을 드러냅니다.

2.54.0(2026년 2월 18일)에서 방향을 허용 목록 방식으로 바꿨습니다. 무엇을 막을지 열거하는 대신, 에이전트 HTTP 서버에 오는 브라우저 출처 변경 요청을 일단 전부 막고 통과시킬 것만 따로 지정합니다.

2023년 11월

CVE-2023-48022(ShadowRay) 공개. 잡 제출 API에 인증 없음. Anyscale은 설계상 의도라며 패치를 거부했고 지금도 공식 패치가 없습니다

2025년 11월

Ray 2.52.0 릴리스(11월 21일)로 CVE-2025-62593 수정, 토큰 인증 도입. 자문 공개는 11월 27일

2026년 2월

Ray 2.54.0에서 CVE-2026-27482(DELETE 우회) 수정. 차단 목록에서 허용 목록으로 전환

2026년 8월 17일

CISA가 CVE-2025-62593을 KEV에 등재. 조치 시한 8월 20일

사흘이라는 시한은 어디서 나왔나

시한을 계산하는 규칙이 두 달 전에 바뀌었습니다. CISA는 2026년 6월 10일 「위험 기반 보안 업데이트 우선순위(BOD 26-04)」를 발효하면서 2021년 11월부터 쓰던 BOD 22-01을 폐지했습니다.

바뀐 부분은 시한 계산 방식입니다.

항목BOD 22-01 (2021년 11월)BOD 26-04 (2026년 6월)
시한 결정KEV에 오르면 모두 같은 시한자산별·취약점별로 차등
평가 기준KEV 등재 여부 하나

인터넷 노출, KEV 등재, 악용 자동화 가능성, 기술적 영향 네 가지

가장 짧은 시한통상 2주에서 3주3일 + 포렌식 트리아지 의무
가장 긴 처리시한 내 조치 또는 사용 중단유예 가능

KEV 항목의 조치 지시문이 BOD 26-04와 "포렌식 트리아지 요구사항"을 직접 참조합니다. 이번 사흘은 예외적 긴급 조치가 아니라 새 등급표의 최고 등급이 적용된 결과입니다. 기관 이행 기한은 2026년 12월 7일이고, 구속력은 미국 연방 민간기관에만 있습니다.

CISA가 이 조합을 최고 등급으로 판정한 근거는 악용 이력에 있습니다. BitSight는 2026년 3월 보고에서 RondoDox DDoS 봇넷 운영자가 개념 증명 코드가 공개되기 이틀 전부터 이 취약점을 무기로 편입했다고 밝혔습니다. Oligo가 2025년 11월 공개한 ShadowRay 2.0 캠페인은 NVIDIA GPU가 달린 미패치 Ray 인스턴스를 암호화폐 채굴 봇넷으로 바꿨고, 인터넷에 노출된 Ray 서버가 20만 대를 넘었다고 보고했습니다. 2024년 최초 조사 당시 수천 대에서 약 10배 늘어난 수치입니다.

지금 확인할 것

Ray는 Apache 2.0 오픈소스 pip 패키지라 요금제도 지역 제한도 없습니다. 한국에서도 그대로 쓸 수 있고, 조치도 그대로 할 수 있습니다. 필요한 것은 버전 확인과 설정 하나입니다.

항목내용
대상Ray를 쓰는 모든 개발자와 팀. 로컬 개발 환경, CI 러너, 컨테이너 이미지, 쿠버네티스(KubeRay), 클라우드 클러스터 전부
요금무료. Apache 2.0 오픈소스
한국 사용가능. 지역 제한 없음. 단 CISA 시한 자체는 미국 연방 민간기관에만 구속력이 있습니다
필요 버전2.52.0 이상. DELETE 우회까지 막으려면 2.54.0 이상. 최신은 2.57.0(2026년 8월 11일)

버전은 이렇게 확인합니다.

pip show ray | grep -i version
ray --version

토큰 인증은 2.52.0에 들어갔지만 기본은 꺼져 있습니다. 릴리스 노트가 "기본 꺼짐"이라고 명시했고, Ray 공식 보안 문서도 토큰 인증을 "네트워크 수준 보안에 더하는 심층 방어 수단이지, 격리된 네트워크에 Ray를 배포하는 것의 대안이 아니다"라고 못 박았습니다. 켜려면 직접 설정해야 합니다.

export RAY_AUTH_MODE=token
ray get-auth-token --generate

토큰은 RAY_AUTH_TOKEN 환경변수, RAY_AUTH_TOKEN_PATH 환경변수, 기본 경로 ~/.ray/auth_token 순으로 찾습니다. ray.init()은 토큰이 없으면 자동으로 만들지만 ray start --head는 먼저 수동 생성해야 합니다. 만료가 없으므로 지우고 다시 만들기 전까지 계속 유효합니다.

노트북이나 개발 서버에 Ray가 깔려 있다면 오늘 pip show ray로 버전을 찍어 보고 2.54.0 미만이면 올리는 것, 그거 하나면 됩니다. 코딩 에이전트가 실행하는 명령의 승인 누락률을 다룰 때와 같은 문제가 여기서도 반복됩니다. 개발 머신은 인터넷에 노출되지 않았으니 안전하다는 가정이 깔려 있는데, 이번 취약점은 브라우저를 시켜 그 가정을 우회합니다. 컨테이너 이미지와 CI 러너에 고정해 둔 Ray 버전까지 같이 훑어야 실제로 끝납니다.