[정보처리기사 실기] Ⅸ. 소프트웨어 개발 보안 구축 - 소프트웨어 개발 보안 구현

Ⅸ. 소프트웨어 개발 보안 구축 - 소프트웨어 개발 보안 구현.


1. SW 개발 보안 구현

1.1. 시큐어 코딩 가이드

  • 설계 및 구현 단계에서 해킹 등의 공격을 유발할 가능성이 있는 잠재적인 보안취약점을 사전에 제거하고, 외부 공격으로부터 안전한 소프트웨어를 개발하는 기법.
  • 시큐어 코딩 가이드 적용 대상 ( Tip. 입보시 에코캡아 )
    • 력데이터 검증 및 표현
      • 내용 : 프로그램 입력값에 대한 검증 누락∙부적절한 검증, 잘못된 형식 지정.
      • 대응방안 : 사용자∙프로그램 입력데이터에 대한 유효성 검증체계를 수립하고 실패시 처리 설계 및 구현.
    • 안 기능
      • 내용 : 보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)의 부적절한 구현.
      • 대응방안 : 인증∙접근통제, 권한 관리, 비밀번호 등의 정책이 적절하게 반영되도록 설계 및 구현.
    • 간 및 상태
      • 내용 : 거의 동시에 수행 지원하는 병렬 시스템 또는 하나 이상의 프로세스가 동작하는 환경에서 시간 및 상태의 부적절한 관리.
      • 대응방안 : 공유자원의 접근 직렬화, 병령 실행 가능 프레임워크 사용, 블록문 내에서만 재귀함수 호출.
    • 러 처리
      • 내용 : 에러 미처리, 불충분한 처리 등으로 에러 메시지에 중요정보가 포함.
      • 대응방안 : 에러 또는 오류 상황을 처리하지 않거나, 불충분하게 처리되어 중요정보 유출등 보안 약점이 발생하지 않도록 시스템 설계 및 구현.
    • 드 오류
      • 내용 : 개발자가 범할 수 있는 코딩 오류로 인해 유발.
      • 대응방안 : 코딩 규칙 도출 후 검증 가능한 스크립트 구성과 경고 순위의 최상향 조정 후 경고 메시지 코드 제거.
    • 슐화
      • 내용 : 기능성이 불충분한 캡슐화로 인해 인가되지 않은 사용자에게 데이터 누출.
      • 대응방안 : 디버그 코드 제거와 필수 정보 외의 클래스 내 프라이빗(Private) 접근자 지정.
    • API 오용
      • 내용 : 의도된 사용에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API의 사용.
      • 대응방안 : 개발 언어별 취약 API 확보 및 취약 API 검출 프로그램 사용.


1.2. 입력 데이터 검증 및 표현

  • 프로그램 입력값에 대한 검증 누락, 부적절한 검증, 데이터의 잘못된 형식 지정 등으로 발생하는 보안 약점.
  • 대표적으로 SQL 삽입(Injection), 크로스 사이트 스크립트(XSS) 등의 공격을 유발 할 수 있다.
  • 주요 공격별 보안 약점 및 대응 방안
    • SQL 삽입(Injection)
      • 보안약점 : 사용자의 입력값 등 외부 입력값이 SQL 쿼리에 삽입되어 공격.
      • 대응방안 : PreparedStatement 객체 등을 이용, DB에 컴파일된 쿼리문(상수)을 전달.
    • 크로스 사이트 스크립트(XSS)
      • 보안약점 : 검증되지 않은 외부 입력값에 의해 브라우저에서 악의적인 코드가 실행.
      • 대응방안 : 입∙출력값에 문자열 치환 함수를 사용 / 치환대상 : & < > “ ‘ / ( ) 등.
    • 경로 조작 및 자원 삽입
      • 보안약점 : 외부 입력된 값의 사전 검증이 없거나 잘못 처리될 경우 / 제공되는 시스템 자원에 접근 경로 등의 정보로 이용될 때 발생.
      • 대응방안 : 경로 순회 공격 위험이 있는 문자 ( “ / \ … )를 제거하는 필터 사용.
    • 운영체제 명령어 삽입
      • 보안약점 : 운영체제 명령어 파라미터 입력값이 적절한 사전 검증을 거치지 않고 사용될때 공격자가 운영체제 명령어를 조작.
      • 대응방안 : 웹 인터페이스를 통해 내부로 시스템 명령어를 전달하지 않도록 프로그램 구성.

1.2.1 SQL 삽입(Injection) 공격

  • SQL 삽입 공격의 개념
    • 웹 애플리케이션에서 입력데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 창 및 URL에 SQL 문을 삽입하여 DB로부터 정보를 열람∙조작할 수 있는 취약점 공격 기법.
    • ex. 비밀번호 필드에 ❛ XX’ OR 1=1 – ❜ 입력시 ❛ select * from user where id=’aaa’ and password = ‘XX’ OR 1=1 –’ ❜ 가 실행되어 성공 처리.
  • SQL 삽입 공격의 시큐어 코딩 구현
    • 매개변수를 받는 PreparedStatement 객체를 상수 문자열로 생성하고 파라미터 부분을 setString 등의 메서드로 설정하여 외부의 입력이 쿼리문의 구조를 바꾸는 것을 방지.
# 조치 
String category = request.getParameter("category");
...
String sql = "SELECT * FROM board WHERE b_category=" + category + ""; 
Connection con = db.getConnection();
Statement stmt = con.createStatement(); 
ResultSet rs = stmt.excuteQuery(sql); 
 : 외부로부터 입력받은 값을 검증 없이 사용할 경우 안전하지 않음
 : 외부로부터 입력받은 값이 처리 없이 쿼리로 수행되어 안전하지 않음


# 조치 
String category = request.getParameter("category");
...
String sql = "SELECT * FROM board WHERE b_category= ?"; 
Connection con = db.getConnection();
PreparedStatement pstmt = con.prepareStatement(sql); 
pstmt.setString(1 category);  
ResultSet rs = pstmt.executeQuery();  
  : 외부로부터 입력받은 값은 안전하지 않을  있어 PreparedStatement 사용을 위해 ? 문자로 바인딩 변수를 사용.
  : PreparedStatement를 사용.
  : PreparedStatement 객체를 상수 문자열로 생성하고 파라미터 부분을 setString 메서드로 설정하여 안전.

1.2.2 크로스 사이트 스크립트(XSS) 공격

  • XSS 공격의 개념
    • 웹 페이지에 악의적인 스크립트를 포함해 사용자 측에서 실행되게 유도할 수 있는 공격 기법.
    • 공격방법 : Reflected XSS, Stored XSS, DOM XSS
    1. 공격자가 악성 스크립트 파일을 웹서버에 설치.
    2. 클라이언트에서 악성 스크립트가 설치되어 있는 웹 브라우저 실행.
    3. 웹 서버의 악성 스크립트 실행되어 클라이언트(사용자) 감영, 감염 후 개인정보등 공격자에게 유출.
  • XSS 공격의 시큐어 코딩 구현
    • 외부 입∙출력값에 스크립트가 삽입되지 못하도록 & < > “ ‘ / ( ) 등에 대해 문자열 치환 함수를 구현한다.
# 조치 
<%  String keyword = request.getParameter("keyword"); %> 
검색결과 : ${m.content} 
<script type="text/javascript">
document.write("keyword:" + <%=keyword%>);  
</script>
 : 외부 입력값을 검증 없이 화면에 출력될 경우 공격 스크립트가 포함된 URL을 생성할  있어 안전하지 않음(Reflected XSS)
 : 게시판의 입력 form을 통해 외부 값이 DB에 저장하고 검증 없이 화면에 출력시 공격스크립트가 실행되어 안전하지 않음(Stored XSS)
 : 서버를 거치지 않는 공격스크립트가 포함된 URL을 생성할  있어 안전하지 않음(DOM 기반 XSS)


# 조치 
<%  
  String keyword = request.getParameter("keyword");  
  keyword = keyword.replaceAll("&", "&amp;");  
  keyword = keyword.replaceAll("<", "&lt;");   
  keyword = keyword.replaceAll(">", "&gt;");   
%>
...
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
검색결과 : <c:out value="${m.content}" />  
<script type="text/javascript">
document.write("keyword: <%=Encoder.encodeForJS(Encoder.encodeForHTML(keyword)) %> ");  
</script>
 : 입력값에 대하여 스크립트 공격 가능성이 있는 문자열을 치환.
 : JSP에서 출력값에 JSTL의 <c:out> 사용하여 처리.
 :  만들어진 외부 라이브러리를 활용 (NAVER XSS Filter, OWASP ESAPI, OWASP Java Encoder)


1.3. 보안 기능

  • 보안기능(인증, 권한관리, 암호화, 중요정보처리)을 부적절하게 구현시 발생할 수 있는 보안 약점이다.
  • 대표적으로 적절한 인증없는 중요기능 허용, 부적절한 인가 등.

1.3.1. 인증 관련 보안 취약점 유형

  • 적절한 인증 없는 중요기능을 허용
    • 보안 약점 : 적절한 인증과정 없이 중요정보 등을 열람, 변경 시 발생하는 보안 약점.
    • 대응 방안 : 업무상 중요정보 혹은 기능 제공 시에 인증 기능을 구현.
  • 반복된 인증시도 제한 기능 부재
    • 보안 약점 : 인증시도 반복횟수 제한없이 사용하는 시스템 대상 / 예상되는 아이디∙패스워드 목록을 만들고, 무차별공격하여 로그인이 가능한 보안 약점.
    • 대응 방안 : 인증시도 횟수를 제한 / 인증횟수 초과 시 계정 잠금 혹은 추가인증 요구.
  • 취약 패스워드 허용
    • 보안 약점 : 보안성이 높지 않은 비밀번호의 설정을 허용 / 무작위 대입 공격에 취약한 보안 약점.
    • 대응 방안 : 숫자∙영문 등 혼합시 최소 10자이상 요구 / 숫자∙영문∙특수문자 등 혼합시 최소 8자 이상 요구 / 변경주기 설정(최소6개월)

✱ 무차별공격(Brute Force Attack) : 특정 패스워드를 풀기 위해 임의의 문자 조합을 하나씩 대입해 보는 공격 기법 / 반복된 인증시도 제한이 없을때 취약.

1.3.2. 권한 관리 보안 약점 유형

  • 중요자원에 대한 잘못된 권한 설명
    • 보안 약점 : 중요자원에 대해 읽기, 수정 권한을 의도하지 않게 허가하는 경우 / 권한이 없는 사용자가 접근 가능함.
    • 대응 방안 : 중요파일에 대해 관리자만 읽고 쓰기가 가능하도록 최소 권한 설정.
  • 부적절한 인가
    • 보안 약점 : 사용자에 대한 접근 권한 검사 미흡 / 권한 외 오동작 유발 가능성 존재.
    • 대응 방안 : 프로그램 접근 권한 여부에 대해 사용자 권한 점검.

1.3.3. 암호화 보안약점 유형

  • 취약 암호화 알고리즘 사용
    • 보안 약점 : 비표준 알고리즘을 사용할 경우 / 컴퓨터 연산능력 향상으로 해독 가능한 알고리즘 사용 / 암호화 알고리즘의 무력화 가능한 취약점.
    • 대응 방안 : 표준화된 알고리즘 사용 (AES, ARIA, SEED 등)
  • 충분하지 않은 키 길이 사용
    • 보안 약점 : 키 길이가 불충분한 경우 공격자가 짧은 시간안에 키 발견 가능 / 암호화된 데이터 복호화 가능한 취약점.
    • 대응 방안 : 충분한 키 길이 확보 / RSA : 2048비트 이상 / 대칭암호화 : 128비트 이상.
  • 하드코딩된 비밀번호
    • 보안 약점 : 코드 내부 하드코딩된 패스워드 사용 / 관리자 정보가 노출 가능한 취약점.
    • 대응 방안 : 패스워드는 별도로 파일에 암호화 저장 / 최초 로그인 시 직접 패스워드 입력받도록 설계.
  • 부적절한 난수 사용
    • 보안 약점 : 예측 가능한 난수를 사용할 경우 / SW의 다음 숫자를 유추하여 시스템 공격 가능한 취약점.
    • 대응 방안 : 난수를 발생시키는 시드값의 고정값 대신 변경 값 적용.
  • 솔트없는 일방향 해시 함수 사용
    • 보안 약점 : 솔트없는 해시 처리시 레인보우 테이블을 이용해 비밀번호를 쉽게 찾을 수 있는 취약점.
    • 대응 방안 : 패스워드 저장 시 패스워드와 솔트 결합.

✱ 솔트(Salt) : 일방향 해시 함수에서 다이제스트를 생성할 때 추가되는 바이트 단위의 임의의 문자열.

1.3.4. 중요정보 처리시 보안 약점 유형

  • 중요정보 평문 저장
    • 보안 약점 : 개인정보, 인증정보 등 중요정보를 처리하는 과정에서 평문 저장 / 공격자에게 민감 정보가 노출되는 보안 약점.
    • 대응 방안 : 정보보호 관점에서 중요 기밀정보 저장 시 반드시 암호화 처리.
  • 중요정보 평문 전송
    • 보안 약점 : 중요정보를 평문으로 송∙수신할 경우 발생 / 통신 채널을 스니핑을 통해 민감 데이터 노출.
    • 대응 방안 : 내∙외부 통신시 SSL 인증서 기반의 전송구간 암호화 적용.

✱ 스니핑(Sniffing) : 공격대상에게 직접 공격을 하지 않고 데이터만 몰래 들여다보는 수동적 공격기법.


1.4. 시간 및 상태

1.4.1. 시간 및 상태 보안 약점의 개념

  • 동시 수행을 지원하는 병렬 시스템이나 하나 이상의 프로세스가 동작하는 환경에서 시간 및 상태를 부적절하게 관리하여 발생할 수 있는 취약점.

1.4.2. 시간 및 상태 보안 약점의 유형

  • 경쟁조건
    • 동일 자원에 대한 검사 시점과 사용 시점이 상이 / 동기화오류, 교착상태를 유발하는 보안 약점.
    • 대응 방안 : 동기화 구문(synchronized), mutex 사용.
  • 종료되지 않은 반복문(for,while) 또는 재귀함수
    • 종료 조건이 없는 재귀함수나 종료되지 않는 반복문(for, while) 사용 / 무한루프에 빠져 자원고갈 유발하는 보안 약점.
    • 대응 방안 : 재귀함수 - 종료조건 정의 / 반복문 - 흐름 검증 수행.

1.4.3. 시간 및 상태 보안 약점의 시큐어 코딩 구현

  • 경쟁 조건의 시큐어 코딩 구현
# 조치 
public void run) {  
    ...
} 
public static void main(String[] args){
    FileMgmtThread fileAccessThread = new FileMgmtThread("READ");
    FileMgmtThread fileDeleteThread = new FileMgmtThread("DELETE");
    fileAccessThread.start();
    fileDeleteThread.start();
}
 : 멀티 스레드 환경에서 공유자원에 여러 프로세스가 사용하여 파일의 읽기와 삭제가 동시에 수행되어 안전하지 않음


# 조치 
public void run) {  
    synchronized(SYNC) { 
    ...
} 
public static void main(String[] args){
    FileMgmtThread fileAccessThread = new FileMgmtThread("READ");
    FileMgmtThread fileDeleteThread = new FileMgmtThread("DELETE");
    fileAccessThread.start();
    fileDeleteThread.start();
}
 : 멀티 스레드 환경에서 synchronized를 사용하여 동시에 접근할  없음

  • 종료되지 않은 재귀함수의 시큐어 코딩 구현
# 조치 
int factorial(int i){
    return i*factorial(i-1);  
}
 : 재귀함수 탈출 조건을 설정하지 않아 무한 루프가 


# 조치 
int factorial(int i){
    if( i <= 1 ){
        return 1;
    }  
    return i*factorial(i-1);
}
 : 재귀함수 사용 시에는 탈출조건을 사용


1.5. 에러 처리

1.5.1. 에러 처리 보안 약점의 개념

  • 에러를 처리하지 않거나 불충분하게 처리하여 에러 정보에 중요정보(시스템 내부정보 등)가 포함될 때 발생 할 수 있는 보안 약점.

1.5.2. 에러처리 보안 약점의 유형

  • 오류 메시지 정보 노출
    • 응용프로그램의 민감 정보가 오류 메시지를 통해 노출되는 보안 약점
    • 대응 방안 : 오류 메시지는 정해진 사용자에게 유용한 최소한의 정보만 포함
  • 오류 상황 대응 부재
    • 오류 발생 부분에 예외처리 미구현
    • 대응 방안 : C/C++ > if, switch문 사용 / Java > try-catch문 사용
  • 부적절한 예외 처리
    • 프로그램 수행중 발생한 예외 조건을 적절하게 검사하지 않아 문제 야기
    • 대응 방안 : 함수 결과값의 적정성 검증 / 구체적인 예외 처리 수행

1.5.3. 에러처리 보안 약점의 시큐어 코딩 구현

  • 오류 메시지 정보 노출의 시큐어 코딩 구현
# 조치 
try{
    rd = new BufferedReader(new FileReader(new File(filename)));
}catch(IOException e){
    e.printStackTrace(); 
}
 : 에러 메시지를 통해 스택 정보가 노출 

# 조치 
try{
    rd = new BufferedReader(new FileReader(new File(filename)));
}catch(IOException e){
    logger.error("ERROR-01 : 파일 열기 에러"); 
}
 : 에러 코드와 정보를 별도로 정의하고 최소 정보를 로그에 기록

  • 오류 상황 대응 부재의 시큐어 코딩 구현
# 조치 
try{
    //패스워드 입력 구현 코드 생략
}catch(NullPointerException e){
} 
 : try문에서 패스워드 값이 존재하지 않을 경우 NullPointerException이 발생하고 해당 오류에 대한 대응이 없어 인증된 것으로 처리

# 조치 
try{
    //패스워드 입력 구현 코드 생략
}catch(NullPointerException e){
    s.setMessage(e.getMessage());
    return(makeLogin(s));
} 
 : 예외사항에 대해 적절한 조치를 수행


1.6. 코드 오류

1.6.1. 코드 오류 보안 약점의 개념

  • 타입 변환 오류, 메모리의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩오류로 인해 유발되는 보안 약점.

1.6.2. 코드 오류 보안 약점의 유형

  • 널포인터(Null Pointer) 역참조
    • 널값을 고려하지 않은 코드에서 발생하는 보안 약점 / 의도적으로 널값을 유발해 예외상황을 확인하고 추후 공격에 활용
    • 대응 방안 : 값을 참조하기 전에 널 값인지 검사
  • 부적절한 자원 해제
    • 자원 고갈로 인한 시스템 오류 유발 보안 약점 / 소켓, 힙메모리 등 자원을 할당받아 사용 후 미반환시 발생
    • 대응 방안 : 자원 획득 사용 후 반드시 자원 해제
  • 해제된 자원 사용
    • C언어 해제한 메모리를 참조하여 의도치 않은 코드를 실행하는 보안 약점
    • 대응 방안 : 메모리 할당 해제 후 포인터에 널 값 저장
  • 초기화되지 않은 변수 사용
    • C언어 함수 내 지역변수 초기화하지 않고 사용할 시 발생하는 보안 약점
    • 대응 방안 : 모든 변수는 사용하기 전 초깃값을 할당

1.6.3. 코드 오류 보안 약점의 시큐어 코딩 구현

  • 널 포인터 역참조의 시큐어 코딩 구현
# 조치 
String url = resuest.getParameter("url");
if(url.equals("")) 
 : url에 null이 들어오면  포인터 역참조가 발생 


# 조치 
String url = resuest.getParameter("url");
if(url != null || url.equals("")) 
 : null 값을 가지는 참조변수를 사용할 경우 null 검사를 수행

  • 부적절한 자원해제의 시큐어 코딩 구현
# 조치 
InputStream in = null;
OutputStream out = null;

try{
    in = new FileInputStream(inputFile);
    out = new FileOutputStream(outputFile);
    ...
    FileCopyUtils.copy(fis, os); 
    in.close();
    out.close();

}catch(IOException e){
    logger.error(e);
}
 : 자원반환 실행 전에 오류가 발생할 경우 자원이 반환되지 않으며 할당된 모든 자원을 반환해야 


# 조치 
InputStream in = null;
OutputStream out = null;

try{
    in = new FileInputStream(inputFile);
    out = new FileOutputStream(outputFile);
    ...
    FileCopyUtils.copy(fis, os); 
    in.close();
    out.close();

}catch(IOException e){
    logger.error(e);
}finally{
    if( in != null ) { 
        try{ 
            in.close() 
        }catch(IOException e){
            logger.error(e);
        }
    }
    if( out != null ) { 
        try{ 
            out.close() 
        }catch(IOException e){
            logger.error(e);
        }
    }

}
 : 항상 수행되는 finally 블록에서 할ㅇ받은 자원에 대해 각각 null 검사를 수행하고 예외 처리로 자원 해제


1.7. 캡슐화

1.7.1. 캡슐화 보안 약점의 개념

  • 중요한 데이터 또는 기능성을 불충분하게 캡슐화하거나 잘못 사용해 발생하는 보안 약점으로 정보노출, 권한문제 등이 발생할 수 있다.

1.7.2. 캡슐화 보안 약점의 유형

  • 잘못된 세션에 의한 정보 노출
    • 멀티 스레드 환경에서 서로 다른 세션간 데이터가 공유될 수 있는 보안 약점
    • 대응 방안 : 싱글톤 패턴 사용시 변수 적용 범위 주의
  • 제거되지 않은 디버그 코드
    • 의도하지 않은 민감 정보가 노출될 수 있는 보안 약점 / 개발 완료 후 배포단계에서 디버그 코드가 남아있는 경우 발생
    • 대응 방안 : 소프트웨어 배포 전 디버그 코드 확인 및 삭제
  • 시스템 정보 노출
    • 시스템 내부 데이터가 노출되어 공격의 실마리가 되는 보안 약점
    • 대응 방안 : 예외 상황 발생 시 시스템 내부정보의 화면 노출이 없도록 개발

✱ 세션(Session) : 세션은 클라이언트와 서버의 논리적인 연결이다.
✱ 싱글톤 패턴(Singleton Pattern) : 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하여, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴.

1.7.3. 캡슐화 보안 약점의 시큐어 코딩 구현

  • 잘못된 세션에 의한 정보 노출의 시큐어 코딩 구현
# 조치 
@Controller
public class TrendForecastController{
    private int currentPage=1;   
    public void doSomething(HttpServletRequest request){
        currentPage = Integer.parseInt(request.getParameter("page"));
    }
}
 : Controller에서 int 필드가 멤버변수로 선언되어 스레드간 공유됨


# 조치  
@Controller
public class TrendForecastController{
    public void doSomething(HttpServletRequest request){
        int currentPage = Integer.parseInt(request.getParameter("page"));
    }
}
 : 지역변수로 사용하여 스레드간 공유되지 못하도록 

  • 제거되지 않은 디버그 코드의 시큐어 코딩 구현
# 조치 
class Base64{
    public void otherMethod(){
        if(debug){...}   
    }
}
 : 제거되지 않은 디버그 코드가 잔존하여 정보노출 가능성 존재

 
# 조치 
class Base64{
    public void otherMethod(){ 
    }
}
 : 불필요한 디버그 코드가 제거되어 정보노출 방지

  • 시스템 정보노출의 시큐어 코딩 구현
# 조치 
catch(IOException e){
    System.err.print(e.getMessage());   
}
 : 오류 발생시 화면에 출력된 시스템 정보를 통해 다른 공격의 빌미를 제공


# 조치 
catch(IOException e){
    logger.error("IOException Occured");   
}
 : 오류와 관련된 최소한의 정보만을 제공


1.8. API 오용

1.8.1. API 오용 보안 약점의 개념

  • 의도된 사용에 반하는 방법으로 API를 사용하거나 보안에 취약한 API를 사용하여 발생할 수 있는 보안 약점.

1.8.2. API 오용 보안 약점의 유형

  • DNS에 의존한 보안 결정
    • 공격자가 DNS 정보를 변조하여 보안결정을 우회 가능한 보안 약점
    • 대응 방안 : DNS로 확인된 정보 대신 IP 주소 사용
  • 취약한 API 사용
    • 금지되거나 안전하지 않은 함수를 사용하는 보안 약점
    • 대응 방안 : 안전한 함수 사용

1.8.3. API 오용 보안 약점의 시큐어 코딩 구현

  • DNS에 의존한 보안 결정 시큐어 코딩 구현
# 조치 
public void doGet(HttpServletRequest req HttpServletResponse res) throws ServletException IOException{
    boolean trusted = false;
    String ip = req.getRemoteAddr();
    InetAddress addr = InetAddress.getByName(ip);
    if(addr.getCanonicalHostName().endsWith("trustme.com")){  
        ....
    }
}
 : 도메인은 공격자에 의해 실행되는 서버의 DNS가 변경될  있어 안전하지 않음


# 조치 
public void doGet(HttpServletRequest req HttpServletResponse res) throws ServletException IOException{
    String ip = req.getRemoteAddr();
    if(ip == null || "".equals(ip)) return;
    String trustedAddr = "127.0.0.1";  
    if(ip.equals(trustedAddr)){
        ....
    }
}
 : 이용하려는 실제 서버의 IP주소를 사용하여 DNS 변조에 방어

  • 취약한 API 사용 시큐어 코딩 구현
# 조치 
socket = new Socket("baekhj.or.kr" 8080); 
 : 프레임워크의 메서드 호출 대신 소켓을 직접 사용하고 있어 프레임워크에서 제공하는 보안 기능을 제공받지 못해 안전하지 않음


# 조치 
URL url = new URL("http://127.0.0.1:8080/call");  
URLConnection urlConn = url.openConnection();
 : 보안 기능을 제공하는 프레임 워크의 메서드를 이용


2. SW 개발 보안 테스트와 결함 관리

2.1. 소프트웨어 개발 보안 테스트의 개념

  • 소프트웨어 보안 요구사항이 반영되어 있음을 보증하고, 취약점을 발견하고 개선하여 안전한 소프트웨어를 개발하기 위한 활동.


2.2. 소프트웨어 개발 보안 테스트 유형

  • 정적 분석 (화이트박스 테스트)
    • SW를 실행하지 않고 보안 약점을 분석 / SW개발 단계에서 주로 사용
    • 특징
      • 취약점 초기 발견으로 수정비용 절감
      • 컴포넌트간 발생할 수 있는 통합된 취약점 발견에 제한적
      • 설계∙구조 관점의 취약점은 식별 불가
  • 동적 분석 (블랙박스 테스트)
    • SW 실행환경에서 보안 약점 분석 / SW 시험 단계에서 주로 사용
    • 특징
      • 소스 코드 필요 없음
      • 정확도와 커버리지 향상
      • 구조 관점의 보안 약점 식별 불가


2.3. 소프트웨어 개발 보안 테스트 절차

2.3.1.준비단계

  1. 대상 선정
    • 중요자산을 평가하여 취약점 테스트 시행 요청을 SW 개발팀에 요청
    • SW 취약점 테스트를 위한 업무 범위 및 비용과 일정을 합의
  2. 일정 수립
    • SW 프로젝트 매니저는 보안 약점 테스트 팀과 직접 협업하여 보안 취약점 테스트 일정을 결정
    • 보안 취약점 테스트 데이터를 준비

2.3.2. 실행 단계

  • 테스트 수행
    • 자동화된 테스트 도구를 통해 정적/동적 테스트 수행
    • 테스트 도구로 도출된 취약점 수정 등 보안 검토 이행

2.3.3. 개선 단계

  1. 보고서 발행
    • 취약점 리스크를 식별하고 분류
    • 보안 취약성 점검 도구를 사용한 테스트 및 피드백
    • 소스 코드 오류 검사도구를 사용한 테스트 및 피드백
    • 소프트웨어 모델 체킹 도구를 사용하여 테스트
  2. 지적사항 해결
    • 조직이 준수하는 보안 프로세스를 거쳐 지적사항 해결

2.3.4. 관리 단계

  1. 결함 해결 사항 보고
    • 보안 결함의 심각도를 파악하여 보고 여부 파악
    • SW 보안결함 재발방지 대책에 대한 평가 수행
    • SW 보안결함 상태를 점검
    • 시정조치 절차를 점검하고 계획을 확인 및 승인
  2. 점검된 소스 코드 관리
    • 안전한 관리 방안 수립과 변경통제 절차 관리
    • 소스 코드 보관 경로 접근제어 및 접근 로그 기록
    • 소스 프로그램의 버전 통제 실시

2.3.5. 종료 단계

  • 보안 상황 보고
    • 경영진 판단을 돕는 완료 보고서 작성
    • 표준화된 양식을 준수하여 간결하고 명료하게 작성






  • 정보처리기사 필기 합격 후 실기대비 정리 및 책없이 간단히 보기위해 작성하였습니다.
  • 2020년 수제비 정보처리기사 책 기반으로 정리 하였습니다.
  • 저작권 관련 문제가 있다면 hojunbbaek@gmail.com 으로 메일 주시면 바로 삭제 조치 하도록 하겠습니다.