보안 공부/소스코드 보안약점 진단

소스코드 보안약점 진단 - 보안기능 결정에 사용되는 부적절한 입력값

H.J.World 2021. 12. 28. 10:10
728x90
반응형

소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.

SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.

해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.


13. 보안기능 결정에 사용되는 부적절한 입력값

가. 개요

응용프로그램이 외부입력값에 대한 신뢰를 전제로 보호메커니즘을 사용하는 경우 공격자가 입력값 을 조작할 수 있다면 보호메커니즘을 우회할 수 있게 된다.

개발자들이 흔히 쿠키, 환경변수 또는 히든필드와 같은 입력값이 조작될 수 없다고 가정하지만 공격 자는 다양한 방법을 통해 이러한 입력값들을 변경할 수 있고 조작된 내용은 탐지되지 않을 수 있다. 인증이나 인가와 같은 보안결정이 이런 입력값(쿠키, 환경변수, 히든필드 등)에 기반해 수행되는 경우 공격자는 이런 입력값을 조작하여 응용프로그램의 보안을 우회할 수 있으므로 충분한 암호화, 무결성 체크를 수행하고 이와 같은 메커니즘이 없는 경우엔 외부사용자에 의한 입력값을 신뢰 해서는 안된다.

나. 보안대책

상태정보나 민감한 데이터 특히 사용자 세션정보와 같은 중요한 정보는 서버에 저장하고 보안확인 절차도 서버에서 실행한다. 보안설계관점에서 신뢰할 수 없는 입력값이 응용프로그램 내부로 들어올 수 있는 지점과 보안결정에 사용되는 입력값을 식별하고 제공되는 입력값에 의존할 필요가 없는 구조 로 변경할 수 있는지 검토한다.

다. 코드예제

구입품목의 가격을 사용자 웹브라우저에서 처리하고 있어 이 값이 사용자에 의해 변경되는 경우 가격 (단가)정보가 의도하지 않은 값으로 할당될 수 있다.

- 안전하지 않은 코드의 예 JAVA -

1: <input type="hidden" name="price" value="1000"/>
2: <br/>품목 : HDTV
3: <br/>수량 : <input type="hidden" name="quantity" />개
4: <br/><input type="submit" value="구입" />
5: ......
6: try {
// 서버가 보유하고 있는 가격(단가) 정보를 사용자 화면에서 받아서 처리
7: price = request.getParameter("price");
8: quantity = request.getParameter("quantity");
9: total = Integer.parseInt(quantity) * Float.parseFloat(price);
10: } catch (Exception e) {
11: ......

 

- 안전한 코드의 예 JAVA -

사용자 권한, 인증 여부 등 보안결정에 사용하는 값은 사용자 입력값을 사용하지 않고 서버 내부의 값을 활용한다. 또한 사용자 입력에 의존해야하는 값을 제외하고는 반드시 서버가 보유하고 있는 정보를 이용하여 처리한다

1: <input type="hidden" name="price" value="1000"/>
2: <br/>품목 : HDTV
3: <br/>수량 : <input type="hidden" name="quantity" />개
4: <br/><input type="submit" value="구입" />
5: ......
6: try {
7: item = request.getParameter(“item”);
// 가격이 아니라 item 항목을 가져와서 서버가 보유하고 있는 가격 정보를
// 이용하여 전체 가격을 계산
8: price = productService.getPrice(item);
9: quantity = request.getParameter("quantity");
10: total = Integer.parseInt(quantity) * price;
11: } catch (Exception e) {
12: ......
13: }
14: ......

 

라. 진단방법

인증여부를 확인하기 위해 사용하는 변수를 확인하고(①), 변수가 세션정보 등 서버내부에서 검증된 값인지 확인한다(②). 인증결정의 기준으로 외부 입력값을 그대로 사용하는 경우 취약하다.

1: …
2: Cookie[] cookies = request.getCookies() ;------------------------②
3: for(int i=0 ; i<cookies.length ; i++) {
4: Cookie c = cookies[i] ;
5: if(c.getName().equals(“authecticated”)&&Boolean.TRUE.equals(c.getValue())){ -①
6: authenticated = true ;
7: }
8: }
9: …

 

- 정탐코드의 예 -

다음의 예제에서는 평문으로 사용자의 인증정보 및 “authenticated”를 쿠키에 저장하고 있다. 공격 자는 쿠키정보를 변경 가능하기 때문에 중요한 정보를 쿠키에 저장 시에는 암호화해서 사용하고, 가급적 해당정보는 WAS(Web Application Server) 서버의 세션에 저장한다.

10: <%
11: String username = request.getParameter(“username”);
12: String password = request.getParameter(“password”);
13: if (username==nill || password==null || !isAuthenticatedUser(usename, password)) {
14: throw new MyException(“인증 에러”);
15: }
16: Cookie userCookie = new Cookie(“user”,username); 
17:Cookie authCookie =new Cookie(“authenticated”,”1”); 
18:
19: response.addCookie(userCookie);
20: response.addCookie(authCookie);
21: %>

 

- 오탐코드의 예 -

다음의 예제에서는 HIDDEN 필드로 전송된 price를 가격으로 사용하지 않고 8번 라인에서 정해진 가격을 사용하고 있어 취약하지 않다.

1: <input type=”hidden” name=”price” value=”1000”/>
2: <br/>품목 : HDTV
3: <br/>수량 : <input type=”hidden” name=”quantity” />개
4: <br/><input type=”submit” value=”구입” />
5: ......
6: try {
7: // 서버가 보유하고 있는 정보를 이용하여 가격을 처리
8: price = 1000;
9: quantity = request.getParameter(“quantity”);
10: total = quantity * Float.parseFloat(price);
11: } catch (Exception e) {
12: ......
13: }
14: ......

 

728x90
반응형