개발 도구를 공격하는 해커들 — 보이지 않는 공격의 시대

소프트웨어 보안에 대한 이야기는 보통 한 가지 장면에서 시작된다. 누군가 서버를 침투했고, 데이터베이스가 유출되었으며, 서비스가 마비되었다는 뉴스다. 대부분의 사람들은 그 순간을 보안 사고의 시작이라고 생각한다. 공격자는 시스템에 들어왔고, 그 결과 피해가 발생했다. 하지만 이 시리즈에서 살펴본 여러 사건들은 그 통념을 조금 다르게 바라보게 만든다.

현대의 공격은 종종 서비스가 운영되는 순간이 아니라, 그 서비스가 만들어지는 과정에서 시작된다. 그리고 그 과정의 중심에는 항상 개발자가 사용하는 도구들이 존재한다. IDE, 빌드 시스템, 업데이트 서버, 패키지 저장소 같은 것들이다. 우리는 보통 그것들을 단순한 개발 편의 도구로 생각하지만, 실제로는 소프트웨어 생태계 전체를 연결하는 중요한 기반이기도 하다.

이 시리즈는 바로 그 지점에서 시작되었다. 프로그램 자체가 아니라 프로그램을 만드는 도구가 공격당했을 때 어떤 일이 벌어지는가라는 질문이다.

그리고 그 질문을 따라가다 보면, 현대 소프트웨어 세계의 구조가 얼마나 복잡한지 자연스럽게 드러난다.

업데이트가 공격당했던 날

Notepad++ 사건은 겉보기에는 비교적 단순한 보안 사고처럼 보였다. 누군가 업데이트 서버를 공격했고, 사용자에게 전달되는 프로그램 패키지가 변조되었다. 소프트웨어 자체의 취약점이 아니라 업데이트 과정이 공격당한 것이다.

하지만 이 사건이 보여준 메시지는 단순하지 않았다.

현대 소프트웨어에서 업데이트는 프로그램의 일부가 아니라 지속적으로 동작하는 배포 시스템이기 때문이다. 사용자는 프로그램을 한 번 설치하고 끝내지 않는다. 프로그램은 계속 업데이트되고, 새로운 기능이 추가되고, 보안 패치가 적용된다. 그 과정은 대부분 자동으로 이루어진다.

이 구조는 사용자 경험을 훨씬 편리하게 만들었지만 동시에 새로운 위험도 만들어냈다. 업데이트 시스템이 공격당하는 순간, 공격자는 사용자 한 명이 아니라 모든 사용자에게 동시에 접근할 수 있는 통로를 얻게 된다.

Notepad++ 사건은 바로 그 사실을 상징적으로 보여주었다. 공격자는 프로그램 자체를 해킹할 필요가 없었다. 단지 프로그램이 전달되는 경로만 장악하면 충분했다.

개발 도구가 공격 표면이 되는 이유

조금 더 시야를 넓혀 보면, 개발 도구 자체가 공격 대상이 되는 이유도 자연스럽게 이해할 수 있다.

현대의 소프트웨어는 한 명의 개발자가 처음부터 끝까지 모든 코드를 작성해 만드는 것이 아니다. 대부분의 프로젝트는 수많은 라이브러리와 도구 위에서 만들어진다. 개발자는 IDE를 사용하고, 패키지 매니저를 통해 라이브러리를 설치하며, 빌드 시스템을 통해 프로그램을 컴파일한다. 그 결과물이 CI/CD 시스템을 거쳐 배포된다.

이 구조를 하나의 긴 흐름으로 바라보면 그것은 마치 거대한 생산 라인과도 비슷하다.

그리고 생산 라인의 가장 위쪽에는 항상 개발자가 사용하는 도구가 존재한다.

공격자의 입장에서 보면 이 지점은 매우 매력적인 목표가 된다. 한 명의 사용자를 공격하는 대신 개발자를 공격하면 더 많은 시스템에 접근할 수 있기 때문이다. 그리고 개발자가 사용하는 도구를 공격하면, 그 도구로 만들어지는 수많은 프로그램에 동시에 영향을 줄 수 있다.

이것이 바로 공급망 공격이 개발 도구를 노리는 이유다. 공격자는 더 이상 완성된 제품을 공격하지 않는다. 대신 제품이 만들어지는 과정을 공격한다.

SolarWinds가 보여준 거대한 파장

이 구조가 얼마나 큰 영향을 만들 수 있는지는 SolarWinds 사건에서 극적으로 드러났다.

SolarWinds는 네트워크 관리 소프트웨어를 제공하는 기업이었다. 그들의 제품은 수많은 기업과 정부 기관에서 사용되고 있었다. 공격자는 그 고객들을 직접 공격하지 않았다. 대신 SolarWinds의 빌드 환경에 침투했다.

그 결과 정상적인 업데이트 패키지에 악성 코드가 포함되었고, 이 업데이트는 기존과 동일한 방식으로 고객들에게 배포되었다. 수많은 조직이 아무 의심 없이 업데이트를 설치했고, 그 순간 공격자는 그들의 네트워크 안으로 들어갈 수 있는 통로를 얻게 되었다.

이 사건이 특히 충격적이었던 이유는 공격의 방식 때문이었다. 모든 것이 정상적인 과정처럼 보였기 때문이다. 업데이트는 공식 서버에서 전달되었고, 디지털 서명도 정상적으로 보였다. 보안 시스템은 침입을 감지하지 못했고, 사용자 역시 아무런 이상을 느끼지 못했다.

공급망 공격의 특징은 바로 여기에 있다. 공격은 시스템을 파괴하는 방식으로 이루어지지 않는다. 오히려 정상적인 과정 속에 숨어서 작동한다.

개발 도구가 만들어낸 또 하나의 사건

XcodeGhost 사건 역시 비슷한 구조를 가지고 있었다.

당시 많은 iOS 개발자들이 Apple의 공식 개발 도구인 Xcode를 다운로드하는 데 어려움을 겪고 있었다. 다운로드 속도가 매우 느렸기 때문이다. 일부 개발자들은 더 빠른 다운로드를 위해 다른 경로에서 Xcode를 받기 시작했다.

문제는 그 중 일부가 변조된 개발 도구였다는 점이다.

이 도구를 사용해 앱을 빌드한 개발자들은 자신도 모르는 사이에 악성 코드가 포함된 애플리케이션을 만들게 되었고, 그 앱들은 그대로 App Store에 제출되었다. 결국 수많은 사용자들이 정상적인 앱을 설치했다고 생각했지만 실제로는 악성 코드가 포함된 프로그램을 다운로드하게 되었다.

이 사건에서 중요한 점은 개발자들이 공격의 의도를 가지고 행동한 것이 아니라는 사실이다. 그들은 단지 평소와 같은 방식으로 개발을 했을 뿐이다. 하지만 그 과정에서 사용한 도구가 이미 공격당해 있었다.

결과적으로 공격자는 사용자도, 개발자도 직접 공격하지 않았다. 단지 개발 도구 하나를 변조했을 뿐이다.

보안의 경계는 어디에 있는가

이 시리즈에서 살펴본 사건들은 서로 다른 시기에 발생했지만, 모두 하나의 공통된 질문으로 이어진다.

소프트웨어 보안의 경계는 어디에 있는가.

예전에는 그 경계가 비교적 명확했다. 서버가 있었고, 네트워크가 있었으며, 사용자 계정이 있었다. 보안 시스템은 그 경계를 지키는 역할을 했다. 방화벽이 외부 접근을 차단하고, 인증 시스템이 사용자를 검증하며, 침입 탐지 시스템이 공격을 감지했다.

하지만 현대의 소프트웨어 환경에서는 그 경계가 훨씬 더 앞쪽으로 이동했다.

코드를 작성하는 순간
빌드가 이루어지는 순간
패키지가 생성되는 순간
업데이트가 배포되는 순간

이 모든 단계가 새로운 보안 경계가 된다.

이제 공격자는 서버에 침투하지 않아도 된다. 대신 소프트웨어가 만들어지는 과정에 개입하면 된다.

보이지 않는 전쟁

우리가 사용하는 대부분의 프로그램은 수많은 계층 위에서 만들어진다. IDE와 에디터, 패키지 매니저, 오픈소스 라이브러리, 빌드 도구, CI 시스템, 배포 인프라, 업데이트 서버. 이 모든 것들이 하나의 거대한 생태계를 이루고 있다.

그리고 그 생태계의 어느 한 지점이 공격당하면, 그 영향은 예상보다 훨씬 넓게 퍼질 수 있다.

개발자가 사용하는 도구는 단순한 프로그램이 아니다. 그것은 소프트웨어 생산의 출발점이다. 그 출발점이 공격당하는 순간, 공격은 프로그램 하나를 넘어 생태계 전체로 확장될 수 있다.

이것이 바로 현대 보안 환경에서 벌어지고 있는 변화다. 공격은 더 이상 눈에 보이는 곳에서만 일어나지 않는다. 오히려 보이지 않는 곳에서, 조용히, 그리고 매우 효율적으로 이루어진다.

에필로그 — 우리가 바라봐야 할 구조

이 시리즈는 몇 가지 유명한 사건들을 통해 하나의 흐름을 보여주려 했다. Notepad++ 업데이트 서버 공격, 개발 도구를 노리는 공급망 공격, SolarWinds 사건, 그리고 XcodeGhost 사건까지.

각각의 사건은 서로 다른 배경을 가지고 있지만, 모두 같은 방향을 가리키고 있다.

현대 소프트웨어의 위험은 단순한 취약점에서만 발생하지 않는다.

때로는 우리가 신뢰하고 있는 개발 생태계 전체가 공격의 대상이 되기도 한다.

개발자는 코드만 작성하는 존재가 아니다. 그들은 거대한 소프트웨어 공급망의 한가운데에 서 있다. 그리고 그 공급망은 이제 세계의 거의 모든 디지털 시스템과 연결되어 있다.

이 시리즈의 이야기는 특정 사건을 정리하는 데서 끝나지 않는다. 오히려 그 사건들이 보여주는 구조를 이해하는 데서 시작된다.

소프트웨어를 공격하는 시대는 오래전부터 존재해 왔다. 하지만 지금 우리가 마주하고 있는 것은 조금 다른 시대다.

이제 공격자는 프로그램을 공격하는 것이 아니라
프로그램이 만들어지는 세계 전체를 공격하고 있다.