반응형
코딩가이드(Java)_V1.2(수정)-웹용.pdf
5.3 MB
Secure Coding
- 소프트웨어 개발 과정에서 개발자의 실수, 논리적 오류 등으로 인한 보안약점을 최소화하기 위한 개발 기법
- 해킹 등 사이버 공격의 원인인 보안취약점을 제거해 안전한 소프트웨어를 개발하는 소프트웨어 개발 기법
목표
- 성공적인 사업을 운영하기 위한 정보 자원의 기밀성, 무결성, 가용성을 유지하는 것
- 보안 통제 기능 구현
에러 처리
- 정상적인 에러 : 사전에 정의된 예외사항이 특정 조건에서 발생하는 에러
- 비정상적인 에러 : 사전에 정의되지 않은 상황에서 발생하는 에러
- 에러를 불충하게 처리하거나 처리하지 않을 때, 혹은 에러 정보에 과도하게 많은 정보를 포함하면 공격자가 악용하고 이로 인해 보안취약점이 발생할 수 있다.
1. Information exposure through an error message(오류 메세지를 통한 정보 노출)
정의
- 응용프로그램이 실행환경, 사용자, 관련 데이터에 대한 민감한 정보를 포함하는 오류 메세지를 생성하여 외부에 제공하는 경우 공격자의 악성 행위를 도와줄 수 있음
- 예외발생시 예외이름이나 스택트레이스를 출력하는 경우 프로그램 내부구조를 쉽게 파악할 수 있음
안전한 코딩 기법
- 오류 메세지는 정해진 사용자에게 유용한 최소한의 정보만 포함하도록 함
- 소스코드에서 예외상황은 내부적으로 처리하도록 함
- 민감한 정보를 포함하는 오류를 출력하지 않도록 설정
- 적절한 환경설정을 통해 에러 정보를 노출하지 않고, 미리 정의된 페이지를 제공하도록 설정(Error Page)
예제
- 에러 발생 시 무조건 에러 페이지로 강제 redirect
catch(NumberFormatException e){
RequestDispatcherdispatcher = request.getRequestDispatcher("data-error.jsp");
//에러발생 처리주소
dispatcher.forward(request, response); //에러주소 페이지 전환
}
## 2. Detection of Error Condition Without Action(오류 상황 대응 부재)
### 정의
- 오류가 발생할 수 있는 부분을 확인하였으나, 이러한 오류에 대하여 예외처리를 하지 않을 경우에는 프로그램이 충돌하거나 종료되는 등의 개발자가 의도하지 않은 결과가 발생할 수 있음
### 안전한 코딩 기법
- 예외 또는 오류를 포착(catch)한 경우 그것에 대한 적절한 예외 처리를 해야 함
- 예외를 포착(catch)한 후, 각각의 예외 사항(Exception) 발생 시 모든 자원들을 초기상태로 돌려 주는 것이 안전함
- catch문 안에서 print만 하면 안되고 Error 처리를 해야 함
- 예외 사항(Exception)발생 시 모든 자원들을 초기상태로 돌려주어야 함
## 3. Improper Check for Unusual or Exceptional Conditions(적절하지 않은 예외처리)
### 정의
- 프로그램 수행 중 함수의 결과 값에 대한 적절한 처리 또는 예외상황에 대한 조건을 적절하게 검사하지 않을 경우 예기치 않은 문제를 야기할 수 있음
### 안전한 코딩 기법
- 값을 반환하는 모든 함수의 결과 값을 검사하여 그 값이 기대한 값인지 검사
- 예외 처리를 사용하는 경우에 광범위한 예외 처리 대신 구체적인 예외처리를 진행
- 발생 가능한 모든 예외에 대한 구체적인 예외 처리 진행
- 각 실행 옵션들이 null값인지 먼저 검사한 후 null일 경우에 해야 할 프로세스를 미리 정의
### 예제
- filename에 대한 NULL을 조사
try{
...
if(fileName == NULL) throw new MyException("error");
}
- 각 실행 옵션들이 Null값인지 먼저 검사한 후 Null일 경우에 해야 할 프로세스를 미리 정의(아래 코드에서는 디폴트 값 강제 사용)
try{
BufferedReader in = new BufferedReader(new FileReader("config.cfg"));
configuration.option1 = in.readLine();
if(configuration.option1 == NULL) {
configuration.option1 = DEFAULT_OPTION1;
}
} catch(Exception e){
configuration.option1 = DEFAULT_OPTION1;
}
- DB로 데이터를 보내기 전 Null값인지의 여부를 먼저 체크
if((userId != NULL) && (password != NULL))
## 4. Weak Password Requirements(취약한 패스워드 요구조건)
### 정의
- 사용자에게 강한 패스워드를 요구하지 않으면 사용자 계정을 보호하기 힘듦
### 안전한 코딩 기법
- 패스워드 관련해서 강한 조건이 필요함
- 패스워드에 대한 복잡도 검증을 한 후 가입 승인 처리를 수행
### 예제
try{
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
//password에 대한 복잡도 검증
if(passwd == null || "".equals(passwd)){ //비밀번호가 제공되지 않았을 때 함수를 종료
return;
}
if(!passwd.matches("") && passwd.indexOf("@!#") > 4 && passwd.length() > 8 ){ //@!#가 비밀번호에 포함되어 있고, 그 위치가 4보다 큰지 확인, @!#가 5번째 문자 이후에 있는지 확인, 비밀번호의 길이가 8보다 긴지 확인
//password 복잡도 검증 후 가입 승인 처리
}
}
catch(SQLException e){...}
catch(NamingException e){...}
```
반응형