소프트웨어 개발보안 가이드 분석(2021) : 보안기능 결정에 사용되는 부적절한 입력값
응용프로그램이 외부 입력값에 대한 신뢰를 전제로 보호메커니즘을 사용하는 경우
공격자가 입력값을 조작할 수 있다면 보호메커니즘을 우회할 수 있게 된다.
인증이나 인가와 같은 보안결정이 이런 입력값(쿠키, 환경변수, 히든필드 등)에 기반해 수행되는 경우 공격자는 이런 입력값을 조작하여
응용프로그램의 보안을 우회할 수 있으므로 충분한 암호화, 무결성 체크를 수행하고 이와 같은 메커니즘이 없는 경우엔
외부사용자에 의한 입력값을 신뢰해서는 안된다.
소프트웨어 개발보안가이드(2021), 한국인터넷진흥원
보안기능 결정에 사용되는 부적절한 입력값이란?
부적절한 입력값이란, 주로 사용자, 외부 시스템 또는 데이터 소스로부터 들어오는 잘못된 형식 또는 악의적인 형태의 입력값을 의미합니다. 다시 말해 보안기능 결정에 사용되는 부적절한 입력값이란 소프트웨어에서 보안 기능을 결정할 때 사용되는 입력값 중에서, 유효하지 않거나 악의적인 값으로 인해 보안 결함이 발생할 수 있는 것을 의미합니다.
이번 포스팅에선 해당 취약점에 대하여 취약한 코드 예제와 이를 방지하기 위한 안전한 코드 작성 방법을 살펴보려고 합니다.
공격 메커니즘
- 서버는 사용자가 전달하는 쿠키, 환경변수, 히든필드를 충분히 검증하지 않을 경우 공격자는 사용자 권한, 사용자 역할을 나타내는 변수를 조작하여 서버에 침투할 수 있습니다.
- 위의 그림과 같이 기존 쿠키에서 사용자 역할은 user였지만 공격자에 의해 admin으로 변경되어 서버에게 요청을 하고 있습니다. 이러한 요청을 서버에서 검증하지 않는다면 공격자는 admin의 권한을 얻게 됩니다.
취약한 웹 애플리케이션의 예
1 <input type="hidden" name="price" value ="1000" />
<br/>품목 : HDTV
<br/>수량 : <input type ="hidden" name="quantity"/>개
<br/><input type="submit" value="구입" />
...
try {
2 price = request.getParameter("price");
quantity = request.getParameter("quantity");
total = Integer.parseInt(quantity) * Float.parseFloat(price);
}
- 1,2 : price를 hidden 필드로 정하여 웹브라우저에서 처리하고 있어, 공격자는 브라우저 개발자 도구와 같은 도구를 사용하여 가격 값을 손쉽게 변경할 수 있습니다.
- 결과적으로 수량과 같은 중요한 정보는 클라이언트 측이 아닌 서버 측에서 적절한 유효성 검사를 수행하여 데이터의 무결성을 보장해야 합니다.
시큐어코딩 적용 방법
try {
1 item = request.getParameter(“item”);
2 price = productService.getPrice(item);
quantity = request.getParameter("quantity");
total = Integer.parseInt(quantity) * price;
}
- 1 : price를 가져오는 것이 아닌 사용자가 선택한 item(구매 항목)을 가져옵니다.
- 2 : 서버에는 price와 item이 매칭되어 있는 getPrice 메서드를 통해 선택한 item에 대한 서버에 저장된 price를 가져옵니다.
- 결과적으로 price를 클라이언트에게 전달하지 않고, 서버에서 상품 정보를 기반으로 가격을 계산하고 처리합니다. 이렇게 함으로써 사용자가 가격을 조작하는 것을 방지하여 보안을 강화할 수 있습니다.