[취약점] CWE-915 API 대량 할당(API Mass Assignment) 해결하기

dev_Shawn·2023년 3월 29일
0

troubleshooting

목록 보기
11/11

사내 프로젝트를 운영에 반영하기 전 검증 서버에서 취약점을 스캔했더니 API 대량 할당 취약점이 무더기로 쏟아져 나왔습니다.

이 취약점에 대한 정보와 해결 방법을 공유하기 위해 포스팅을 작성합니다!

명칭

이 취약점에 대해 알아보기 위해 구글링 중 웹 프레임워크 마다 이 취약점을 칭하는 이름이 다른 것을 알 수 있었습니다.

  • Ruby On Rails : Mass Assignment
  • Spring, ASP.NET : Auto Binding
  • PHP : Objet Injection

Common Weakness Enumeration(CWE)라는 취약성이 발생하는 원인이 될 수 있는 상태를 열거한 리스트에도 등록되어 있어, 각 프레임워크 혹은 언어마다 다른 이름보다는 CWE-915가 가장 정확할 것 같습니다.

원인

이 취약점은 외부에서 들어온 데이터를 서버 내부에서 동적으로 처리하여 그 데이터에 의해 서버에 장애가 발생하거나 내부 정보가 유출 될 우려가 있을 때 검출 됩니다.
즉, 외부에서 들어온 데이터를 처리하고 사용하는 과정에서 데이터가 검증되지 않아서 검출 된 것이지요.

외부에서 입력받는 데이터 의해 서버가 조작되거나 내부 정보가 유출 되는 등의 사고가 발생할 수 있습니다.
따라서 외부에서 들어온 값은 서버에서 사용 전 반드시 데이터를 검증하는 로직을 거쳐야합니다.

chatGPT에게 물어본 결과도 크게 다르지 않습니다.

CWE-915는 "동적으로 결정된 개체 속성의 부적절하게 제어된 수정"에 대한 공통 약점 열거(CWE) 식별자입니다. 이 취약성은 공격자가 동적으로 결정된 개체의 특성을 예기치 않은 방식으로 수정할 수 있도록 허용하는 경우에 발생합니다.
예를 들어, 응용 프로그램이 사용자 입력에 따라 업로드할 파일의 이름을 동적으로 결정한다고 가정합니다. 응용 프로그램이 사용자 입력의 유효성을 제대로 검사하고 악의적인 입력을 방지하지 않으면 공격자는 파일 이름을 수정하여 악성 코드를 포함하거나 서버의 중요한 파일에 액세스할 수 있습니다.
이 취약성으로 인해 원격 코드 실행, 임의 파일 액세스 및 권한 상승과 같은 다양한 보안 문제가 발생할 수 있습니다. 개발자는 이러한 공격을 방지하기 위해 적절한 입력 유효성 검사 및 검사 기술을 구현하는 것이 중요합니다.

조치 방법

외부에서 들어온 데이터를 서버에서 사용 전에 올바른 값인지 검증해야 합니다.

예를 들면 SpringBoot에서 @Valid를 사용하여 payload에서 객체로 변환 시 값을 검증하거나, AOP를 이용하여 모든 payload의 값에 특정 문자 등이 없는지를 확인하는 방법으로 조치할 수 있습니다.

저의 경우는 위 방법은 아니지만 컨트롤러 단에서 값 검증 로직이 있는데도 해당 취약점이 검출 되었는데, 그 이유는 필드 때문이었습니다.
예를 들어 name과 age 필드를 받는 서버의 엔드포인트로 name, age, height 필드를 전달했는데, 200 OK 응답이 리턴되어 취약점으로 간주한 것이지요.

(개인적인 생각에 추가로 들어온 필드는 어차피 서버에서 사용하지 않으니 괜찮은게 아닐까 싶기는 하지만.. 취약점 스캔 툴에서는 200 응답을 받으면 안되는 것이 조건이었던 것 같습니다.)

SpringBoot에서 선언되지 않은 필드에 대한 검증은 ObjectMapper의 FAIL_ON_UNKNOWN_PROPERTIES 옵션을 true로 설정하여 수행할 수 있습니다.
application.properties에 아래 내용을 추가해주세요.

spring.jackson.deserialization.fail-on-unknown-properties=true

컨트롤러에서 @RequestBody 어노테이션으로 payload를 객체로 받을 때 Spring 내부에서는 ObjectMapper가 이 변환 작업을 수행하는데, 이 옵션이 true이면 변환 작업 시 선언되지 않은 필드에 대해서는 Exception이 발생합니다.

SpringBoot에 기본으로 탑재되어 있는 ObjectMapper의 경우 선언되지 않은 필드에 대해서도 유연하게 처리하도록 Spring Boot Auto Configuration에서 이 옵션이 False로 설정되어 있습니다.

마무리

필드 자체에 대한 검증은 값에 대한 검증에 비해 상대적으로 덜 알려진 것 같습니다. 관련 내용의 양 역시 상당히 차이가 많이 나구요.

그래도 덕분에 ObjectMapper에 대해 공부해보며 원인을 정확히 파악하고 비교적 간편하게 취약점을 해결할 수 있었습니다.
더 깊이 들어가 FAIL_ON_UNKNOWN_PROPERTIES 옵션에 대한 ObjectMapper와 Spring의 사상 차이까지 알아 볼 수 있어 유익하기까지 했네요!

이 옵션에 대한 두 진영의 사상 차이에 대해 궁금하신 분은 이 포스팅을 확인해보시면 도움이 되실 것 같습니다.


출처

profile
안주는 술 마실 때나

0개의 댓글