일반인도 알 만한 보안 관련 뉴스가 갈수록 자주 뜨는 것 같다. 쿠팡 개인정보 유출 사태가 있었고 어제는 국내 금융회사 여러 곳에서 개인정보 유출 사고가 발생했다. 얼마 전에는 OpenAI가 공개한 AI Astra가 사람의 단계별 지시 없이도 취약점을 찾아 악용할 수 있는 수준에 도달했다는 발표도 있었다.

기업들은 방화벽, 백신, 침입탐지시스템 같은 보안 제품에 계속 투자하고 모든 IT 프로젝트에도 보안은 빠지지 않는 요구사항이다. 그런데 왜 계속 뚫릴까?

뚫을 곳이 많으니 뚫는 방법도 많다

웹사이트 하나를 만들어도 구성 요소가 엄청 많다. API 서버와 데이터베이스가 있다. 개발자는 다양한 개발 도구를 사용하고 배포 서버가 결과물을 운영 환경에 올린다. 사내/사외 클라우드를 사용할 수도 있고 오픈소스 라이브러리도 수십, 수백 개는 들어간다.

이 모든 것들이 공격 지점이 될 수 있다.

뚫는 방법도 다양하다. 남의 계정을 탈취하는 방법만 해도 이렇게 많다.

  • 피싱: 가짜 사이트나 메일로 사람을 속여서 로그인 정보를 입력하게 한다.
  • 무차별 대입(브루트 포스): 가능한 모든 비밀번호를 넣어보며 맞는 것을 찾는다.
  • 유출된 비밀번호 활용(크리덴셜 스터핑): 다른 사이트에서 유출된 비밀번호를 그대로 넣어본다.
  • 키로깅: 악성코드를 설치해 키보드 입력을 기록한다.
  • 로그인 상태 가로채기(세션 하이재킹): 비밀번호를 몰라도 이미 로그인된 브라우저의 정보를 훔쳐 그 사람인 척한다.

심지어는 같은 사무실에 있는 다른 사람의 키보드 소리를 분석해 어떤 키를 눌렀는지 추정하는 방법도 가능하다고 한다. 또한 Timing Attack이라고 해서 서버가 로그인을 처리하는 미세한 시간 차이를 분석해 비밀번호를 알아내는 방법도 있다.

계정 탈취는 한 가지 예일 뿐이다. 웹 개발자라면 한 번쯤 들어봤을 OWASP Top 10은 웹에서 가장 흔한 취약점 유형만 추린 목록이다. 공격자가 실제로 사용하는 기법을 200여 가지로 분류한 MITRE ATT&CK도 있고 제품이나 소프트웨어에서 발견된 취약점을 모아둔 CVE 데이터베이스는 현재 38만 건이 넘었다.

작은 구멍 하나가 전체 시스템을 무너뜨릴 수 있다

공격 지점이 많다 보니 아주 작은 취약점 하나가 전체 시스템을 뚫는 데 사용될 수 있다.

내 시스템만 잘 지킨다고 되는 일도 아니다. 시스템에서 사용하는 라이브러리나 개발 도구, 업데이트 서버가 공격당하면 그 프로그램을 사용하는 수많은 시스템으로 공격이 퍼진다. 이른바 공급망 공격이다. 2020년 SolarWinds 사건에서는 공격자가 네트워크 관리 프로그램의 정식 업데이트에 악성코드를 심었고 그 업데이트를 믿고 설치한 약 1만 8천 곳의 기업과 정부 기관이 한꺼번에 위험에 노출됐다.

영화에서는 해커가 키보드 몇 번 두드리고 서버를 장악하지만 실제로는 목적 달성을 위해 상당한 공을 들이는 경우가 많다. 2024년의 xz 백도어 사건이 예시다. 공격자는 리눅스에서 많이 사용되는 압축 라이브러리 프로젝트에 2년 가까이 성실한 기여자로 활동하며 신뢰를 쌓았는데 관리 권한을 얻은 뒤 원격 접속을 뚫는 코드를 심었다고 한다. 로그인이 0.5초쯤 느려진 것을 이상하게 여긴 개발자 한 명이 아니었다면 그대로 전 세계 서버에 배포될 뻔했다.

공격자가 뚫고 들어와도 바로 사고를 일으키는 것이 아니라 오랫동안 숨어 있으면서 한 단계씩 더 중요한 시스템으로 옮겨간다. 사고가 터지기 전까지는 공격자가 들어왔는지조차 모르고 있다가 나중에 한 번에 크게 당한다. 이렇게 특정 대상을 노리고 오래 공을 들이는 공격을 지능형 지속 위협(APT) 이라고 한다.

보안은 막는다는 개념을 벗어난 지 오래다

시스템의 목적은 데이터를 주고받고 처리하는 것이다 보니 그 목적 자체가 보안과 상충된다. 아무도 들어오지 못하게 완전히 막아버리면 시스템을 쓸 수 없다.

도시에 비유하면 이렇다. 100% 자급자족하는 도시가 아니라면 어떤 식으로든 바깥과 왕래해야 한다. 방어를 위해 성벽을 둘러싸도 성문은 열어둬야 하고 땅굴을 파거나 담을 넘어오는 것까지 다 막을 수는 없다.

어디도 위험하다
어디도 위험하다

얼마 전 <오디세이> 관련 글도 썼지만 그 배경이 되는 트로이 전쟁도 결정적인 예시다. 그리스군은 10년 동안 공격하고도 트로이의 성벽을 뚫지 못했다. 결국 성을 무너뜨린 것은 성벽을 부수는 공격이 아니라 트로이 사람들이 제 손으로 성 안에 들여놓은 목마였다.

<오디세이> / Universal Studio
트로이의 목마

정상적인 프로그램인 척 들어오는 악성코드를 지금도 "트로이 목마"라고 부른다. 앞에서 본 SolarWinds의 업데이트도 사용자가 믿고 제 손으로 들여놓았다는 점에서 같은 구조다.

그래서 요즘 보안은 막는 것을 포함해 관리하고 대응하는 범위로 확장된다. 침투할 수 있는 지점 전체를 공격 표면이라고 부르는데 이 표면이 어디까지인지 파악하고 줄이는 것이 출발점이다.

미국 국립표준기술연구소(NIST)의 사이버보안 프레임워크는 보안 활동을 여섯 가지로 나눈다.

관리 체계(Govern), 식별(Identify), 보호(Protect), 탐지(Detect), 대응(Respond), 복구(Recover)

— NIST Cybersecurity Framework 2.0

여섯 가지 중 우리가 흔히 생각하는 "막는다"에 해당하는 것은 보호 하나뿐이다. 나머지는 무엇을 지켜야 하는지 아는 것, 뚫렸다는 사실을 찾아내는 것, 그리고 뚫린 뒤에 수습하는 것이다.

뚫리지 않는 것보다 뚫린 뒤가 더 중요하다

뉴스에는 개인정보 유출 사고가 많이 보도되지만 보안 사고의 피해는 정보 유출에만 그치지 않는다.

금융 자산을 훔치거나 서버를 장악해 다른 곳을 공격하는 경유지로 이용할 수도 있다. 기업의 설계도나 연구 자료를 빼갈 수도 있고 데이터를 암호화한 뒤 돈을 요구할 수도 있다.

내 경우 윈도 서버에 원격으로 작업하다가 그 서버의 데이터베이스가 랜섬웨어에 당한 것을 발견한 적이 있다. 테이블을 열어보니 "암호화를 풀려면 비트코인을 보내라"는 메시지가 들어 있었다. 리눅스 서버에 루트킷이 설치된 것을 발견한 적도 몇 번 있다. 루트킷은 침입한 흔적을 숨기면서 관리자 권한을 계속 쥐고 있게 해주는 악성 프로그램이다. 눈에 띄는 피해가 없었던 걸 보면 아마도 다른 곳을 공격하는 경유 서버로 쓰였던 게 아닐까 싶다.

더 찾아내기 어려운 것은 데이터를 조작하는 공격이다.

계좌번호나 거래 금액, 제품 검사 결과를 조금씩 변경한다면 한동안 발견하지 못할 수도 있다. 시험 성적 시스템에서 점수를 바꾸는 것도 그렇다.

보안의 세 가지 목표에 기밀성, 무결성, 가용성이라는 개념이 있다. 정보가 새지 않아야 하고 데이터가 몰래 바뀌지 않아야 하고 필요할 때 시스템을 쓸 수 있어야 한다는 뜻이다. 정보를 훔치는 것뿐 아니라 데이터를 바꾸거나 시스템을 못 쓰게 만드는 것 역시 보안 침해다.

중요한 것은 모든 침입을 100% 막겠다는 목표보다 뚫렸을 때 피해를 어디까지 잡을 것인가다.

예를 들어,

  • 계정 하나가 탈취되더라도 모든 시스템에 접근할 수는 없게 한다. (최소 권한)
  • PC 한 대가 감염되어도 다른 서버로 자유롭게 이동하지 못하게 한다. (네트워크 분리)
  • 데이터베이스가 유출되어도 중요한 데이터는 바로 읽을 수 없게 한다. (암호화)
  • 시스템 하나를 격리하더라도 다른 시스템으로 서비스를 계속할 수 있게 한다. (이중화)
  • 운영 시스템이 망가져도 복구할 수 있게 한다. (백업)

이런 식으로 한 지점의 침해가 전체 시스템의 붕괴로 이어지지 않게 만드는 것이 중요하다. 보안에서는 이를 폭발 반경(Blast Radius)을 줄인다고 표현한다.

쿠팡 사태도 알려진 바로는 퇴사한 직원이 갖고 있던 인증 키가 계속 유효했던 것이 원인이었다. 열쇠 하나가 새는 일은 어느 회사에서나 일어날 수 있다. 문제는 그 열쇠 하나로 열리는 문이 너무 많았다는 것이다.

보안은 위험을 없애는 일이 아니라 관리하는 일이다

새로운 소프트웨어와 서비스가 등장할수록 공격할 곳도 늘어난다. 이제는 AI까지 공격과 방어에 사용되기 시작했으니 공격 방법과 취약점은 계속 늘어날 것이다.

모든 시스템을 똑같은 수준으로 보호할 수도 없다. 중요한 시스템에는 더 많은 자원을 쓰고 그렇지 않은 곳에는 그만큼 적게 쓸 수밖에 없다. 결국 보안은 한정된 비용과 인력 안에서 공격 가능성과 피해 규모를 관리하는 일이 될 것이다.

시스템이 있는 한 어딘가는 뚫릴 수 있다. 중요한 것은 그 작은 구멍 하나가 전체 시스템을 무너뜨리는 구멍이 되지 않게 만드는 것이다.