SSRF→RCE는 서버가 대신 보내는 요청(SSRF)이 내부 관리 인터페이스·역직렬화 엔드포인트에 도달해 원격 코드 실행(RCE)으로 확대되는 공격 체인이다.
2026년 공개된 Cisco CUCM 취약점(CVE-2026-20230)은 SSRF가 내부 서비스를 거쳐 루트 권한 RCE로 이어졌고, 공개 24시간 안에 실제 공격에 사용됐다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.
한눈에 보는 핵심
Q. SSRF가 어떻게 RCE까지 가나요? A. SSRF로 내부에만 열린 관리 API·역직렬화 처리기·인증 없는 서비스에 요청을 보낼 수 있으면, 그 서비스의 결함을 통해 명령 실행으로 확장됩니다. SSRF는 내부망 진입 열쇠입니다. Q. WAF만으로 SSRF를 막을 수 있나요? A. 부족합니다. WAF는 알려진 페이로드는 걸러도 내부 도메인·우회 인코딩은 놓칩니다. 애플리케이션 레벨의 목적지 검증과 네트워크 egress 통제가 필요합니다. Q. egress 차단이 왜 중요한가요? A. 코드 검증이 뚫려도 서버가 외부·메타데이터로 나가는 트래픽 자체를 막으면 자격증명 탈취와 콜백을 차단할 수 있습니다. 다층 방어의 마지막 선입니다.자주 발생하는 실수 패턴
| # | 패턴 | 위험도 |
|---|---|---|
| 1 | 사용자 입력 URL을 검증 없이 서버가 요청 | 치명 |
| 2 | 내부 관리 인터페이스가 인증 없이 노출 | 치명 |
| 3 | egress(외부 나가는 트래픽) 무제한 허용 | 높음 |
| 4 | 해석된 IP 재검증 없이 도메인 문자열만 검사 | 높음 |
| 5 | SSRF 응답을 사용자에게 그대로 반환(blind→비blind) | 중간 |
표준 구현 코드
# 서버 측 요청 전 목적지 검증 (Django 예시)
import ipaddress, socket
from urllib.parse import urlparse
def is_internal_url(url: str) -> bool:
host = urlparse(url).hostname or ""
try:
ip = ipaddress.ip_address(socket.gethostbyname(host))
except Exception:
return True # 해석 실패는 차단 측으로
return ip.is_private or ip.is_loopback or ip.is_link_local
def fetch_external(url: str):
if is_internal_url(url): # 내부/메타데이터 차단
raise ValueError("내부 자원 요청 차단")
return http_get(url, allow_redirects=False, timeout=5)
# 네트워크단: 앱 서버 egress를 필요한 도메인만 허용(방화벽/프록시)
핵심은 "동작하는 코드"와 "안전한 코드"가 다르다는 점이다.
AI 코딩 도구는 기능 충족 코드를 우선 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어·정책·CI 게이트로 모든 경로에 일괄 적용하는 것이 표준이다.
30초 자가진단
# 1. 서버가 대신 요청하는 파라미터 탐색(url=, image=, callback=, webhook=)
# 거기에 내부 주소를 넣어본다
curl "https://yourapp/preview?url=http://169.254.169.254/latest/meta-data/"
# 2. 내부 포트 스캔 응답 시간차 확인(blind SSRF)
curl "https://yourapp/preview?url=http://127.0.0.1:22/"
# 메타데이터 반환·포트별 시간차가 보이면 결함
위 시그널이 발견되면 결함이다. OWASP SSRF 방어 치트시트를 함께 참조하라.
24시간 패치 절차
| 순위 | 조치 |
|---|---|
| 1 | URL 파라미터에 is_internal_url() 검증 강제 |
| 2 | 리다이렉트 비허용 + 스킴 화이트리스트 |
| 3 | 앱 서버 egress를 허용 도메인만으로 방화벽 제한 |
| 4 | 내부 관리 인터페이스에 인증·네트워크 격리 적용 |
| 5 | 클라우드 메타데이터 IMDSv2(토큰 필수)로 강제 |
지금 해야 할 것
실무자: CodeScan 무료 스캔으로 30초 점검 후 우선순위대로 패치.
CISO·임원: 조직 전체 점검·규제 대응은 SENTRIX 30분 1:1 상담으로.
결함은 발견 즉시, 늦어도 24시간 안에 패치하는 것이 표준이다.