클라우드에 좀비가 산다

크립토마이닝 헤커가 내 서버를 삼켰다

by 파쎄오

​이제 더 이상 거대한 서버를 사러 용산에 갈 필요도, 수만 줄의 코드를 밤새워 직접 짤 필요도 없습니다. 클라우드(Cloud, 인터넷을 통해 가상의 컴퓨터를 대여해 주는 서비스)와 인공지능(AI)이 있으니까요. 마음만 먹으면 혼자서 뉴스 포털 하나쯤은 뚝딱 만들 수 있는 시대, 저 역시 그 장밋빛 꿈에 부풀어 오라클 클라우드(Oracle Cloud)에 저만의 소박한 코딩 작업실을 막 지어 올린 직장인이었습니다. 하지만 그 꿈이 지옥으로 변하는 데는 단 하루면 충분했습니다.


요즘 '시티즌 디벨로퍼(Citizen Developer, 전문적인 IT 개발자는 아니지만 코딩을 배워 자신의 업무 자동화나 앱을 직접 구축하는 사람)'라는 말이 유행입니다. 저 역시 코딩의 즐거움에 푹 빠져, 오라클 클라우드(Oracle Cloud, 인터넷을 통해 가상의 컴퓨터를 대여해 주는 서비스)에 저만의 소박한 코딩 작업실을 막 지어올린 직장인입니다. 불과 어제 오후, 그 무서운 사건이 터지기 전까지만 해도 마냥 즐겁기만 했죠.


솔직히 고백하자면, 저는 리눅스(Linux, 개발자들이 주로 사용하는 무료 운영체제)를 아예 모르는 '쌩초보'는 아닙니다. 과거 아마존의 클라우드 서비스인 AWS 환경에서 우분투(Ubuntu, 가장 대중적인 리눅스 종류 중 하나) 컴퓨터를 띄워 이것저것 만져본 경험은 있죠. 하지만 세월이 흘러 명령어에 대한 기억은 가물가물했고, 무엇보다 '오라클 클라우드'라는 낯선 환경은 이번이 완전히 처음이었습니다.


이 글은 완벽한 IT 전문가의 영웅담이 아닙니다. 전체적인 구조는 볼 줄 모른 채 AI가 떠먹여 주는 지식만 믿고 문도 달지 않은 집을 지은 초보 목수가, 바로 어젯밤부터 오늘 아침까지 밤을 꼬박 새우며 겪은 참담한 해킹 참사와 뼈아픈 깨달음의 실시간 기록입니다.


"불가능한 것을 모두 제외하고 남은 것은, 아무리 믿기 힘들지라도 진실일 수밖에 없다."

— 셜록 홈즈 (아서 코난 도일)


처음부터 제 서버에 무슨 일이 벌어지고 있는지 알았던 것은 아닙니다. 모든 것은 아주 작은 호기심과 답답함, 그리고 기분 나쁜 위화감에서 시작되었습니다.


1. 첫 번째 껍질: 열리지 않는 문, 그리고 치명적인 실수

모든 붕괴는 아주 작은 균열에서 시작됩니다. 어제 오전, 저는 클라우드에 저만의 개발 환경을 세팅하고 있었습니다. 제 목표는 'VS Code'를 웹에서 여는 것이었죠. (VS Code는 보통 컴퓨터에 깔아서 쓰는 코딩용 메모장 같은 건데, 이걸 클라우드에 설치하면 크롬 같은 인터넷 브라우저만 켜도 세상 어디서든 코딩을 할 수 있거든요.)


설치를 마치고 두근거리는 마음으로 인터넷 창을 띄웠는데, 제 코딩 화면(웹앱)이 죽어도 안 열리는 겁니다. 웹앱이란 인터넷 브라우저에서 실행되는 프로그램을 말하는데, 이 화면이 제 모니터에 뜨려면 클라우드 컴퓨터의 특정 '문(포트)'을 통과해서 데이터가 밖으로 나와야 합니다. 하지만 저는 그 원리조차 제대로 몰랐죠.


답답한 마음에 제미나이(Gemini)에게 증상을 물어보았습니다.


> 나: "클라우드에 웹앱을 설치했는데 인터넷 브라우저에서 접속이 안 돼. 왜 이러지?"


> Gemini: "클라우드의 방화벽 포트(Port, 네트워크 상에서 데이터가 드나드는 가상의 문)가 막혀 있어서 그럴 수 있습니다. 사용하시는 프로그램이 8080번 포트를 쓴다면, 오라클 클라우드의 보안 설정에 가서 8080번 포트를 추가해 보세요."


원인을 알았으니 고민할 게 없었죠. 저는 빨리 화면을 띄워보고 싶은 마음에 제미나이가 알려준 대로 보안 설정에 들어갔습니다. 그리고 "테스트만 할 건데 귀찮게 이것저것 설정하지 말자"는 안일한 생각으로, 8080번 포트를 전 세계 모든 IP 주소(0.0.0.0/0, 누구나 제한이나 비밀번호 없이 문 앞까지 접근할 수 있다는 의미)에 활짝 열어버렸습니다. 화면이 짠 하고 나타났고, 저는 제 자신이 자랑스러웠습니다.

그리고 바로 어제 오후였습니다. 모바일로 서버에 접속해 두었던 터미널 앱 터먹스(Termux, 안드로이드 스마트폰에서 리눅스 환경을 쓸 수 있게 해주는 앱)가 갑자기 심하게 버벅거리기 시작했습니다. 밀리초 단위로 아주 빠르게 반응해야 할 셸(Shell, 사용자가 입력한 명령어를 컴퓨터가 이해할 수 있도록 텍스트로 전달해 주는 창) 환경이 늪에 빠진 것처럼 느려진 겁니다.


'예전 AWS에서 우분투 쓸 땐 이런 렉이 없었는데?' 뭔가 이상해서 가물가물한 기억을 더듬어 인터넷 상태를 확인하는 기본적인 명령어인 curl(인터넷에서 데이터나 파일을 다운로드할 때 쓰는 도구)을 무작정 입력해 보았습니다. 그런데 화면에 제 등골을 서늘하게 만드는 차가운 한 마디가 출력되었습니다.


Killed (강제 종료됨)


명령어가 실행되자마자 누군가에게 목을 벤 듯 튕겨 나간 것입니다. 일시적인 오류인가 싶어 다시 쳐보았지만 결과는 똑같았습니다. Killed. 마치 누군가 제 방 안에 숨어 있다가, 제가 손전등을 켜려고 할 때마다 스위치를 내리쳐 부숴버리는 듯한 섬뜩한 느낌이 들었습니다.


2. 두 번째 껍질: 내 손과 AI의 머리, 셜록 홈즈식 공조의 시작


도무지 영문을 알 수 없었던 저는 다시 황급히 제미나이를 긴급 호출했습니다. 시스템 깊숙한 곳에서 벌어지는 이 기괴한 현상을 당장 해석할 능력은 제게 없었기 때문입니다. 저는 에러 상황을 AI에게 던져주며 타이핑을 대신해 주는 '중간 전달자' 역할을 자처했습니다.


> 나 (기억이 가물가물한 시티즌 디벨로퍼):

> "방금 그 서버인데 엄청 버벅거려. 지금 curl 같은 명령어를 치면 실행되자마자 'Killed'라는 메시지가 뜨면서 꺼지는데 이게 대체 뭐야? 혹시 OOM(Out of Memory, 컴퓨터의 메모리 용량이 꽉 차서 시스템이 프로그램을 강제로 끄는 현상) 오류가 난 걸까?"


> Gemini (나의 셜록 홈즈):

> "OOM일 수도 있지만, 특정 네트워크 진단 명령어(curl이나 wget 등)를 실행할 때만 즉각적으로 'Killed'가 뜬다면 해커의 침입을 강력히 의심해 봐야 합니다.

> 해커들은 서버를 장악한 뒤, 관리자가 상태를 점검하거나 백신을 다운로드하지 못하도록 방해하는 '감시자(Watcher)' 스크립트(자동화된 명령어 모음)를 몰래 숨겨둡니다. 이 스크립트가 방어용 도구의 실행을 감지하고 즉시 강제 종료(kill) 시켜버리는 것입니다.

> 먼저 시스템 자원을 누가 먹고 있는지 확인해야 합니다. 터미널 창에 top(현재 실행 중인 프로그램들이 컴퓨터 자원을 얼마나 쓰고 있는지 보여주는 모니터링 명령어)이라고 치고 그 결과를 저에게 복사해 주세요."


해커라니? 방금 연 제 작고 소박한 테스트 서버에요? 믿기 힘들었지만, 저는 제미나이가 하라는 대로 얌전히 top 명령어를 치고 그 결과를 그대로 복사해 넘겼습니다.


3. 세 번째 껍질: 189%의 미스터리와 조종당하는 아바타


화면에 출력된 시스템 상태창을 본 저는 제 눈을 의심했습니다. 특정 알 수 없는 프로그램 하나가 CPU(Central Processing Unit, 컴퓨터의 두뇌 역할을 하는 중앙처리장치)를 무섭게 잡아먹고 있었는데, 그 수치가 무려 **189%**를 가리키고 있었습니다.


> 나:

> "제미나이, 화면을 복사해 왔어. 그런데 숫자가 이상해. CPU 사용률이 100%를 넘어서 189%로 나와. 나름 예전에 리눅스 좀 만져봤지만 100%가 넘는 건 처음 보는데, 오류 난 거 아니야?"


> Gemini:

> "고장 난 것이 아닙니다. 그 숫자가 결정적인 증거입니다. 리눅스는 다중 코어(두뇌가 여러 개 있는 환경)에서 각 코어의 사용량을 합산해서 보여줍니다. 즉, 189%라는 뜻은 해커가 2개에 가까운 CPU 코어를 한계치까지 혹사시키며 풀가동하고 있다는 명백한 증거입니다.

> 높은 확률로 **크립토마이너(Cryptominer, 남의 컴퓨터 자원을 몰래 훔쳐서 암호화폐를 캐는 악성코드)**가 돌아가고 있습니다. 지금 당장 이 프로그램을 죽여야 합니다. 화면에 다음 명령어를 복사해서 붙여넣으세요: kill -9 (프로세스를 무조건 강제로 종료하라는 강력한 명령어)"


소름이 돋았습니다. 제가 웹앱 화면을 보겠다고 불과 몇 시간 전에 0.0.0.0/0으로 활짝 열어둔 포트 8080은 봇넷(Botnet, 해커에게 감염되어 조종당하는 좀비 컴퓨터 군단)에게 보내는 VIP 초대장이었습니다. 그들은 제 컴퓨터의 열린 문으로 눈 깜짝할 새 침투해 서버 자원을 뱀파이어처럼 빨아먹는 채굴기를 설치한 것입니다. 그리고 제가 눈치채지 못하도록 진단 도구의 목을 베는 '감시자'까지 세워둔 완벽한 범죄 현장이었죠. 저는 떨리는 손으로 제미나이가 건네준 kill -9 명령어를 그대로 복사해 터미널에 쏘아 댔습니다.


4. 네 번째 껍질: 보이지 않는 적과 끈질긴 좀비

명령어를 쳐서 바이러스를 죽였으니 다 끝난 줄 알았는데, 몇 분 뒤 CPU가 다시 189%로 치솟았습니다. 놈들은 마치 좀비처럼 계속해서 부활하고 있었습니다. 밖은 이미 어두워진 어젯밤이었습니다.


> 나:

> "프로세스를 죽였는데 5분 뒤에 다시 살아나! 그리고 내 하드디스크를 ls -al(숨김 파일을 포함해 모든 파일을 보여주는 명령어)로 아무리 뒤져봐도 이상한 실행 파일이 안 보이는데, 얘네는 대체 어디 숨어 있는 거야?"


> Gemini:

> "해커들은 흔적을 남기지 않기 위해 하드디스크가 아닌 **RAM Disk(램 디스크, 전원이 꺼지면 데이터가 모두 날아가는 빠른 임시 메모리 공간)**인 /dev/shm에 파일을 숨깁니다.

> 그리고 5분마다 살아나는 이유는, 그들이 **크론탭(crontab, 특정 시간마다 명령어를 자동으로 실행하게 해주는 리눅스의 예약 스케줄러)**에 부활 명령을 걸어두었기 때문입니다. 컴퓨터가 꺼지거나 바이러스가 죽어도 끈질기게 악성코드를 다시 다운로드하도록 세팅한 겁니다. 다음 명령어를 치고, 이상한 줄이 있다면 지우세요: crontab -e"


정말 놀라움의 연속이었습니다. 제미나이가 알려준 임시 메모리 경로(/dev/shm)로 들어가 보니, 파일명 앞에 마침표를 찍어 교묘하게 숨겨놓은 기괴한 파일들이 무더기로 쏟아져 나왔습니다. 저는 제미나이가 불러주는 복잡한 리눅스 명령어들을 마치 아바타처럼 받아 적으며, 예약된 좀비 부활 스크립트까지 모조리 찾아내 삭제했습니다. 치열한 참호전 끝에, 마침내 189%로 타오르던 CPU가 0%로 떨어지며 서버가 다시 평화를 되찾았습니다.


5. 양파의 중심: 진정한 공포는 뒤늦게 찾아온다

승리의 안도감에 한숨을 돌리며 새벽 공기를 마시던 순간이었습니다. 전 세계의 수많은 서버 중, 해커의 자동화 봇이 굳이 '내 서버'에 들어와 디스크를 샅샅이 뒤졌습니다. 그렇다면 그들이 그저 CPU만 빌려 쓰고 얌전히 나갔을까요?


'내 작업실에 무엇이 있었지?'


저는 환경 변수(Environment Variables, 프로그램이 돌아갈 때 참고하는 설정 값들이 모인 곳) 폴더를 열어보았습니다. 아뿔싸. 그곳에는 어제 낮에 자동화 봇을 만들어 보려고 발급받아 두었던 클로드(Claude) API 키와 구글(Google) API 키가 암호화도 되지 않은 평문 그대로 덩그러니 방치되어 있었습니다. API 키란, 다른 소프트웨어나 AI의 기능을 빌려 쓸 때 사용하는 일종의 '비밀번호'이자 통행증입니다.


과거의 해킹이 단순히 서버를 망가뜨리는 것이었다면, 생성형 AI 시대의 API 키 탈취는 차원이 다릅니다. 이는 해커들이 제 지갑(신용카드)으로 무제한의 AI 컴퓨터 자원을 끌어다 쓸 수 있는 '무기명 백지수표'를 쥐여준 것과 같습니다. 실제로 최근 단일 AI API 키가 탈취된 지 단 이틀 만에 피해자에게 약 1억 1천만 원($82,314)이 청구된 끔찍한 사례도 있었습니다. 구글 클라우드에서 발급된 키가 유출되면, 해커는 제 이름으로 무단 API 호출을 날려 막대한 요금을 부과하는 '할당량 도난'을 자행합니다.


저는 뼈저린 좌절감을 삼키며 빛의 속도로 브라우저를 열었습니다. 당장 인공지능 개발자 콘솔(관리자 페이지)로 달려가 떨리는 손으로 'Delete API Key(키 삭제)'를 누르고, 구글 클라우드에서도 즉각 손상된 키를 삭제했습니다. 1억 원의 빚을 질 뻔한 골든타임을 오늘 새벽, 아슬아슬하게 지켜낸 순간이었지만, 제가 공들여 지은 클라우드 작업실은 이미 돌이킬 수 없이 오염된 후였습니다.


6. 결론: 숲을 보지 못하는 'AI 전문가'의 위험성과 진정한 시사점


날이 밝은 오늘 아침, 결국 저는 손상된 오라클 클라우드의 가상 컴퓨터를 통째로 날려버리는 '완전 삭제(Terminate)'를 단행했습니다. 겉보기의 바이러스를 지웠다 해도 완전히 신뢰할 수 없기 때문입니다. 하지만 하룻밤 사이의 이 끔찍했던 사건을 통해 제가 뼈저리게 느낀 진짜 시사점은 따로 있습니다.


이번 해킹을 추적하고 해결한 것은 제가 아니라 제미나이(Gemini)였습니다. 저는 그저 복사해서 붙여넣기만 한 아바타였죠. 하지만 역설적이게도, 저를 이 참사로 몰아넣은 것 역시 AI였습니다.


제가 처음 "웹앱이 안 열려"라고 물었을 때, AI는 "8080 포트를 여세요"라고 아주 정확하고 친절하게 알려주었습니다. 하지만 AI는 제가 그 포트를 전 세계(0.0.0.0/0)에 무방비로 열어젖힐 때, 그게 전체 시스템 보안에 얼마나 치명적인 결과를 초래할지는 묻지 않으면 경고하지 않았습니다. 저는 특정 기능을 작동하게 만드는 '방법(How)'만 AI에게 얻어먹었을 뿐, 전체 구조를 조망하는 시스템 아키텍처와 보안이라는 '숲'을 볼 줄 모르는 맹인이었기 때문입니다.


이것은 비단 저 혼자만의 촌극이 아닙니다. 지금 전 세계의 IT 업계가 직면한 거대한 문제이기도 합니다.

최근 발표된 글로벌 보안 기업 베라코드(Veracode)의 2025년/2026년 생성형 AI 코드 보안 보고서에 따르면, 매우 충격적인 사실이 드러납니다. AI 모델들이 기능적으로 완벽한 코드를 짜내는 데는 능숙해졌지만, 생성된 코드의 무려 45%가 심각한 보안 취약점(OWASP Top 10 등)을 포함하고 있다는 것입니다.


문제는 개발자들이 AI가 짜준 코드를 보안 검토 없이 그대로 복사해서 실무에 적용하는 이른바 '바이브 코딩(Vibe coding)'에 빠져 있다는 점입니다. 개발자가 보안 조건을 명확히 통제하지 않으면, AI는 가장 편하고 위험한 지름길을 택합니다. 이 때문에 수많은 기업들이 최근 AI가 생성한 코드로 인해 발생한 해킹과 데이터 유출을 막기 위해 코드를 전면 재검토하며 골머리를 앓고 있습니다.


이제 기술은 인간이 에러를 복사해 나를 필요조차 없이, 개발 환경을 직접 들여다보고 코드를 수정하는 '클로드 코드(Claude Code)' 같은 진화된 AI 에이전트의 시대로 접어들었습니다. 개발의 진입 장벽은 끝없이 낮아지고, 누구나 시티즌 디벨로퍼가 될 수 있습니다.


하지만 전체 시스템의 보안과 아키텍처를 이해하지 못하는 사람이 AI의 손에 맹목적으로 운전대를 맡기면 어떻게 되는지, 어젯밤의 제 서버가 훌륭한 본보기가 되었습니다. 보이지 않는 가상의 건물일지라도, 튼튼한 방화벽이라는 내력벽과 안전한 권한 통제라는 기초 공사 없이는 한순간에 무너집니다.

AI는 우리를 엄청나게 빠른 전문가로 만들어 줍니다. 하지만 진짜 안전한 시스템을 짓는 것은, 그 AI가 제안한 도면의 취약점을 간파하고 올바른 판단을 내리는 인간 '오케스트레이터(Orchestrator)'의 몫입니다. 구름 위에 집을 짓는 수많은 시티즌 디벨로퍼 여러분, AI가 찾아주는 편리함 이면에 숨겨진 보안이라는 무거운 책임감을 결코 잊지 마시기 바랍니다.

작가의 이전글[테크 인사이트] 20W의 기적