사전 공격 표면
개념

공격 표면

gabury1고친 사람 github-actions[bot]

공격 표면은 바깥에서 시스템을 건드릴 수 있는 지점을 빠짐없이 모은 것입니다. 열어 둔 포트 하나, 로그인 폼 하나가 그런 지점입니다. 그런 지점이 늘어날수록 공격자가 골라 탈 수 있는 길도 함께 늘어납니다. 그래서 보안 설계는 잘 막는 일과 적게 여는 일을 같이 다룹니다.

쉽고 빠른 이해

공격 표면은 권한 없는 사람이 손댈 수 있는 지점을 모두 모은 것입니다. 로그인 폼 하나, 열어 둔 포트 하나가 각각 그런 지점입니다.

이걸 안 세면 무엇을 지켜야 하는지 모른 채 방어만 늘리게 됩니다. 정작 뚫리는 곳은 아무도 안 써서 잊고 있던 관리 화면인 경우가 많습니다.

세는 순서는 이렇습니다.

  1. 바깥과 닿는 지점을 빠짐없이 적습니다
  2. 지점마다 누가 닿을 수 있고 무엇을 시킬 수 있는지 적습니다
  3. 안 쓰는 것은 끄고, 남은 것은 권한을 좁힙니다

대가는 기능과 편의가 같이 깎인다는 것입니다. 장애를 들여다보려고 열어 둔 통계 화면을 닫으면, 사고가 났을 때 원인을 찾는 데 시간이 더 걸립니다.

상세

집 한 채를 지킨다고 해 봅시다. 대문만 지키면 될 것 같지만 창문, 지하실 통풍구, 우편함까지가 바깥과 닿습니다. 자물쇠를 아무리 단단히 달아도 창문이 스무 개면 확인할 곳이 스무 군데입니다.

공격 표면은 권한이 없는 사람이 시스템에 무언가를 넣거나 빼낼 수 있는 지점을 전부 합한 것입니다. 회원가입 폼이 한 지점입니다. 급할 때 열어 두고 잊은 관리 화면도 한 지점입니다. 이 지점들은 대개 어디에도 안 적혀 있습니다. 배포할 때마다 조용히 늘어나기까지 합니다.

표면에 들어가는 세 갈래

들어오는 것만 세면 절반을 놓칩니다. 바깥에서 값을 받는 곳뿐 아니라 안의 것을 바깥으로 내보내는 곳도 표면입니다. 에러 메시지에 딸려 나가는 내부 파일 경로나 스택 추적은 공격자에게 다음 수를 알려 주는 정보원이 됩니다.

무엇이 표면에 들어가는지는 세 갈래로 나눠 보면 빠짐없이 모입니다. 갈래마다 세는 사람이 달라서, 한 사람이 혼자 세면 꼭 한 갈래가 빕니다. 아래 표에 나오는 API(Application Programming Interface, 응용 프로그램 인터페이스)는 다른 프로그램이 우리 기능을 부르도록 열어 둔 창구를 말합니다.

갈래 지점의 예 주로 세는 사람
네트워크 열어 둔 포트 · 바깥에 연 API · 관리 화면 인프라를 보는 사람
코드 사용자 입력을 받는 함수 · 파일 업로드 · 가져다 쓰는 의존성 코드를 짜는 사람
사람 고객센터 상담 절차 · 비밀번호 재설정 절차 운영 절차를 만드는 사람

셋째 줄이 뜻밖으로 보일 수 있습니다. 상담원을 속여 비밀번호를 초기화시키는 길이 뚫려 있으면, 코드가 아무리 단단해도 계정은 넘어갑니다. 사람도 시스템에 명령을 넣는 통로라서 표면에 들어갑니다.

이 지점들이 어디에 놓이는지는 그림 한 장으로 잡힙니다.

flowchart TD
    A["바깥 · 누구나"] -->|"닿아 본다"| B
    subgraph B["공격 표면 · 바깥과 닿는 지점"]
        B1["공개 API"]
        B2["로그인 폼"]
        B3["잊고 열어 둔 관리 화면"]
    end
    B -->|"뚫리면"| C
    subgraph C["신뢰 경계 안 · 지키려는 것"]
        C1["고객 데이터"]
        C2["열쇠와 비밀번호"]
    end

그림에서 볼 것은 표면이 바깥과 안 사이에 놓인 띠라는 점입니다. 지점을 하나 늘리면 띠가 넓어지고 끄면 좁아집니다.

띠 안쪽과 바깥쪽을 가르는 선을 신뢰 경계라고 부릅니다. 경계 안은 우리가 통제하는 구역입니다. 경계 밖에서 들어오는 값은 전부 의심하고 받습니다.

지점의 무게를 정하는 세 물음

지점을 세는 것만으로는 부족합니다. 사내망에서만 열리는 관리 화면과 인터넷에 그대로 열린 관리 화면은 숫자로는 똑같이 한 개지만 위험이 다릅니다. 그래서 지점마다 세 가지를 같이 적습니다. 이 셋을 합한 것이 그 지점의 무게입니다.

묻는 것 무게가 올라가는 쪽
누가 닿을 수 있나 로그인 없이 인터넷에서 바로
무엇을 시킬 수 있나 파일 쓰기 · 명령 실행
뚫리면 무엇이 나오나 열쇠와 고객 데이터

누구나 닿아도 읽기만 되는 소개 화면은 무게가 낮습니다. 로그인 뒤에 있어도 명령을 실행해 주는 기능은 무게가 높습니다. 표면을 줄인다는 말은 지점 수만 줄이는 것이 아니라 남은 지점의 무게까지 내리는 일입니다.

취약점·공격 벡터와 가르기

공격 표면·취약점·공격 벡터 셋은 보안 보고서에 나란히 나와서 섞이기 쉽습니다. 셋이 가리키는 것과 줄이는 방법이 각각 다릅니다. 하나씩 가르면 이렇습니다.

말 가리키는 것 줄이는 방법
공격 표면 바깥과 닿는 지점 전부 안 쓰는 지점을 끈다
취약점 그 지점에 난 결함 고치거나 고쳐진 판으로 올린다
공격 벡터 공격자가 골라 탄 경로 표면이 좁아지면 고를 것이 준다

가르는 실익은 여기 있습니다. 알려진 취약점을 전부 고쳐도 공격 표면은 그대로 남습니다. 오늘 결함이 없다고 내일도 없는 것은 아닙니다. 그래서 표면을 좁히는 일은 결함을 고치는 일과 따로 해야 합니다.

아직 아무도 모르는 결함을 제로데이라고 합니다. 이런 결함은 고칠 대상을 모르니 미리 막을 수 없습니다. 표면을 좁혀 두면 그 결함이 앉을 곳 자체가 줄어듭니다.

표면이 저절로 넓어지는 흐름

기능을 하나 붙일 때마다 지점이 하나 늡니다. 급할 때 임시로 연 것은 대개 닫히지 않습니다. 옛 버전을 위해 남겨 둔 통로도 살아 있습니다. 표면은 한 번 재고 끝나는 값이 아니라 계속 밀려 올라가는 값입니다.

남이 만든 코드를 가져다 쓰면 그 코드가 받는 입력도 우리 표면이 됩니다. 라이브러리 하나가 파일을 읽어 해석해 준다면, 그 해석기의 결함이 곧 우리 서비스의 결함입니다. 이렇게 남의 코드나 배포 경로를 통해 들어오는 공격을 공급망 공격이라고 합니다.

표면을 좁히는 순서

좁히려면 먼저 무엇이 열려 있는지 적어야 합니다. 못 세는 지점은 못 줄입니다. 열린 곳을 체계적으로 찾아 적고 무엇을 노릴 만한지 따져 보는 작업이 위협 모델링입니다.

지점 하나를 놓고 물음 둘을 차례로 던집니다. 그러고도 남는 지점에 두 가지를 겁니다.

flowchart TD
    A["바깥과 닿는 지점 하나"] --> B{"지금 쓰나"}
    B -->|안 쓴다| C["끈다 · 지운다"]
    B -->|쓴다| D{"아무나 써야 하나"}
    D -->|아니다| E["로그인 뒤로 · 사내망 안으로 옮긴다"]
    D -->|그렇다| F["받는 값을 검사하고 권한을 좁힌다"]

첫 물음이 효과가 제일 큽니다. 꺼 버린 지점은 그 안에 결함이 있어도 뚫을 수 없기 때문입니다. 안 쓰는 기능을 끄고 안 쓰는 계정을 지우는 일이 여기에 해당합니다.

둘째 물음은 지점을 없애지 못할 때 무게를 내리는 방법입니다. 같은 관리 화면이라도 사내망 안으로 옮기면 닿을 수 있는 사람이 줄어듭니다. 기능은 그대로 두고 앞의 표에서 첫 칸만 내린 셈입니다.

끝까지 남는 지점에 거는 두 가지는 이렇습니다. 하나는 받는 값을 정해진 꼴만 통과시키는 입력 검증입니다. 다른 하나는 그 지점 뒤에 붙는 권한을 꼭 필요한 만큼으로 줄이는 최소 권한입니다. 뒤엣것을 걸어 두면 뚫려도 가져갈 수 있는 것이 그만큼 줄어듭니다.

한 겹이 뚫려도 다음 겹이 남게 여러 겹으로 막는 생각은 심층 방어라고 합니다. 표면을 좁히는 일과 겹을 쌓는 일은 서로를 대신하지 못합니다. 지점을 줄여도 남은 지점 뒤는 지켜야 합니다. 겹을 쌓아도 쓰지 않는 지점은 닫는 편이 낫습니다.

챙기는 때와 멈추는 선

새 기능을 설계할 때, 무언가를 바깥에 열 때, 남의 코드를 새로 들일 때 한 번씩 묻습니다. 이 기능이 지점을 몇 개 늘리는지, 그 지점 뒤에 무엇이 있는지 둘이면 대개 충분합니다.

반대로 표면을 0으로 만드는 것은 목표가 아닙니다. 아무도 못 닿는 서비스는 아무도 못 쓰기 때문입니다. 그래서 판단은 지점을 없애는 쪽이 아니라, 꼭 필요한 지점만 남기고 그 지점의 무게를 내리는 쪽으로 갑니다.

관련 항목

공격 표면을 이루는 지점

API · 엔드포인트 · 포트 · 파일 업로드 · 사용자 입력 · 의존성 · 관리 콘솔 · 웹훅

공격 표면을 타고 들어오는 공격

SQL 인젝션 · 교차 사이트 스크립팅 · 크로스 사이트 요청 위조 · 서버 사이드 요청 위조 · 권한 상승 · 공급망 공격 · 사회공학 · 피싱 · 재전송 공격 · 컨테이너 탈출

공격 표면과 헷갈리는 이웃 용어

취약점 · 공격 벡터 · 익스플로잇 · 제로데이 · 위협 · 리스크

공격 표면을 좁힐 때 따르는 원칙

최소 권한 · 심층 방어 · 제로 트러스트 · 신뢰 경계 · 권한 분리 · 샌드박스 · 격리 · 기본 차단

공격 표면을 줄이는 데 쓰는 장치

방화벽 · API 게이트웨이 · 리버스 프록시 · VPN · 접근 제어 · 입력 검증 · 허용 목록 · 네트워크 분리

공격 표면을 찾아내고 재는 활동

위협 모델링 · 침투 테스트 · 취약점 점검 · 보안 코드 리뷰 · 자산 관리 · 보안 엔지니어링

공격 표면에 난 결함에 번호를 매기는 목록

OWASP · OWASP Top 10 · CWE · CVE · MITRE ATT&CK · CVSS

공격 표면이 새로 생기는 실행 환경

가상화 · 컨테이너 · Kubernetes · 서버리스 · 마이크로서비스 · 클라우드

다른 이름: attack surface · 공격면