본문 바로가기
04. 시큐어코딩

시큐어코딩(27) - Reliance on Untrusted Inputs in a Security Decision

by 김덕환 2017. 11. 24.
반응형

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");

%>


============================================================================



위의 코드처럼 사용자의 인증정보를 세션에 저장한다.

반응형