1. 정의
보안결정을 신뢰할 수 없는 입력 값에 의존 (Reliance on Untrusted Inputs in a Security Decision)
응용프로그램이 외부 입력값에 대한 신뢰를 전제로 보호메커니즘을 사용하는 경우 공격자가 입력값을 조작할 수 있다면 보호메커니즘을 우회할 수 있게 된다. 개발자들이 흔히 쿠키, 환경변수 또는 히든필드와 같은 입력값이 조작될 수 없다고 가정하지만 공격자는 다양한 방법을 통해 이러한 입력값들을 변경할 수 있고 조작된 내용은 탐지되지 않을 수 있다.
인증이나 인가와 같은 보안결정이 이런 입력값(쿠키, 환경변수, 히든필드 등)에 의해 수행되는 경우 공격자는 이런 입력값을 조작하여 응용프로그램의 보안을 우회할 수 있으므로 충분한 암호화, 무결성 체크를 수행하거나 이러한 메커니즘이 없는 경우 외부 사용자에 의한 입력값을 신뢰해서는 안 된다.
2. 해결방법
- 시스템의 상태정보와 중요한 정보는 서버에만 저장한다.
- 중요한 정보를 클라이언트 쪽에 저장할 경우, 암호화와 무결성 검사를 거친 데이터만 저장되도록 한다.
- 외부입력과 관련된 검사가 자바스크립트를 통해 브라우저에서 이루어지더라도 서버 측에서 재검사를 한다.
3. 예제
========================== 안전하지 않은 코드의 예 ==========================
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username==nill || password==null || !isAuthenticatedUser(usename, password))
{
throw new MyException("인증에러");
}
Cookie userCookie = new Cookie("user",username);
Cookie authCookie = new Cookie("authenticated","1");
response.addCookie(userCookie);
response.addCookie(authCookie);
%>
============================================================================
위의 예제는 평문으로 사용자의 인증정보 및 authenticated를 쿠키에 저장하고 있다. 공격자는 쿠키 정보를 변경 가능하기 때문에 중요한 정보를 쿠키에 저장할 때는 암호화해서 저장하고, 가급적 해당정보는 WAS(Web Application Server) 서버의 세션에 저장한다.
============================== 안전한 코드의 예 =============================
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username==nill || password==null || !isAuthenticatedUser(usename, password))
{
throw new MyException("인증에러");
}
// 사용자 정보를 세션에 저장한다.
HttpSession ses = new HttpSession(true);
ses.putValue("user",username);
ses.putValue("authenticated","1");
%>
============================================================================
위의 코드처럼 사용자의 인증정보를 세션에 저장한다.
'04. 시큐어코딩' 카테고리의 다른 글
시큐어코딩(28) - Missing Authentication for Critical Function (0) | 2017.12.01 |
---|---|
시큐어코딩(26) - SQL Injection: Hibernate (0) | 2017.11.23 |
시큐어코딩(25) - Download of Code Without Integrity Check (0) | 2017.11.23 |
시큐어코딩(24) - Unsafe Reflection (0) | 2017.11.23 |
시큐어코딩(23) - Process Control (0) | 2017.11.23 |