HOME
home
CV News
home

API Security Top 10(API4:2023 Unrestricted Resource Consumption)

DEV 속성
Security
날짜
2024/01/22

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로 증가합니다.

예방 방법

memoryCPU재시작 횟수file descriptors, 컨테이너/서버리스코드 등의 프로세스(예: Lambdas)와 같은 프로세스를 쉽게 제한할 수 있는 솔루션을 사용합니다.
문자열의 최대 길이, 배열의 최대 요소 수, 최대 업로드 파일 크기(로컬 또는 클라우드 스토리지에 저장되었는지 여부에 관계없이)와 같은 모든 수신 매개변수 및 페이로드에 대한 최대 데이터 크기를 정의하고 적용합니다.
정의된 기간 내에 클라이언트가 API와 상호 작용할 수 있는 빈도에 대한 제한을 구현합니다(속도 제한).
속도 제한은 비즈니스 요구 사항에 따라 미세 조정되어야 합니다. 일부 API end-points에는 더 엄격한 정책이 필요할 수 있습니다.
단일 API 클라이언트/사용자가 단일 작업을 실행할 수 있는 횟수 또는 빈도를 제한/조절합니다(예: OTP 유효성 검사 또는 일회성 URL을 방문하지 않고 비밀번호 복구 요청).
쿼리 문자열 및 요청 본문 매개 변수(특히 응답에서 반환할 레코드 수를 제어하는 매개 변수)에 대한 적절한 서버 측 검증을 추가합니다.
모든 서비스 제공업체/통합API에 대한 지출 한도를 설정합니다. 지출 한도를 설정할 수 없는 경우에는 청구 알림을 설정해야 합니다.

References

OWASP

External