보안/행정자치부 JAVA Secure Coding Guide

Secure Coding

yebin0322 2025. 1. 22. 10:25
반응형

코딩가이드(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){...}

```

반응형