HOME
home
CV News
home

API Security Top 10(API3:2023 Broken Object Property Level Authorization)

DEV 속성
Security
날짜
2024/01/22

API3:2023 Broken Object Property Level Authorization

위협원/공격 경로
보안 취약점
영향
API 명세: 악용 용이함
확산성: 탐지 용이함
기술적 심각도: 특정 비지니스
API는 모든 개체의 속성을 반환하는 end-points를 노출하는 경향이 있습니다. 이는 특히 REST API에 유효합니다. GraphQL과 같은 다른 프로토콜의 경우 반환해야 하는 속성을 지정하기 위해 제작된 요청이 필요할 수 있습니다. 조작할 수 있는 이러한 추가 속성을 식별하려면 더 많은 노력이 필요하지만 이 작업을 지원하는 데 사용할 수 있는 몇 가지 자동화 도구가 있습니다.
API 응답을 검사하는 것만으로도 반환된 객체 표현에서 민감한 정보를 식별하는 데 충분합니다. 퍼징은 일반적으로 추가(숨겨진) 속성을 식별하는 데 사용됩니다. 변경 가능 여부는 API 요청을 작성하고 응답을 분석하는 문제입니다. API 응답에 대상 속성이 반환되지 않으면 부작용 분석이 필요할 수 있습니다.
개인/민감한 개체 속성에 대한 무단 액세스로 인해 데이터 공개, 데이터 손실 또는 데이터 손상이 발생할 수 있습니다. 특정 상황에서는 개체 속성에 대한 무단 액세스로 인해 권한 상승 또는 부분/전체 계정 탈취가 발생할 수 있습니다.

취약한 API

사용자가 API 엔드포인트를 사용하여 개체에 액세스하도록 허용할 때 사용자가 액세스하려는 특정 개체 속성에 대한 액세스 권한이 있는지 확인하는 것이 중요합니다.
다음과 같은 경우 API 엔드포인트가 취약합니다.
API 엔드포인트는 민감한 것으로 간주되어 사용자가 읽어서는 안 되는 개체의 속성을 노출합니다. (previously named: "Excessive Data Exposure")
API 엔드포인트를 사용하면 사용자가 액세스할 수 없어야 하는 중요한 개체의 속성(previously named: "Mass Assignment")

공격 시나리오

Scenario #1

데이트 앱을 사용하면 사용자는 다른 사용자의 부적절한 행동을 신고할 수 있습니다. 이 흐름의 일부로 사용자가 "보고" 버튼을 클릭하면 다음 API 호출이 트리거됩니다.
POST /graphql { "operationName":"reportUser", "variables":{ "userId": 313, "reason":["offensive behavior"] }, "query":"mutation reportUser($userId: ID!, $reason: String!) { reportUser(userId: $userId, reason: $reason) { status message reportedUser { id fullName recentLocation } } } }
JavaScript
복사
API 엔드포인트는 인증된 사용자가 다른 사용자가 액세스해서는 안 되는 "fullName" 및 "recentLocation"과 같은 민감한(보고된) 사용자 개체 속성에 액세스할 수 있도록 허용하므로 취약합니다.

Scenario #2

온라인 마켓플레이스 플랫폼은 한 유형의 사용자(호스트)가 다른 유형의 사용자(게스트)에게 아파트를 임대할 수 있도록 제공하며, 게스트에게 숙박비를 청구하기 전에 호스트가 예약을 수락하도록 요구합니다.
이 흐름의 일부로서, 호스트는 POST /api/host/approve_booking에 다음과 같은 합법적인 페이로드를 사용하여 API 호출을 전송합니다.
{ "approved": true, "comment": "Check-in is after 3pm" }
JavaScript
복사
호스트가 합법적인 요청을 재생하고 다음 악의적인 페이로드를 추가합니다.
{ "approved": true, "comment": "Check-in is after 3pm", "total_stay_price": "$1,000,000" }
JavaScript
복사
호스트가 내부 개체 속성(total_stay_price)에 액세스할 수 있어야 한다는 검증이 없으므로 API 끝점이 취약하며 게스트에 대해 원래 설정된 값보다 더 많이 청구됩니다.

Scenario #3

짧은 동영상을 기반으로 하는 소셜 네트워크는 제한적인 콘텐츠 필터링과 검열을 시행합니다. 업로드된 동영상이 차단되더라도 사용자는 다음의 API 요청을 이용하여 동영상의 설명을 변경할 수 있습니다.
PUT /api/video/update_video { "description": "a funny video about cats" }
JavaScript
복사
사용자는 합법적인 요청을 재생하고 다음과 같은 악의적인 페이로드를 추가할 수 있습니다.
{ "description": "a funny video about cats", "blocked": false }
JavaScript
복사
API end-points는 사용자가 내부 개체 속성에 액세스할 수 있어야 하는 경우 유효성 검사가 없기 때문에 취약합니다. 사용자는 값을 true에서 false로 변경하고 자신의 차단된 콘텐츠를 잠금 해제할 수 있습니다.

예방 방법

API end-point를 사용하여 대체를 노출할 때 항상 사용자가 노출하는 개체의 속성에 액세스할 수 있어야 합니다.
to_json() 또는 to_string()같은 일반적인 메서드를 사용하지 말고, 구체적으로 반환하려는 특정 개체 속성을 지정하여 반환합니다.
가능하면 클라이언트의 입력을 코드 변서, 내부 개체 또는 개체속성(“Mass Assignment”)에 자동으로 바인딩 하는 기능은 사용을 지양합니다.
클라이언트에서 업데이트 해야 하는 개체속성에 대해서만 변경을 허용합니다.
스키마 기반 응답검증 메커니즘을 보안계층에 추가로 구현합니다. 이 메커니즘의 일부로 모든 API메서드에서 반환되는 데이터를 정의하고 적용합니다.
End-points의 비즈니스/기능 요구사항에 따라 반환되는 데이터 구조를 최소한으로 유지합니다.

References

OWASP

External