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

소스코드 보안약점 진단 - 취약한 비밀번호 허용

H.J.World 2022. 1. 14. 10:10
728x90
반응형

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

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

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

 

제2절 보안기능

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현시 발생할 수 있는 보안 약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.


11. 취약한 비밀번호 허용

가. 개요

사용자에게 강한 패스워드 조합규칙을 요구하지 않으면, 사용자 계정이 취약하게 된다. 안전한 패스 워드를 생성하기 위해서는 한국인터넷진흥원 「암호이용안내서」의 패스워드 설정규칙을 적용해야 한다.

나. 보안대책

패스워드 생성시 강한 조건 검증을 수행한다. 비밀번호(패스워드)는 숫자와 영문자, 특수문자 등을 혼합하여 사용하고, 주기적으로 변경하여 사용하도록 해야 한다.

다. 코드예제

가입자가 입력한 패스워드에 대한 복잡도 검증 없이 가입 승인 처리를 수행하고 있다.

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

1: String id = request.getParameter("id");
2: String pass = request.getParameter("pass");
3: UserVo userVO = new UserVo(id, pass);
4: ……
// 비밀번호의 자릿수, 특수문자 포함 여부 등 복잡도를 체크하지 않고 등록
5: String result = registerDAO.register(userVO);

 

- 안전한 코드의 예 JAVA -

사용자 계정을 보호하기 위해 가입 시, 패스워드 복잡도 검증 후 가입 승인처리를 수행한다.

1: String id = request.getParameter("id");
2: String pass = request.getParameter("pass");
//비밀번호에 자릿수, 특수문자 포함여부등의 복잡도를 체크하고 등록하게 한다.
3: Pattern pattern = Pattern.compile("((?=.*[a-zA-Z])(?=.*[0-9@#$%]). {9, })");
4: Matcher matcher = pattern.matcher(pass);
5: if (!matcher.matches()) {
6: return "비밀번호 조합규칙 오류";
7: }
8: UserVo userVO = new UserVo(id, pass);
9: ……
10: String result = registerDAO.register(userVO);

 

라. 진단방법

패스워드 생성 또는 변경 때 입력값을 다음과 같은 규칙으로 검사하는 모듈이 존재하는지 확인한다.

 ## 안전한 패스워드 조합규칙

- 영문자(대․소 구별), 숫자, 특수문자 조합하여, 패스워드 길이는 9자리 이상

- 특정패턴 및 사용자 ID 사용 금지

 

- 정탐코드의 예 -

다음의 예제와 같이 사용자 계정 등록 등 비밀번호를 필요로 하는 정보 입력에서 널(Null) 체크, 비밀 번호의 자릿수, 특수문자 포함 등 비밀번호 요구조건이 없거나 약할 경우 취약하다.

1: <%
2: String id = request.getParameter(“id”);
3: String pass = request.getParameter(“pass”);
4: UserVo userVO = new UserVo(id,pass);
5: …….
6: // 사용자를 등록한다.
7: String result = registDAO.regist(userVO);
8: ………

 

- 정탐코드의 예 -

다음의 예제와 같이 가입자가 입력한 패스워드에 대한 복잡도 검증 없이 가입 승인 처리를 수행하게 되면 사용자 계정을 보호하기 힘들다.

1: …
2: public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws
IOException, ServletException {
3: try {
4: String id = request.getParameter(“id”);
5: String passwd = request.getParameter(“passwd”);
6: // 패스워드 복잡도 검증 없이 가입 승인 처리
7: ….
8: } catch (SQLException e) { … }
9: }

 

- 오탐코드의 예 -

다음의 예제와 같이 패스워드 저장을 위한 목적이 아닌 확인의 목적일 경우 취약하지 않다고 판정 한다.

1: fis = new FileInputStream(PROPERTIES_FILE);
2: props.load(new java.io.BufferedInputStream(fis));
3: userName = (String)props.getProperty(“id”);
4: password = (String)props.getProperty(“password”);
5: if (authenticate(userName, password)) { … }

 

728x90
반응형