AI VIDEO BRIEFING
SSRF와 IMDSv1: 교과서대로 만든 클라우드 인프라가 명령 한 줄에 털리는 이유
비공개 버킷과 최소 권한 역할, 방화벽까지 교과서대로 갖춘 클라우드 환경이 명령 한 줄에 뚫린다. SSRF와 구형 메타데이터 서비스가 만나 자격증명이 새는 과정과 설정 하나로 막는 방법을 정리했다.

핵심 메시지
쉽게 이해하기
영상은 교과서대로 잘 만든 클라우드 환경을 먼저 세운다. 비공개 스토리지 버킷은 공개 접근을 전부 차단했고, 코드에는 어떤 비밀번호도 들어 있지 않으며, 앞단에는 로드밸런서가 있고 방화벽 규칙도 촘촘하다. 그런데 계정도 키도 없는 외부 머신에서 curl 명령 한 줄을 보내자 서버가 자기 저장소의 열쇠를 그대로 건네준다. 악성코드도, 비밀번호 크래킹도 필요 없었다.
구조를 보면 이유가 드러난다. 웹 서버는 비공개 저장소의 파일을 읽어야 하는데, 영구 액세스 키를 코드에 박아 넣는 옛 방식 대신 읽기 전용 권한만 가진 역할을 서버에 붙였다. 이렇게 하면 클라우드가 짧은 수명의 자동 갱신 자격증명을 필요할 때마다 발급한다. 여기까지는 모범 사례다. 네트워크도 두 가용 영역에 서브넷을 나눈 가상 사설망 위에 세웠고, 웹 서버 방화벽은 로드밸런서에서 오는 트래픽만 받도록 잠갔다.
문제는 두 곳에 있었다. 하나는 애플리케이션의 링크 미리보기 기능으로, URL을 주면 서버가 그 주소를 대신 열어 결과를 보여준다. 서버는 어떤 주소든 묻지 않고 가져오며, 이것이 서버 측 요청 위조, 즉 SSRF다. 다른 하나는 인스턴스 메타데이터 서비스가 토큰이 선택 사항인 구버전으로 남아 있었다는 점이다. 모든 인스턴스는 169.254.169.254라는 내부 주소로 자기 정보를 물어볼 수 있는데, 구버전은 요청하는 누구에게나 붙어 있는 역할의 살아 있는 자격증명을 내준다.
공격은 단순하다. 아무 권한도 없는 외부 머신에서 로드밸런서 주소로 요청을 보내되 URL 파라미터에 내부 메타데이터 주소를 넣는다. 웹 서버는 시킨 대로 자기 자신의 내부 주소를 조회해 역할 이름과 임시 액세스 키, 시크릿, 세션 토큰을 가져오고 그것을 로드밸런서를 통해 그대로 밖으로 돌려준다. 이 값을 공격자 머신에 넣는 순간 클라우드 입장에서 공격자는 그 웹 서버 본인이며, 공개 접근을 차단한 버킷의 비밀 파일을 정상 자격증명으로 읽어간다.
차단은 코드를 건드리지 않는다. 메타데이터 서비스를 토큰이 필수인 2버전으로 바꾸면 된다. 이제 모든 메타데이터 요청은 특수 헤더를 실은 PUT 요청으로 짧은 수명의 세션 토큰을 먼저 받아야 하고, 그다음에야 정보를 읽을 수 있다. URL 파라미터를 통한 SSRF는 단순한 GET 요청밖에 만들지 못하므로 토큰을 받아올 방법이 없다. 같은 공격을 다시 실행하면 응답 본문 길이가 0으로 돌아온다.
주요 인사이트
- 아키텍처가 전부 옳아도 레거시 기본값 하나가 남아 있으면 방어선 전체가 무력해진다. 이 사례에서 공격이 이긴 것은 설계가 아니라 설정이었다.
- 최소 권한 역할과 임시 자격증명은 여전히 옳은 선택이다. 다만 그 자격증명을 꺼내오는 경로 자체를 보호해야 완성된다.
- 사용자가 준 URL을 서버가 대신 열어주는 기능은 어디에나 있다. 링크 미리보기, 웹훅, 이미지 가져오기, 문서 변환 같은 기능은 모두 SSRF 관점에서 다시 볼 필요가 있다.
- 공격자가 정상 자격증명으로 들어오면 접근 차단 설정은 소용이 없다. 공개 접근 차단은 인증되지 않은 접근만 막을 뿐이다.
- IMDSv2가 방어가 되는 이유는 암호화 강도가 아니라 SSRF가 만들 수 없는 형태의 요청을 요구하기 때문이다. 공격자의 능력 범위를 좁히는 설계가 실효를 낸다.
자주 묻는 질문
SSRF가 정확히 무엇인가?
서버 측 요청 위조를 뜻한다. 사용자가 넘긴 URL을 서버가 아무 검증 없이 대신 열어주는 상황에서, 공격자가 외부에서는 닿을 수 없는 내부 주소를 지정해 서버를 대리인처럼 쓰는 공격이다.
왜 169.254.169.254 주소가 문제가 되나?
클라우드 인스턴스가 자기 정보를 조회하는 내부 전용 주소로, 여기에는 인스턴스에 붙은 역할의 살아 있는 임시 자격증명도 포함된다. 구버전 메타데이터 서비스는 요청하는 누구에게나 이 값을 그대로 내준다.
메타데이터 서비스 2버전은 어떻게 공격을 막나?
정보를 읽기 전에 특수 헤더를 실은 PUT 요청으로 짧은 수명의 세션 토큰을 먼저 받도록 강제한다. URL 파라미터를 이용한 SSRF는 단순 GET 요청만 만들 수 있어 토큰을 받아올 수 없고, 결과적으로 응답이 비어서 돌아온다.
공개 접근을 모두 차단한 버킷이 어떻게 털렸나?
공개 접근 차단은 인증되지 않은 접근만 막는다. 공격자는 웹 서버의 임시 자격증명을 훔쳐 클라우드에 정상적으로 인증했기 때문에, 시스템 입장에서는 권한 있는 서버가 자기 파일을 읽은 것과 구분되지 않았다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗