요약
업데이트하지 않은 Plex 서버가 공개된 공격 기법에 장악돼 암호화폐 채굴기와 프록시가 설치되고 있습니다.
보안 블로그 BoredHackerBlog 운영자가 취약한 Plex 서버를 허니팟(공격을 관찰하려고 일부러 열어 둔 미끼 서버)으로 띄워 확인한 내용입니다. Plex는 9월 1일 1.43.2 이하 버전에 대한 보안 공지를 냈습니다. 10월 16일 연구자가 공격 기법 plex2shell을 자세히 공개하자 바로 다음 날 실제 공격이 잡혔습니다.
왜 중요한가
- 패치가 나온 지 한 달 반이 지났지만, 업데이트하지 않은 인터넷 노출 서버가 공개된 공격 코드로 곧바로 장악되고 있습니다.
- CVE 4건은 모두 CVSS 9점 미만이었지만, 여러 개를 엮자 원격 코드 실행이 가능해졌습니다.
- 글쓴이는 Plex 서버가 대개 가정 회선에 있어 공격자의 가정용 프록시(남의 IP로 트래픽을 우회시키는 중계 서버)로 쓰일 수 있다고 경고했습니다.
핵심 내용
- 10월 17일 허니팟에 plex2shell과 같은 방식의 요청이
/player/timeline/subscribe엔드포인트로 들어왔습니다. - 외부 통신을 허용하자 공격자는 파일을 내려받아 드로퍼(악성 프로그램을 설치하는 프로그램)와 모네로 채굴기 xmrig를 실행했습니다.
- 이후 공격이 늘면서 myawesomeproxy라는 프록시 도구도 채굴기와 함께 설치됐습니다.
- 글쓴이는 공격 IP와 파일 해시 같은 침해 지표와 패킷 캡처를 공개했고, 원 연구자는 탐지 규칙을 내놓았습니다.
- 공지 대상이 1.43.2 이하이므로 Plex Media Server를 그보다 새 버전으로 올려야 합니다.
HN 반응
- 9월 1일 업데이트 안내 메일을 놓쳤다가 채굴기가 심겼다는 경험담과, 레딧에 DDoS 봇 같은 다른 감염 사례도 많다는 댓글이 이어졌습니다.
- Plex를 인터넷에 연 것이 문제라며 Tailscale 같은 VPN을 권하는 쪽과, 가족·친구가 아무 기기로나 접속하게 하는 것이 Plex의 본래 용도라는 반론이 맞섰습니다.
저도 며칠 전에 당했습니다. 9월 1일에 온 "지금 바로 업그레이드하세요" 메일을 완전히 놓치고 13개월 된 버전을 계속 돌리고 있었거든요. 홈 서버 사용률이 100%라는 알림을 받고 확인해 보니 마이너가 바로 보였습니다. 그래도 프로세스 이름을 "mylovelyminer"로 지어 줄 만큼은 친절하더군요.
저도 프로세스를 숨기지 않는 크립토 마이너에는 묘하게 정이 갑니다. 예전에 해킹당해서 채굴하고 있던 PHP 앱을 물려받은 적이 있는데, 그놈이 띄운 프로세스에 지갑 키가 인자로 그대로 박혀 있더라고요 :-)
레딧에 털렸다는 사람이 한둘이 아닙니다. DDoS 노드 같은 다른 페이로드도 보이고요.
이 사태의 불씨는 개념 증명(PoC) 익스플로잇인 Plex2Shell입니다. LLM이 CVE 여러 개를 엮어서 만들었다고 합니다: https://zmain.info/blog/plex2shell
그 체인의 1단계와 3단계는 충격적입니다. 보안이 정말 어렵고 코드베이스가 크면 더 그렇다는 건 알지만, 이건 잘못된 선택을 일부러 한 것처럼 보입니다.
1단계: 엔드포인트 하나가 토큰 헤더의 내용이 아니라 존재 여부만 확인합니다. 글을 보면 다른 엔드포인트는 전부 내용을 확인하는 것 같은데, 왜 여기만 그랬을까요?
3단계: 관리자 토큰을 노출하기 전에 URL의 도메인이 127.0.0.1인지가 아니라 URL이 http://127.0.0.1 로 시작하는지만 봅니다. 아이고.
저도 얼마 전에 맥 미니가 크립토 마이너에 당했습니다. 우연히 그 방에 앉아 있다가 팬이 쉬지 않고 도는 걸 보고서야 알아챘습니다. "icloud-services"라는 프로세스가 CPU를 100% 쓰고 있었어요. 제일 먼저 든 생각이 "악성 소프트웨어다"가 아니라 "애플 쪽 버그로 무한 루프에 빠졌나 보다"였다는 건 애플에게 좀 뼈아픈 일입니다.
재부팅한 뒤 추적해 보니
Library/Application Support안의 폴더가 나왔고, 그 안의config.json에 gulf[.]moneroocean[.]stream이 적혀 있어서 뚫렸다는 걸 확실히 알았습니다. 정리는 어렵지 않았지만(파일들과 launch daemon 삭제), 귀찮은 일이었습니다.이 기기에서는 개발 작업을 전혀 하지 않고(사실상 Plex 등을 돌리는 용도입니다) Plex의 취약점(원문 기사에 나온 것과는 다른 것)이거나 macOS 자체의 취약점이었을 겁니다. 흥미롭게도 Plex는 최신 버전이었는데, macOS는 RCE 관련 중요 보안 업데이트(Sequoia 15.8)가 빠진 상태였습니다.
아이고, 이럴 수가. OS는 최신이 아니어도 Plex만 최신이면 괜찮을 줄 알았는데요…
Plex를 대체 왜 인터넷에 열어 두신 거예요?
밖에 있을 때 폰으로 Plexamp에서 음악 들으려고요?
Plex를 Tailscale 뒤에 두고 폰을 tailnet에 연결하면 그래도 그렇게 들을 수 있지 않나요?
일반 Plex가 그 방식으로 동작하니까 아마 될 겁니다.
최근 UI 업데이트 이후로 PC 브라우저 말고는 어디서도 Plex를 못 쓰겠습니다. 너무 느려서 이제는 Jellyfin이 유일한 선택지예요. 바이브 코딩으로 바꾼 건가요?
다들 엄청 싫어하는 분위기예요. 제가 알기로는 개발자들이 여러 기기에 쉽게 배포하려고 코드베이스를 하나로 합쳤는데, 그 대가로 거의 모든 기기에서 UX가 나빠졌습니다. 아이폰 같은 기기에서도 네이티브 비디오 서비스를 쓰지 않고요.
저는 Plex UI의 괜찮은 오픈소스 대안인 Pleezy를 씁니다. 불편한 점은 절전에서 깨어난 뒤 다른 걸 하려면 뒤로 가기를 한 번 눌러야 한다는 것뿐입니다. 언젠가 디버깅해서 고쳐 볼 생각입니다.
제 쉴드에서는 못 쓸 정도는 아닌데, 확실히 나빠지긴 했습니다. "변화는 싫어" 수준이 아니라 진짜로 나빠졌어요.
시즌을 고르고 에피소드를 고르면 바로 재생되는 게 아니라 에피소드 줄거리 화면이 뜹니다.
에피소드에서 뒤로 가기를 누르면 어떤 때는 사이드 메뉴가 뜨고, 어떤 때는 정상적으로 에피소드에서 빠져나옵니다.
대체 왜 Plex를 쓰는 걸까요?
제 iOS 기기에서는 시즌을 누르고 에피소드를 누르면 항상 에피소드 상세 화면으로 갔습니다. 설정으로 바꿀 수 있는 건지는 모르겠습니다. 저는 직접 재생(direct play) 말고는 Plex 설정을 건드린 적이 없거든요.
"뒤로 가기" 문제는 저한테는 없습니다. iOS 앱에는 영상에서 나가려면 누르는 "X"가 있고, Apple TV의 "메뉴" 키도 예전처럼 잘 동작하니까요.
코드베이스 통합한다더니 이게 뭡니까! :D
공격자들이 번번이 이렇게 창의력이 없다는 게 정말 놀랍습니다. 2026년에 크립토 마이너라니요? 그걸로 벌 3센트는 정말 제대로 번 돈이겠네요.
그래도 우리는 훨씬 큰 쟁반으로 하잖아요...
https://amphetamem.es/meme?id=office-space_1999_1140&text=But+we+do+it%0Afrom+a+much+bigger+tray...&j=
끔찍하네요. 이런 걸 바깥에 열어 놓고 쓰는 사람이 누구죠?
Plex Pass 구독자 대부분, 그리고 일반 Plex 사용자 대부분이 그럴 겁니다.
제가 보기에 Plex의 주된 목적은 합법적으로 구한 디지털 미디어를 많이 가진 사람이, 세계 어디서든 아무 기기로나 편하게 접근하고 친구와 가족에게도 접근 권한을 공유할 수 있게 하는 것입니다.
제 집 미디어 기기는 전부 Kodi, Jellyfin 같은 완전히 개방된 것들을 돌립니다. 하지만 여행 중에는 Plex가 이깁니다. 영상 스트리밍이 되는 기기라면 거의 다 돌아가고, VPN을 연결하거나 남의 기기에 비밀번호를 입력할 필요 없이 몇 초 만에 로그인할 수 있으니까요.
합법적으로 구한 콘텐츠에 Plex를 쓰는 사용자는 5%도 안 될 것 같은데요.
특히 Plex는 보안이 허술하기로 악명이 높습니다. WireGuard 같은 VPN을 거치지 않고는 절대 인터넷에 열어 두면 안 됩니다. 안 그러면 불장난하는 겁니다.
맞는 말일 수는 있지만, 기술에 밝지 않은 가족이나 친구에게는 어떻게 접근 권한을 줍니까? VPN이 뭔지도 모르는데 Jellyfin 인스턴스에 접속하려고 VPN을 켜고 끄는 법을 알 리가 없습니다.
게다가 Android TV나 Fire Stick에서 접속하려고 하면 VPN을 설정할 수 없고(통신사 모뎀을 쓰니 서브넷으로 투명하게 라우팅해 주는 WireGuard 클라이언트를 라우터에 둘 수도 없고) 어떻게 해야 합니까?
장기적으로는 Jellyfin 데몬이 미디어에 읽기 전용으로만 접근하게 가두고, jellyfin.example.com 같은 서브도메인 뒤에 두고, LE(Let's Encrypt)의 dns-01 챌린지로 그 도메인용 와일드카드 인증서(*.example.com)만 발급받는 쪽이 더 쉬울 것 같습니다.
그런 다음 nginx가 80/443 포트를 받게 하되, (올바른) jellyfin 호스트 이름으로 오지 않은 요청에는 default server 지시자로 444를 반환하게 합니다. 인터넷의 봇들이 웹 서버의 IP로 80/443 포트를 직접 두드려 대니까요.
기술에 밝지 않은 사용자도 쉽게 쓰게 하면서(방금 설명한 건 일반 클라이언트에게는 전혀 보이지 않습니다) 데몬의 공격 표면은 줄일 수 있는, 제가 생각해 낼 수 있는 유일한 방법입니다.
참고로 위 구성에서는 제 jellyfin 서버로 들어온 무단 요청이 0건이었습니다. 봇들이 오래된 취약점(대개 워드프레스) 익스플로잇을 들고 제 IP의 80/443 포트를 직접 두드려 대긴 했지만, 전부 444를 받았습니다(nginx가 요청에 응답조차 하지 않고 TCP 연결을 바로 끊습니다).
Tailscale은 설명하기 쉽습니다.
"Apple TV나 Android TV에 이 앱을 설치하고, Gmail로 로그인한 다음, 이메일 주소를 알려 줘."
네, 회사에 다녀 본 적이 있어서 사내 인트라넷에 접속하려고 업무용 컴퓨터에서 VPN에 로그인해 본 경험이 있는 사람이라면 누구에게든 Tailscale을 잘 설명했습니다.
아니면 그런 사람 얘기를 들어본 사람이라도요.
이제 셀프 호스팅 서비스는 거의 다 그런 부류입니다. Plex, Jellyfin부터 nextcloud, gitea/forgejo까지 전부요. 몇 달 전에 제 환경을 전부 점검하고 모든 걸 VPN 뒤로 옮겼습니다. 공개로 남겨 둔 서비스는 예전에 친구에게 공유하려고 음식 레시피 HTML을 올려 둔 nginx 정적 디렉터리 하나뿐입니다.
쓰기는 덜 편하고 다른 사람과 공유하기는 거의 불가능합니다. 제 기기들은 대부분 VPN을 알아서 설정할 수 있지만(Boox 전자책 리더는 예외입니다), "가족과 친구"에게 VPN을 설치하고 유지하게 해서 제가 공유하는 서비스에 접속하게 하는 건 꿈같은 이야기입니다.
Gitea도 한 달쯤 전에 비슷한 문제를 겪었습니다.
아무 기기에서나 된다는 핵심을 놓치신 건 아닌가요? 제가 Plex를 쓰는 이유가 바로 그겁니다. 기기에 VPN 클라이언트를 설치하고 설정해야 한다면 그냥 Jellyfin을 쓰죠. 그러면 어차피 제 기기로만 쓰게 되니까요.
가족과 친구 문제도 있고요. 제가 아는 기술 문외한 중의 문외한도 Plex는 쓸 줄 알고, 거의 아무 도움 없이 제 컬렉션에 접속합니다.
공정하게 말하면 이게 Plex가 의도한 사용 방식입니다. Plex를 인터넷에 노출하는 건 이상하거나 지원되지 않는 구성이 아닙니다. 초대받은 여러 사용자가 로그인해서 미디어에 접근할 수 있도록 네트워크에 열어 두게끔 설계된 것입니다. 모두가 tailnet 같은 데 들어와야 한다면 이 모델은 성립하지 않습니다. Plex가 웹 페이지를 서빙하는 nginx보다 덜 안전할 수는 있겠지만, 결국 어느 정도까지 신뢰하느냐의 문제입니다.
저 혼자 쓴다면 다르겠지만, 친구와 가족 모두가 tailnet에 들어오기를 현실적으로 기대할 수는 없으니, 저는 최신 상태의 Plex를 인터넷에 열어 두는 위험을 감수합니다.
많은 사람이 그렇게 합니다. TV도 접속해야 하고, 친구들도 접속해야 하는데, 그들에게 Tailscale을 설명하고 싶지는 않으니까요.