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