안녕하세요! IT·테크 분야의 유익한 소식을 쉽고 자세하게 전해드리는 테크 블로거입니다.

최근 생성형 AI 기술이 급격히 발전하면서 개발 생산성은 이전과 비교할 수 없을 정도로 올라갔습니다. 하지만 기술의 발전은 늘 양날의 검과 같아서, 우리가 편리함을 누리는 만큼 사이버 위협의 수준 역시 상상 이상으로 진화하고 있습니다.

특히 최근 보고되는 보안 사고들을 분석해 보면, 단순히 과거의 해킹 패턴을 반복하는 것이 아니라 오픈소스 생태계의 신뢰를 무너뜨리거나 클라우드 환경의 빈틈을 파고드는 매우 정교한 양상을 보이고 있습니다.

이번 포스팅에서는 최근 업계를 크게 뒤흔들었던 가장 파괴적이고 상징적인 실제 보안 사고 3가지를 선정하여, 그들의 구체적인 침투 경로와 기술적 원인을 정밀하게 해부해 보겠습니다.

글로벌 데이터 유출 위협을 상징하는 서버룸 경고 화면 콘셉트 글로벌 데이터 유출 위협을 상징하는 서버룸 경고 화면 콘셉트 — 출처: agy 생성

1. 리눅스 생태계를 통째로 집어삼킬 뻔한 ‘xz utils’ 백도어 사태 (2024년 3월)

첫 번째 사건은 오픈소스 역사상 가장 교묘하고 지능적이었던 ‘xz utils’ 백도어 삽입 사건입니다. 만약 이 백도어가 우연히 발견되지 않고 정상 배포되었다면, 전 세계 수억 대의 리눅스 서버 권한이 해커에게 통째로 넘어갈 뻔한 초대형 참사였습니다.

어떻게 침투했나 (침투 경로)

공격자는 ‘Jia Tan’이라는 가상 인물 계정을 만든 뒤, 2021년부터 약 3년 동안 xz utils 오픈소스 프로젝트에 아주 성실하고 유용한 코드를 지속적으로 기여하며 메인테이너(관리자)의 두터운 신뢰를 쌓았습니다.

이후 기존 메인테이너가 지치고 번아웃이 온 틈을 타 프로젝트 관리 권한을 넘겨받았고, 메인 관리자가 되자마자 빌드 과정에 교묘히 숨겨진 백도어 코드를 심었습니다.

기술적 원인 — 빌드 스크립트 뒤에 숨은 악성 라이브러리

공격자는 소스코드 본문에는 아무런 악성 코드를 남기지 않았습니다. 대신 배포용 압축 파일(tarball)을 해제하고 테스트를 수행하는 빌드 스크립트에 은밀하게 압축된 테스트용 바이너리 파일을 섞어 넣었습니다.

이 바이너리는 빌드 과정에서 풀려 리눅스의 원격 접속 관리 도구인 sshd(Secure Shell Daemon) 프로세스에 이식되었습니다. 해커는 자신만 아는 특정 암호화 키를 전송하는 것만으로 리눅스 서버에 인증 없이 원격 접속(RCE)할 수 있는 백도어를 완성했습니다.

  • 다행히 마이크로소프트(MS)의 엔지니어 안드레스 프렌드가 PostgreSQL 성능 튜닝을 하던 중, SSH 접속 시간이 단 0.5초 느려진 것과 CPU 점유율이 아주 미세하게 튄 것을 이상하게 여겨 디버깅을 진행한 끝에 이 백도어가 세상에 드러났습니다.

한 줄 요약: 3년에 걸친 신뢰 빌드업과 0.5초의 미세한 성능 저하가 교차하며 오픈소스 역사상 가장 정교했던 해킹 시도가 진압되었습니다.

개발자가 돋보기로 소스코드 속 숨겨진 악성 코드를 찾아내는 일러스트 개발자가 돋보기로 소스코드 속 숨겨진 악성 코드를 찾아내는 일러스트 — 출처: agy 생성

2. 1억 6천만 명의 데이터가 털린 ‘Snowflake’ 계정 탈취 대란 (2024년 중반)

두 번째 사고는 클라우드 데이터웨어하우스 플랫폼인 스노우플레이크(Snowflake)를 이용하던 대기업들이 무더기로 털리며 수억 건의 개인정보가 유출된 대형 참사입니다. 티켓마스터(Ticketmaster), 산탄데르(Santander) 은행, 그리고 미국 최대 이동통신사 AT&T 등이 줄줄이 피해를 입었습니다.

어떻게 침투했나 (침투 경로)

해커들은 스노우플레이크 플랫폼 자체의 취약점을 공격하지 않았습니다. 대신 기업의 스노우플레이크 접속 계정 중 다중인증(MFA, Multi-Factor Authentication)이 비활성화된 계정들을 집중 타깃으로 삼았습니다.

이후 다크웹이나 인포스틸러(정보 탈취 악성코드)로 흘러나온 기존 로그인 자격 증명을 무차별 대입하는 ‘크리덴셜 스터핑(Credential Stuffing)’ 공격으로 로그인에 성공하여 내부 데이터를 모두 다운로드했습니다.

기술적 원인 — 관리 편의성을 위해 꺼둔 보안 옵션

데이터웨어하우스 계정은 수많은 내부 직원과 자동화 시스템(CI/CD, BI 도구 등)이 접근하느라 관리가 번거롭다는 이유로 다중인증을 적용하지 않은 계정이 많았습니다.

더불어 스노우플레이크는 기본적으로 계정 생성 시 MFA 설정을 강제하지 않는 정책을 취하고 있었고, 해커들은 이 보안 공백을 비웃듯 기업들의 핵심 데이터베이스를 통째로 긁어 모은 뒤 랜섬웨어 협박을 가했습니다.

  • 이 사고는 클라우드 환경에서 “단 하나의 관리 계정이라도 다중인증을 생략하면 기업 전체의 클라우드 스토리지가 무방비로 개방된다”는 뼈아픈 교훈을 남겼습니다.

다중인증 생략으로 인해 클라우드 데이터베이스 금고가 뚫리는 콘셉트 아트 다중인증 생략으로 인해 클라우드 데이터베이스 금고가 뚫리는 콘셉트 아트 — 출처: agy 생성

3. 10만 개 이상 웹사이트가 오염된 ‘Polyfill.io’ 공급망 테러 (2024년 6월)

세 번째 사건은 프론트엔드 개발자들이 과거 구형 브라우저와의 호환성을 위해 흔히 임베드해 사용하던 자바스크립트(JS) 오픈소스 CDN인 Polyfill.io 서비스의 공급망 감염 사고입니다.

어떻게 침투했나 (침투 경로)

Polyfill.io는 전 세계 수많은 웹사이트가 의존하던 유명한 자바스크립트 서비스였습니다. 그러나 원작자가 프로젝트 유지보수를 중단하면서, 2024년 초 중국의 한 CDN 대행사(Funnel CDN)가 이 프로젝트의 도메인과 깃허브 계정을 인수했습니다.

그리고 같은 해 6월, 인수된 도메인에서 호스팅되던 polyfill.js 코드 파일에 불법 도박 및 성인 사이트로 유저들을 강제 리디렉션하는 악성 코드가 삽입되어 전 세계로 유포되기 시작했습니다.

기술적 원인 — 외부 CDN에 대한 맹목적 신뢰

개발자들은 html 파일 내부에 <script src="https://polyfill.io/v3/polyfill.min.js"></script> 형태로 외부 서버의 리소스를 실시간으로 다운받아 실행하도록 구현해 두었습니다.

도메인의 소유권이 바뀐 순간, 웹브라우저는 변조된 악성 자바스크립트 코드를 아무런 경고 없이 다운로드해 사용자의 웹 브라우저 위에서 실행시켰습니다.

  • 외부 CDN 도메인의 무결성을 사전에 검증하는 서브리소스 무결성(SRI, Subresource Integrity) 해시 체크 기술을 적용하지 않았던 수많은 웹사이트가 꼼짝없이 악성코드 유포지로 전락했습니다.

한 줄 요약: 소유권이 이전된 외부 도메인의 스크립트를 검증 없이 믿은 대가는 전 세계 10만 개 이상 웹사이트의 보안 오염이었습니다.

자바스크립트 코드가 악성 리디렉션 코드로 변조되어 작동하는 모바일 브라우저 콘셉트 아트 자바스크립트 코드가 악성 리디렉션 코드로 변조되어 작동하는 모바일 브라우저 콘셉트 아트 — 출처: agy 생성

실제 사고가 남긴 3가지 보안 레슨

최근 발생한 대형 실제 사고들은 우리에게 매우 구체적이고 현실적인 가이드라인을 제시합니다.

  • 오픈소스 기여자에 대한 맹목적 신뢰 경계 사용 중인 패키지의 보안 업데이트를 정기적으로 트래킹하고, 빌드 스크립트와 바이너리 크기 변경 등을 상시 모니터링해야 합니다.

  • 클라우드 내 모든 계정에 다중인증(MFA) 강제 적용 시스템 연동 계정이든 테스트 계정이든, 클라우드 환경의 예외 없는 MFA 적용은 크리덴셜 스터핑 공격을 99.9% 예방할 수 있는 가장 확실한 방패입니다.

  • 외부 리소스 참조 시 무결성 검증(SRI) 필수 자체 서버에 패키지를 호스팅하여 사용하거나, 부득이하게 외부 CDN을 끌어 쓸 때는 반드시 스크립트 해시값(SRI)을 명시하여 원본 코드가 임의로 변조되는 것을 차단해야 합니다.

현장의 실제 사고를 돌아보는 것은 우리가 안전한 코드를 작성하고 보안 설정을 점검하는 데 최고의 나침반이 되어 줍니다. 여러분의 프로젝트는 오늘 안전한가요? 한 번 더 점검해 보는 하루가 되시길 바랍니다!

참고 출처