Ⅸ. 소프트웨어 개발 보안 구축 - 소프트웨어 개발 보안 구현.
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
- 공격자가 악성 스크립트 파일을 웹서버에 설치.
- 클라이언트에서 악성 스크립트가 설치되어 있는 웹 브라우저 실행.
- 웹 서버의 악성 스크립트 실행되어 클라이언트(사용자) 감영, 감염 후 개인정보등 공격자에게 유출.
- 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("&", "&"); ① keyword = keyword.replaceAll("<", "<"); ① keyword = keyword.replaceAll(">", ">"); ① %> ... <%@ 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.준비단계
- 대상 선정
- 중요자산을 평가하여 취약점 테스트 시행 요청을 SW 개발팀에 요청
- SW 취약점 테스트를 위한 업무 범위 및 비용과 일정을 합의
- 일정 수립
- SW 프로젝트 매니저는 보안 약점 테스트 팀과 직접 협업하여 보안 취약점 테스트 일정을 결정
- 보안 취약점 테스트 데이터를 준비
2.3.2. 실행 단계
- 테스트 수행
- 자동화된 테스트 도구를 통해 정적/동적 테스트 수행
- 테스트 도구로 도출된 취약점 수정 등 보안 검토 이행
2.3.3. 개선 단계
- 보고서 발행
- 취약점 리스크를 식별하고 분류
- 보안 취약성 점검 도구를 사용한 테스트 및 피드백
- 소스 코드 오류 검사도구를 사용한 테스트 및 피드백
- 소프트웨어 모델 체킹 도구를 사용하여 테스트
- 지적사항 해결
- 조직이 준수하는 보안 프로세스를 거쳐 지적사항 해결
2.3.4. 관리 단계
- 결함 해결 사항 보고
- 보안 결함의 심각도를 파악하여 보고 여부 파악
- SW 보안결함 재발방지 대책에 대한 평가 수행
- SW 보안결함 상태를 점검
- 시정조치 절차를 점검하고 계획을 확인 및 승인
- 점검된 소스 코드 관리
- 안전한 관리 방안 수립과 변경통제 절차 관리
- 소스 코드 보관 경로 접근제어 및 접근 로그 기록
- 소스 프로그램의 버전 통제 실시
2.3.5. 종료 단계
- 보안 상황 보고
- 경영진 판단을 돕는 완료 보고서 작성
- 표준화된 양식을 준수하여 간결하고 명료하게 작성
- 정보처리기사 필기 합격 후 실기대비 정리 및 책없이 간단히 보기위해 작성하였습니다.
- 2020년 수제비 정보처리기사 책 기반으로 정리 하였습니다.
- 저작권 관련 문제가 있다면 hojunbbaek@gmail.com 으로 메일 주시면 바로 삭제 조치 하도록 하겠습니다.
[정보처리기사 실기] Ⅸ. 소프트웨어 개발 보안 구축 - 소프트웨어 개발 보안 구현. (feat.수제비)