안녕하세요.
이번 Secure Coding 메뉴얼 3편에서는 TestCase와 점검도구에 대해 알아보도록 하겠습니다.
Secure Coding 전편은 아래 링크를 통해 확인해주세요.
1. TestCase
1.1 회원가입
구분 | 보안요구항목 | 점검내용 |
SR1-1 | DBMS 조회 및 결과 검증 | 중복아이디 검색을 위한 사용자ID에 쿼리를 조작할 수 있는 입력값으로 SQL 삽입공격이 시도될 수 있으므로 입력값 검증 |
우편번호 검색을 위한 입력값 조작하여 SQL 삽입 공격이 시도될 수 있으므로 입력값 검증 필요 | ||
SR1-5 | 웹 서비스 요청 및 결과 검증 | 회원가입을 위한 입력정보에 악의적인 스크립트가 포함 될 수 있으므로 입력값 검증 필요 |
SR1-6 | 웹 기반 중요 기능 수행 요청 유효성 검증 | 스크립트를 이용하여 회원가입 요청이 처리될 수 있으므로, 실제 사용자의 유효한 요청인지 여부를 확인해야함 |
SR1-10 | 업로드 다운로드 파일 검증 | 허가된 유형의 파일만 업로드 되도록 해야 함 |
SR2-3 | 비밀번호 관리 | 사용자가 입력한 비밀번호에 대해 안전한 패스워드 설정정책이 적용되어야 함 |
SR2-7 | 중요정보 저장 | 비밀번호는 솔트가 적용된 안전한 해시함수를 사용하여 암호화해서 저장해야 함 |
소스 코드 내에 중요 정보를 노출하는 주석문이 존재하지 않아야 함 |
1.2 아이디 찾기
구분 | 보안요구항목 | 점검내용 |
SR1-1 | DBMS 조회 및 결과 검증 | 아이디/비밀번호 찾기시 검색을 위한 사용자 이름, 이메일, ID에 쿼리를 조작할 수 있는 입력값으로 SQL 삽입공격이 시도될 수 있으므로 입력값 검증이 필요함 |
SR1-5 | 웹 서비스 요청 및 결과 검증 | 아이디/비밀번호 찾기시 입력정보에 악의적인 스크립트가 포함될 수 있으므로 입력값 검증이 필요함 |
SR2-3 | 비밀번호 관리 |
비밀번호 찾기시 사전에 등록된 이메일 주소로만 임시비밀번호가 전송되도록 제한해야 함 |
임시 비밀번호로 첫 로그인 시 반드시 신규비밀번호로 변경하도록 관리해야 함 |
||
SR2-4 | 중요 자원 접근 통제 | URL을 변조하여 중요페이지 접근에 대한 인증을 우회할 수 없도록 해야 함 |
SSI(Server‐Side Includes) 변수가 조작되어 명령실행을 통해 서버 데이터 정보가 누출되지 않도록 해야 함 |
||
SR2-7 | 중요정보 저장 | 소스코드 내에 중요정보를 노출하는 주석문이 존재하지 않아야 함 |
SR2-8 | 중요정보 전송 | 사용자가 입력한 정보는 암호화하여 전송하거나, 암호화된 통신 채널을 통해 전달해야 함 |
SR3-1 | 예외처리 | 사용자 정보 입력 및 제출과정에서 오류가 발생하는 경우 지정된 페이지로 리다이렉트 하여 에러 정보가 노출되지 않도록 해야 함 |
SR4-1 | 세션통제 | 세션 ID가 URL, 에러메시지, 로그 등에 노출되지 않도록 해야 함 |
1.3 상세조회
구분 | 보안요구항목 | 점검내용 |
SR1-1 | DBMS 조회 및 결과 검증 | 목록 조회시 URL 파라미터에 쿼리를 조작할 수 있는 입력값으로 SQL 삽입공격이 시도될 수 있으므로 입력값 검증이 필요함 |
SR1-5 | 웹 서비스 요청 및 결과 검증 | 게시글 수정, 목록 조회시 입력정보에 악의적인 스크립트가 포함될 수 있으므로 입력값 검증이 필요함 |
SR1-6 |
웹 기반 중요기능 수행 요청 유효성 검증 |
스크립트를 이용하여 게시글 수정/삭제 요청이 처리될 수 있으므로, 실제 사용자의 유효한 요청여부를 확인해야 함 |
SR1-9 | 보안 기능 동작에 사용되는 입력 값 검증 | 쿠키·환경변수·Hidden 필드 값을 조작하여 게시글 수정/삭제 요청이 처리될 수 있으므로 실제 사용자의 유효한 요청여부를 확인해야 함 |
SR2-1 | 인증 대상 및 방식 | 인증이 필요한 게시판, 관리자 전용 게시판 등 중요페이지 접근시 인증 절차가 부재이거나, 부적절하게 인증 과 정을 우회할 수 있는지를 확인해야 함 |
SR2-4 | 중요자원 접근 통제 | URL을 변조하여 중요페이지 또는 권한 없는 페이지 접근에 대한 인증을 우회할 수 없도록 해야 함 |
SSI(Server‐Side Includes) 변수가 조작되어 명령실행을 통해 서버 데이터 정보가 누출되지 않도록 해야 함 | ||
SR3-7 | 중요정보 저장 | 소스코드 내에 중요정보를 노출하는 주석문이 존재하지 않아야 함 |
SR3-1 | 예외처리 | 게시물 수정/삭제시 오류가 발생할 경우 지정된 페이지로 리다이렉트 하여 에러 정보가 노출되지 않도록 해야 함 |
SR4-1 | 세션통제 | 중복 로그인을 허용하지 않는 경우 이전에 생성된 로그인 세션을 종료하거나, 새로이 연결되는 세션을 종료해야 함 |
로그인 상태인 사용자를 위해 해당 페이지에 로그아웃 인터페이스를 구현함 | ||
세션 ID가 URL, 에러메시지, 로그 등에 노출되지 않도록 해야 함 |
1.4 글쓰기
구분 | 보안요구항목 | 점검내용 |
SR1-1 | DBMS 조회 및 결과 검증 | 목록 조회시URL 파라미터에쿼리를 조작할 수 있는 입력값으로SQL 삽입공격이시도될 수 있으므로 입력값 검증이 필요함 |
SR1-5 | 웹 서비스 요청 및 결과 검증 | 게시글수정, 목록 조회시입력정보에 악의적인 스크립트가 포함될 수 있으므로 입력값 검증이 필요함 |
SR1-6 |
웹 기반 중요기능 수행 요청 유효성 검증 |
스크립트를 이용하여 게시글 수정/삭제 요청이 처리될 수 있으므로, 실제 사용자의 유효한 요청여부를 확인해야 함 |
SR1-9 | 보안 기능 동작에 사용되는 입력 값 검증 | 쿠키·환경변수·Hidden 필드 값을 조작하여 게시글 수정/삭제 요청이 처리될 수 있으므로 실제 사용자의 유효한 요청여부를 확인해야 함 |
SR1-10 |
업로드 다운로드 파일 검증 |
첨부파일 업로드시 사용자가 업로드 하는 파일의 크기, 확장자 및 콘텐츠 타입 등을 검증하여 웹셸 등이 업로드되지 않도록 해야 함 |
업로드 파일의 저장경로는 외부에서 직접 접근 불가능한 경로를 사용함 | ||
업로드 된 파일은 실행권한을 가지지 않도록 함 | ||
SR2-1 | 인증 대상 및 방식 | 인증이 필요한 관리자 전용 게시판 등 중요페이지 접근 시 인증 절차가 부재이거나, 부적절하게 인증 과정을 우회할 수 있는지를 확인해야 함 |
SR2-4 |
중요자원 접근통제 | URL/파라미터를 조작하여 중요페이지 또는 권한 없는 페이지 접근에 대한 인증을 우회할 수 없도록 해야 함 |
SSI(Server‐Side Includes) 변수가 조작되어 명령실행을 통해 서버 데이터 정보가 누출되지 않도록 해야 함 | ||
SR2-7 |
중요정보 저장 |
첨부파일 업로드시 실제저장명, 파일의 저장경로 등이 노출되지 않도록 함 |
소스코드 내에 중요정보를 노출하는 주석문이 존재하지 않아야 함 | ||
SR3-1 | 예외처리 | 중복 로그인을허용하지 않는 경우 이전에 생성된 로그인 세션을 종료하거나, 새로이 연결되는 세션을 종료해야함 |
로그인 상태인 사용자를 위해 해당 페이지에 로그아웃인터페이스를구현함 | ||
세션 ID가 URL, 에러메시지, 로그 등에 노출되지 않도록해야 함 | ||
SR4-1 |
세션통제 |
중복 로그인을 허용하지 않는 경우 이전에 생성된 로그인 세션을 종료하거나, 새로이 연결되는 세션을 종료해야 함 |
로그인 상태인 사용자를 위해 해당 페이지에 로그아웃 인터페이스를 구현함 | ||
세션 ID가 URL, 에러메시지, 로그 등에 노출되지 않도록 해야 함 |
1.5 글조회
구분 | 보안요구항목 | 점검내용 |
SR1-1 | DBMS 조회 및 결과 검증 | 첨부파일 다운로드를 위한 URL 파라미터에 쿼리를 조작할 수 있는 입력값으로 SQL 삽입공격이 시도될 수 있으므로 입력값 검증이 필요함 |
SR1-4 | 시스템 자원 접근 및 명령어 수행 입력 값 검증 | 서버에서 명령 창을 실행해두는 경우 사용자가 시스템 명령어를 입력할 가능성에 대비하여 미리 정의된 인자 값의 배열을 통해 명령어를 선택하도록 해야 함 |
SR1-5 |
웹 서비스 요청 및 결과 검증 |
첨부파일 다운로드시 입력정보에 악의적인 스크립트가 포함될 수 있으므로 입력값 검증이 필요함 |
SR1-10 |
업로드 다운로드 파일 검증 |
첨부파일 다운로드를 위해 요청되는 파일명에 경로를 조작하는 문자가 포함되어 있는지 점검해야 함 |
첨부파일 다운로드 시 사용자 입력 값을 검증하여 웹 루트 디렉터리를 벗어난 영역에서 파일을 다운로드 할 수 없도록 해야 함 | ||
파일 다운로드를 처리하기 전에 파일에 대한 바이러스 및 악성코드 여부를 점검하고 다운로드 받은 파일의 무결성 검사를 실행함 | ||
필요시 인증된 사용자만 파일을 다운로드 할 수 있도록 제한함 |
||
SR2-1 | 인증 대상 및 방식 | 인증이 필요한 게시판, 관리자 전용 게시판 등 중요페이지 접근시 인증 절차가 부재이거나, 부적절하게 인증 과 정을 우회할 수 있는지를 확인해야 함 |
SR2-4 |
중요자원 접근통제 | URL/파라미터를 조작하여 중요페이지 또는 권한 없는 페이지 접근에 대한 인증을 우회할 수 없도록 해야 함 |
SSI(Server‐Side Includes) 변수가 조작되어 명령실행을 통해 서버 데이터 정보가 누출되지 않도록 해야 함 | ||
SR2-7 |
중요정보 저장 |
첨부파일 다운로드 시 실제저장명, 파일의 저장경로 등이 노출되지 않도록 함 |
소스코드 내에 중요정보를 노출하는 주석문이 존재하지 않아야 함 | ||
SR3-1 | 예외처리 |
첨부파일 다운로드 요청시 오류가 발생하는 경우 지정된 페이지로 리다이렉트하여 에러 정보가 노출되지 않도록 해야 함 |
SR4-1 |
세션통제 |
중복 로그인을 허용하지 않는 경우 이전에 생성된 로그인 세션을 종료하거나, 새로이 연결되는 세션을 종료해야 함 |
로그인 상태인 사용자를 위해 해당 페이지에 로그아웃 인터페이스를 구현함 | ||
세션 ID가 URL, 에러메시지, 로그 등에 노출되지 않도록 해야 함 |
2. 점검 도구
2.1 JAVA 프로그래밍 언어 기반의 공개용 분석 도구
자바를 지원하는 공개용 분석 도구의 각 특징
구분 | FindBugs | FindSecurityBugs | JLint | LAPSE+ | PMD | Yasca |
진단대상 | 바이트코드 | 바이트코드 | 바이트코드 | 자바코드 | 자바코드 | 자바코드 |
설치/운영 |
이클립스 플러그인 |
FindBugs 모듈 | CLI |
이클립스 플러그인 |
이클립스 플러그인/CLI |
CLI |
라이센스 | FREE | FREE | FREE | FREE | FREE | FREE |
자바 외 지원언어 | Groovy, Scala | Groovy, Scala | x | o | x |
javascript, ASP, ColdFusion, PHP, COBOL, .NET 등 |
특징 |
널 포인터 지연, 동기화 오류, 악성코드에 대한 취약성 등 JVM언어 분석 탐지 |
FindBugs의 확장 모듈로 XPath 삽입, SQL 삽입, 암호화 취약점 등 탐지 |
버그, 불일치, 동기화 문제 등을 탐지 | 웹 응용 프로그램에 있는 일반적인 유형의 보안 취약점에 대해 탐지 | 의심스러운 구성, 데드 코드, 중복 코드 등 탐지 | 매우 유연하고 확장하기 쉽도록 설계되어 새로운 규칙을 정규 표현식 작성하는 것처럼 추가 가능 |
개발 | 2012년 9월 | 2012년 9월 | 2012년 8월 | 2006년 9월 | 2006년 2월 | 2010년 3월 |
2.2 입력데이터 검증 및 표현 유형(SR1) 성능 분석 결과
o : 탐지가능
x : 탐지불가능 or 오탐
- : Juliet 코드가 없음
보안약점 | FindBugs | FindSecurityBugs | JLint | LAPSE+ | PMD | Yasca |
SQL 삽입 | o | o | x | o | x | o |
경로 조작 및 자원 삽입 | o | o | x | o | x | x |
크로스사이트 스크립트 | o | o | x | o | x | x |
운영체제 명령어 삽입 | x | o | x | o | x | x |
위험한 형식 파일 업로드 | - | - | - | - | - | - |
신뢰되지 않는 URL 주소로 자동접속 연결 | x | x | x | x | x | x |
XQuery 삽입 | - | - | - | - | - | - |
XPath 삽입 | x | x | x | o | x | x |
LDAP 삽입 | x | x | x | x | x | x |
크로스사이트 요청 위조 | - | - | - | - | - | - |
HTTP 응답분할 | o | o | x | o | x | x |
정수형 오버플로우 | x | x | o | x | x | x |
보안기능 결정에 사용되는 부적절한 입력값 | - | - | - | - | - | - |
메모리 버퍼 오버플로우 | - | - | - | - | - | - |
포멧스트링 삽입 | x | x | x | x | x | x |
2.3 보안약점(SR2) 성능 분석 결과
o : 탐지가능
x : 탐지불가능 or 오탐
- : Juliet 코드가 없음
보안약점 | FindBugs | FindSecurityBugs | JLint | LAPSE+ | PMD | Yasca |
적절한 인증 없는 중요기능 허용 | - | - | - | - | - | - |
부적절한 인가 | - | - | - | - | - | - |
중요한 자원에 대한 잘못된 권한 설정 | - | - | - | - | - | - |
취약한 암호화 알고리즘 사용 | x | o | x | x | x | o |
중요정보 평문저장 | - | - | - | - | - | - |
중요정보 평문전송 | x | x | x | x | x | x |
하드코드된 비밀번호 | o | o | x | x | x | x |
충분하지 않은 키 길이 사용 | - | - | - | - | - | - |
적절하지 않은 난수 값 사용 | x | o | x | x | x | x |
하드코드된 암호화 키 | x | x | x | x | x | x |
취약한 비밀번호 허용 | - | - | - | - | - | - |
사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출 | - | - | - | - | - | - |
주석문 안에 포함된 시스템 주요정보 | x | x | x | x | x | x |
솔트 없이 일방향 해쉬함수 사용 | x | x | x | x | x | x |
무결성 검사 없는 코드 다운로드 | - | - | - | - | - | - |
반복된 인증시도 제한 기능 부재 | - | - | - | - | - | - |
2.4 에러처리, 코드오류(SR3, SR4) 성능 분석 결과
o : 탐지가능
x : 탐지불가능 or 오탐
- : Juliet 코드가 없음
보안약점 | FindBugs | FindSecurityBugs | JLint | LAPSE+ | PMD | Yasca |
오류 메시지를 통한 정보 노출 | x | x | x | x | o | x |
오류 상황 대응 부재 | x | x | x | x | o | x |
부적절한 예외 처리 | - | - | - | - | - | - |
Null Pointer 역참조 | o | o | o | x | x | x |
부적절한 자원 해제 | x | x | x | x | x | x |
해제된 자원 사용 | - | - | - | - | - | - |
초기화되지 않은 변수 사용 | - | - | - | - | - | - |
2.5 분석도구 성능분석 결과
o : 탐지가능
x : 탐지불가능 or 오탐
- : Juliet 코드가 없음
보안약점 | FindBugs | FindSecurityBugs | JLint | LAPSE+ | PMD | Yasca |
입력데이터 검증 및 표현 | 4 | 5 | 1 | 6 | - | 1 |
보안기능 | 7 | 1 | 3 | - | - | 1 |
시간 및 상태 | 1 | 1 | 1 | - | - | - |
에러처리 | 2 | - | - | - | 1 | - |
코드오류 | 1 | 1 | 1 | - | - | - |
캡슐화 | - | - | - | - | - | 1 |
API 오용 | - | - | - | - | - | - |
계 | 7 | 10 | 2 | 6 | 1 | 3 |
2.6 분석도구 사용 (FindBugs, PMD)
<설치>
1) eclipse > plugins 이동
2) FindBugs Plugin 폴더 복사
3) PMD 파일 복사
4) eclipse > configuration > org.eclipse.equinox.simpleconfigurator 이동
5) bundles.info 열기
6) FindBugs, PMD Plugin 정보 추가 (마지막 줄에 추가)
edu.umd.cs.findbugs.plugin.eclipse,3.0.1.20150306-5afe4d1,plugins/edu.umd.cs.findbugs.plugin.eclipse_3.0.1.20150306-5afe4d1/,4,false
net.sourceforge.pmd.eclipse.plugin,4.7.0.v20190915-0943,plugins/net.sourceforge.pmd.eclipse.plugin_4.7.0.v20190915-0943.jar,4,false
<점검>
1) 점검할 프로젝트 및 파일 선택
2) 점검
3) Bug Explorer 에서 내용 확인
4) souce 코드 확인 (FindBugs)
5) Bug Info 에서 솔루션 확인 (FindBugs)
6) souce 코드 확인 (PMD)
7) Violation Outline 에서 리스트 확인 (PMD)
8) 상세 확인 (PMD)
<결론>
- 모든 보안약점을 분석할 수 있는 규칙 및 성능을 보유한 분석도구는 존재하지 않음
- 여러 개의 도구를 같이 사용하여 분석 범위를 넓히고 분석도구가 분석하지 못하는 보안약점에 대해서는 직접 수동으로 확인하는 것이 좋음
- CoreFrame에서 jspx파일의 자바코드는 java코드로 인식을 하지 못하여 탐지가 불가능하였음
[참고 문서]
- 소프트웨어 개발 보안 가이드 (한국 인터넷 진흥원)
- 소프트웨어 개발 보안 점검 가이드 (한국 인터넷 진흥원)
- 공개용 소스 코드 보안 약점 분석 도구 개발 동향 (한국 인터넷 진흥원)
※ 시큐어 코딩에 대한 주요 5가지를 메뉴얼화 하였으며, 계속적으로 업그레이드가 필요함.
'백엔드' 카테고리의 다른 글
웹 서비스 동작구조와 소켓 통신 (2) | 2021.02.02 |
---|---|
2020 보안기술 개발 동향 (0) | 2020.06.04 |
Secure Coding 메뉴얼 2편 (0) | 2019.11.11 |
Secure Coding 메뉴얼 1편 (0) | 2019.11.04 |
사내 IaaS 구축하기 (0) | 2018.06.25 |