스프링 MVC 는 자동으로 “@RequestMapping” 으로 어노테이션이 달린 메소드의 요청 파라미터들을 빈으로 바인딩합니다.
이러한 자동 바인딩 기능때문에, “@RequestMapping” 으로 어노테이션된 메소드의 인자들에 예상치못한 필드들을 주입하게 될 수 있습니다.
영속 개체들(“@Entity” 혹은 “@Document”)은 데이터베이스들과 연결되고, Hibernate, JPA 또는 Spring Data MongoDB 과 같은 영속 프레임워크를 통해 자동적으로 갱신됩니다.
이러한 두 가지 요소들이 결합되어 악의적인 공격이 가능합니다: 만약 영속 개체가 “@RequestMapping” 으로 어노테이션된 메소드의 인자로 사용된다면, 특별하게 조작된 사용자의 인풋이 데이터베이스의 예상하지 못한 필드를 업데이트 하는 것이 가능합니다.
이러한 이유에서 “@Entity” 혹은 “@Document” 객체들은 “@RequestMapping” 으로 어노테이션된 메소드의 인자로 사용되는 것을 피해야 합니다.
이 룰은 “@RequestMapping” 외에도 Spring Framework 4.3에 도입된 “@GetMapping”, “@PostMapping”, “@PutMapping”, “@DeleteMapping”, “@PatchMapping”도 고려합니다.
규칙을 어긴 코드
import javax.persistence.Entity;
@Entity
public class Wish {
Long productId;
Long quantity;
Client client;
}
@Entity
public class Client {
String clientId;
String name;
String password;
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WishListController {
@PostMapping(path = "/saveForLater")
public String saveForLater(Wish wish) {
session.save(wish);
}
@RequestMapping(path = "/saveForLater", method = RequestMethod.POST)
public String saveForLater(Wish wish) {
session.save(wish);
}
}
규칙을 준수한 해결책
public class WishDTO {
Long productId;
Long quantity;
Long clientId;
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PurchaseOrderController {
@PostMapping(path = "/saveForLater")
public String saveForLater(WishDTO wish) {
Wish persistentWish = new Wish();
// "wish" 와 "persistentWish" 을 매핑합니다.
[...]
session.save(persistentWish);
}
@RequestMapping(path = "/saveForLater", method = RequestMethod.POST)
public String saveForLater(WishDTO wish) {
Wish persistentWish = new Wish();
// "wish" 와 "persistentWish" 을 매핑합니다.
[...]
session.save(persistentWish);
}
}
예외
스프링 프레임워크의 “@PathVariable” 를 통해 매개 변수에 주석을 달 때는 문제가 보고되지 않았습니다. ID를 통해 조회가 수행되므로 클라이언트 측에서 개체를 위조할 수 없습니다.
참고
- OWASP Top 10 2021 Category A8 - Software and Data Integrity Failures
- OWASP Top 10 2017 Category A5 - Broken Access Control
- MITRE, CWE-915 - Improperly Controlled Modification of Dynamically-Determined Object Attributes
- Two Security Vulnerabilities in the Spring Framework’s MVC by Ryan Berg and Dinis Cruz
If you like SONARKUBE, don’t forget to give me a star.