API4:2023 Unrestricted Resource Consumption
위협 요소/공격 경로 | 보안 취약점 | 영향 |
API 명세: 악용 가능성 평균 | 확산성: 탐지 용이함 | 기술적 심각도: 특정 비지니스 |
악용하려면 간단한 API 요청이 필요합니다. 단일 로컬 컴퓨터에서 또는 클라우드 컴퓨팅 리소스를 사용하여 여러 동시 요청을 수행할 수 있습니다. 사용 가능한 대부분의 자동화 도구는 높은 트래픽 부하를 통해 DoS를 유발하여 API 서비스 속도에 영향을 미치도록 설계되었습니다. | 클라이언트 상호작용이나 리소스 소비를 제한하지 않는 API를 찾는 것이 일반적입니다. 반환될 리소스 수를 제어하고 응답 상태/시간/길이 분석을 수항하는 매개변수를 포함하는 API요청과 같이 작성된 API요청을 통해 문제를 식별할 수 있어야 합니다. 일괄 작업에도 동일하게 적용됩니다. 위협요소는 비용 영향에 대한 가시성을 가지고 있지 않지만, 이는 서비스 공급자(예: 클라우드 제공자)의 비즈니스/가격책정 모델을 기반으로 추론될 수 있다. | 악용된다면 자원부족으로 인한 DoS로 이어질 수 있지만 CPU수요증가, 클라우드 스토리지 요구 증가 등으로 인프라 관련 비용 증가로 이어질 수 있습니다. |
취약한 API
API 요청을 충족하려면 네트워크 대역폭, CPU, 메모리, 스토리지와 같은 리소스가 필요합니다. 때로는 API 통합을 통해 서비스 제공업체가 필요한 리소스를 제공하고 이메일/SMS/전화 통화 전송, 생체 인식 확인 등과 같은 요청별로 비용을 지불하는 경우가 있습니다.
다음 제한 중 하나 이상이 누락되거나 부적절하게 설정된 경우(예: 너무 낮거나 높음) API는 취약합니다.
•
실행 시간 초과
•
최대 할당 가능한 최대 메모리
•
Maximum number of file descriptors
•
최대 프로세스 수
•
최대 업로드 파일 크기
•
단일 API 클라이언트 요청에서 수행할 작업 수(예: GraphQL 일괄 처리)
•
단일 요청-응답으로 반환할 페이지당 레코드 수
•
third-party 서비스 제공업체의 지출 한도
공격 시나리오
Scenario #1
소셜 네트워크는 SMS 확인을 사용하여 "잊혀진 비밀번호" 흐름을 구현하여 사용자가 비밀번호를 재설정하기 위해 SMS를 통해 일회성 토큰을 받을 수 있도록 했습니다.
사용자가 "비밀번호 찾기"를 클릭하면 API 호출이 사용자의 브라우저에서 백엔드 API로 전송됩니다.
POST /initiate_forgot_password
{
"step": 1,
"user_number": "6501113434"
}
JavaScript
복사
그런 다음 뒤에서 API 호출이 백엔드에서 SMS 전달을 관리하는 타사 API로 전송됩니다.
POST /sms/send_reset_pass_code
Host: willyo.net
{
"phone_number": "6501113434"
}
JavaScript
복사
third-party서비스 제공업체인 Willyo는 이러한 유형의 통화당 $0.05를 청구합니다.
공격자는 첫 번째 API 호출을 수만 번 보내는 스크립트를 작성합니다. 백엔드는 Willyo에게 수만 개의 문자 메시지를 보내달라고 요청하여 회사는 몇 분 만에 수천 달러의 손실을 입게 됩니다.
Scenario #2
GraphQL API 엔드포인트를 사용하면 사용자가 프로필 사진을 업로드할 수 있습니다.
POST /graphql
{
"query": "mutation {
uploadPic(name: \"pic1\", base64_pic: \"R0FOIEFOR0xJVA…\") {
url
}
}"
}
JavaScript
복사
업로드가 완료되면 API는 업로드된 사진을 기반으로 다양한 크기의 여러 썸네일을 생성합니다. 이 그래픽 작업은 서버에서 많은 메모리를 사용합니다
API는 전통적인 속도 제한 보호를 구현합니다. 즉, 사용자는 짧은 시간 내에 GraphQL end-points에 너무 많이 액세스할 수 없습니다. 또한 API는 너무 큰 사진을 처리하는 것을 방지하기 위해 축소판을 생성하기 전에 업로드된 사진의 크기를 확인합니다.
공격자는 GraphQL의 유연한 특성을 활용하여 이러한 메커니즘을 쉽게 우회할 수 있습니다.
POST /graphql
[
{"query": "mutation {uploadPic(name: \"pic1\", base64_pic: \"R0FOIEFOR0xJVA…\") {url}}"},
{"query": "mutation {uploadPic(name: \"pic2\", base64_pic: \"R0FOIEFOR0xJVA…\") {url}}"},
...
{"query": "mutation {uploadPic(name: \"pic999\", base64_pic: \"R0FOIEFOR0xJVA…\") {url}}"},
}
JavaScript
복사
API는 uploadPic작업에 대한 횟수를 제한하지 않기 때문에, 해당 호출은 서버 메모리의 소모로 인해 서비스 거부현상이 발생합니다.
Scenario #3
서비스 제공자는 클라이언트가 자신의 API를 이용하여 임의로 대용량 파일을 다운로드할 수 있도록 허용합니다. 이러한 파일들은 클라우드 객체 저장소에 저장되어 있으며 자주 변경되지 않습니다. 서비스 공급자는 더 나은 속도를 제공하고, 대역폭 소모를 낮게 유지하기 위해 캐시 서비스에 의존합니다. 캐시 서비스는 최대 15GB의 파일만을 캐시합니다.
파일 중 하나가 업데이트되면 그 크기는 18GB로 증가합니다. 모든 서비스 클라이언트는 즉시 새 버전을 가져오기 시작합니다. 클라우드 서비스에 대한 소비 비용 알림이나, 최대 비용 허용 한도가 없었기 때문에 다음 월별 청구서는 평균 $13에서 $8,000로 증가합니다.
예방 방법
•
memory, CPU, 재시작 횟수, file descriptors, 컨테이너/서버리스코드 등의 프로세스(예: Lambdas)와 같은 프로세스를 쉽게 제한할 수 있는 솔루션을 사용합니다.
•
문자열의 최대 길이, 배열의 최대 요소 수, 최대 업로드 파일 크기(로컬 또는 클라우드 스토리지에 저장되었는지 여부에 관계없이)와 같은 모든 수신 매개변수 및 페이로드에 대한 최대 데이터 크기를 정의하고 적용합니다.
•
정의된 기간 내에 클라이언트가 API와 상호 작용할 수 있는 빈도에 대한 제한을 구현합니다(속도 제한).
•
속도 제한은 비즈니스 요구 사항에 따라 미세 조정되어야 합니다. 일부 API end-points에는 더 엄격한 정책이 필요할 수 있습니다.
•
단일 API 클라이언트/사용자가 단일 작업을 실행할 수 있는 횟수 또는 빈도를 제한/조절합니다(예: OTP 유효성 검사 또는 일회성 URL을 방문하지 않고 비밀번호 복구 요청).
•
쿼리 문자열 및 요청 본문 매개 변수(특히 응답에서 반환할 레코드 수를 제어하는 매개 변수)에 대한 적절한 서버 측 검증을 추가합니다.
•
모든 서비스 제공업체/통합API에 대한 지출 한도를 설정합니다. 지출 한도를 설정할 수 없는 경우에는 청구 알림을 설정해야 합니다.
References
OWASP
External
•
"Rate Limiting (Throttling)" - Security Strategies for Microservices-based Application Systems, NIST