모의해킹은 크게 화이트 박스와 블랙 박스 진단으로 분류된다.


화이트 박스는 관리자 권한을 얻은 상태에서 보안 설정 값을 검사하는 것으로 국내 환경에 맞춰진 공신력 있는 기관의 소프트웨어 보안약점 진단가이드를 기준으로 수행한다.


블랙박스는 비인가자의 권한으로 패스워드 획득, 관리자 권한 획득, 고객정보 획득 등을 얻기위해 수행하는 것으로 국내외 공신력 있는 기관의 주요정보통신기반시설 기술적 취약점 분석 평가 방법 가이드, OWASP TOP 10 등의 기준으로 수행한다.


CWE

소스코드 취약점 진단 시 기준, 사용 도구, 국내외 진단항목 매핑, 샘플 환경에 대해 말해보고자 한다. 하단의 취약점 진단 항목은 소프트웨어 보안약점 진단가이드 기준으로 국내 코드별 CWE 항목을 매핑했다.

 

간혹 고색사가 해당 항목이 어떤 항목과 매핑이 되어 있는지 물어보거나 고객이 먼저 요구하지 않아도 우리 회사는 국내외 표준으로 진단을 수행하고 있다면 신뢰가 갈 것이다.


소스코드는 PHP, ASP, ASP, Windows App 등 하기 표와 같이 수행을 한다. 하지만, 모든 항목을 진단할 필요는 없고 해당되는 항목만 진단을 하면된다.


코드 표준 진단 항목 설명
SW1-01 CWE-89
OWA-A1
SQL 삽입 공격자가 외부 입력을 통해서 의도하지 않은 SQL 명령어 수행이 가능한 공격으로 데이터 질의(SQL) 유효성 검증이 이뤄지지 않아 정보 유출 및 DB 변경이 가능
SW1-02 CWE-121 스택버퍼 오버플로우 스택에 정의된 버퍼(지역변수, 함수인자 등)의 한계치를 넘는 접근시 발생
SW1-03 CWE-122 힙버퍼 오버플로우 힙에 정의된 버퍼(메모리할당, malloc 등)의 한계치를 넘는 접근시 발생
SW1-04 CWE-23
OWA-A4
상대경로 조작 상대경로 문자열에 대한 검증이 미흡한 경우 조합된 경로조작을 통해 의도하지 않은 시스템 경로 접근 허용 (“..” 문자열사용/ 파일접근, 권한탈취)
SW1-05 CWE-36
OWA-A4
절대경로 조작 조합된 경로가 아닌 입력 문자열로 경로를 허용할 경우 의도하지 않은 시스템 경로 접근허용 (파일접근, 권한탈취)
SW1-06 CWE-78
OWA-A1
운영체제 명령어삽입 기대하지 않은 외부 입력이 시스템 수행 명령어로 입력되는 경우
SW1-07 CWE-90 LDAP 삽입 및 처리 LDAP 질의 및 처리시 공격자가 입력한 문자열에 대한 입력검증 없이 전달 및 수행되는 경우
SW1-08 CWE-99,15,114
OWA-A4
자원삽입 시스템 환경변수를 검증없이 중요 입력값으로 사용하는 경우 (서버주소, 계정정보, 비밀번호 등 )
SW1-09 CWE-125,124,129
OWA-A5
버퍼 시작 및 범위초과 C 등의 언어 특성에서 배열크기와 버퍼 인덱스 크기 오류 및 범위초과 읽기 등
SW1-10 CWE-170
OWA-A5
NULL 종료문자열 문자열 연산에서 NULL 종료 규칙 위반으로 스택 또는 힙 버퍼 오버플로우
SW1-11 CWE-190,194,196
OWA-A1
정수 오버플로우, 부호확장/형식변환 정수범위를 초과한 연산 및 의도하지 않은 부호 변환(부호확장) 대입, 변수 범위를 검증하지 않은 형식간 변환 대입
SW2-01 CWE-242
OWA-A5
위험함수 사용 OS 및 서비스 제공라이브러리에서 위험하다고 명시된 함수 사용 (gets, strcpy 등)
SW2-02 CWE-243 작업경로없는 접근 chdir 없는 chmod 사용
SW2-03 CWE-247 DNS lookup 의존 DNS 엔트리 변조에 대비, 문자열비교외 IP주소 및 목표 DNS 비교
SW2-04 CWE-251
OWA-A5
문자열관리 _mbsXXX 함수계열의 버퍼 통제오류
SW2-05 CWE-558 다중쓰레드 로그인상태 다중쓰레드 환경애서 getlogin 사용이 갖는 사용자 정보 위험
SW3-01 CWE-259
OWA-A7
하드코딩 패스워드 모듈 및 내외부 통신에 사용할 패스워드를 하드코딩하여 사용
SW3-02 CWE-285
OWA-A8
부적절한 인가(LDAP) 프로그램이 접근가능하고 실행가능한 LDAP 실행에 대해 부적절한 검사
SW3-03 CWE-255
OWA-A7
하드코딩 계정 모듈 및 내외부 통신에 사용할 계정을 하드코딩하여 사용
SW3-04 CWE-256 패스워드 평문저장 주요 계정 및 접속에 사용할 패스워드를 평문으로 저장하여 사용
SW3-05 CWE-260 설정파일 패스워드 실행에 필요한 정보 등을 저장하는 설정파일에 패스워드 저장하여 사용
SW3-06 CWE-261
OWA-A7
취약한 패스워드암호 패스워드에 취약한 암호적용 (B64 등)
SW3-07 CWE-266 부적절한 권한부여 권한상승위한 setuid 및 윈도우 Previllage 사용 또는 사용후 권한 재조정 미흡
SW3-08 CWE-272 최소권한 부여위배 필요시 적절한 권한획득하고 최소권한상태 유지하지 않음
SW3-09 CWE-310
OWA-A7
취약한 암호길이 RSA 1024 (2048권장), 대칭키 128(256권장)하나 적은 키길이 사용
SW3-10 CWE-321 하드코드 암호키 내부에 암호화 키값을 하드코딩하여 외부 유출 및 노출가능
SW3-11 CWE-325
OWA-A7
취약한 RSA 패딩 RSA 패딩시 NO_PADDING 옵션등의 사용으로 취약점 상존
SW3-12 CWE-326 취약한 해쉬 해쉬 알고리즘 사용시, SALT 및 IV 하드코딩 입력 값 사용
SW3-13 CWE-327 취약한 알고리즘 안전하지 않은 알고리즘 (MD4, MD5, RC2, RC4, RC5, RC6, SHA1, DES 등) 사용
SW3-14 CWE-330 부적절한 난수값 난수값 사용시 일정한 고정 조건을 사용하는 경우 (값의 범위, 생성 조건등의 임의조건)
SW3-15 CWE-605 동일포트 다중사용 하나의 포트에 다중 서비스 연결하용하는 경우 (SO_REUSEADDR 및 INADDR_ANY)
SW3-16 CWE-615 주석내 패스워드 소스 개발자 주석에 패스워드를 기록한 경우 (소스탈취)
SW3-17 CWE-732 부적절한 쓰기권한 설정파일, 소켓, 파일 등 중요자산에 대해서 불필요한 쓰기 권한 획득
SW4-01 CWE-367 부적절한 경쟁조건 경쟁조건 및 사용조건에 대한 부적절한 통제 (TOCTOU)
파일 Open/Close, O_EXCL 등
SW4-02 CWE-386 부정확한 심볼릭링크 참조 대상이 시간에 따라 변경될 수 있음에 대한 미흡한 통제
SW4-03 CWE-674 부적절한 재귀호출 재귀호출에 대한 통제가 미흡하여 CPU 및 메모리등 자원고갈과 비정상 오류
SW5-01 CWE-209 오류메시지 정보노출 오류메시지를 통해 과도한 정보 노출 위험
SW5-02 CWE-754 부적절한 예외조건 Try _catch _final 부적절 조건
SW6-01 CWE-195 부호/비부호 변환 부호/비부호간 불명확한 변환시 양수의 음수 변환등 오류가능성
SW6-02 CWE-398 정수 문자변환 정수를 문자변환시 4byte / 1byte 크기 등 정보왜곡 및 손실위험
SW6-03 CWE-404
OWA-A9
자원의 부적절반환 자원 형태에 맞지않는 반환 코드로 인해 재 사용 불가
SW6-04 CWE-476 NULL포인터 역참조 유효포인터 검증없이
SW6-05 CWE-562 스택변수 주소반환 지역변수등 스택변수 주소를 반환하고 사용
SW6-06 CWE-730 매크로 오용 매크로의 내용과 범위, 진입과 해제 등의 사용조건 준수 미흡
SW6-07 CWE-730 스택 주소해제 지역변수등 스택변수에 대한 메모리 해제 시도
SW6-08 CWE-730
OWA-A9
쓰레드 조기종료 비정상 등 쓰레드 조기종료시 리소스, 하위 쓰레드 자원 비반환
SW6-07 CWE-770 무한자원 할당 메모리 등 자원할당에 대한 해제 처리없이 지속 반복 할당
SW7-01 CWE-489 비제거 디버그코드 제거되지 않은 디버그 코드를 통해 우회 및 비정상 상태 추적

윈도우 어플리케이션 소스코드 진단 시 PVS-Studio 프로그램을 사용하는 것을 추천한다.


PVS-Studio는 무료와 상용 버전이 있으며, C/C++/C# 등 C계열로 만들어진 어플리케이션을 자동으로 진단해주고, 보고서를 저장하는 기능이 있다. 공식 홈페이지에 가보면 PVS-Studio와 CWE 상관 관계를 확인할 수 있다.


▶ PVS-Studio and CWE


CWE PVS-Studio CWE 설명
CWE-14 V597 버퍼를 지우는 컴파일러 제거
CWE-36 V631, V3039 절대 경로 순회
CWE-121 V755 스택 기반 버퍼 오버플로
CWE-122 V755 힙 기반 버퍼 오버플로
CWE-123 V575 조건 쓰기
CWE-129 V557, V781, V3106 배열 색인의 부적절한 유효성 검사
CWE-190 V636 정수 오버 플로우 또는 랩 어라운드
CWE-193 V645 오프 바이 한 오류
CWE-252 V522, V575 확인되지 않은 반환 값
CWE-253 V544, V545, V676, V716, V721, V724 함수 반환 값의 잘못된 검사
CWE-390 V565 동작없는 오류 상태 감지
CWE-476 V522, V595, V664, V757, V769, V3019, V3042, V3080, V3095, V3105, V3125 NULL 포인터 간 참조
CWE-481 V559, V3055 비교하는 대신 할당하기
CWE-482 V607 할당 대신 비교
CWE-587 V566 포인터에 고정 주소 할당
CWE-369 V609, V3064 0으로 나누기
CWE-416 V723, V774 무료 사용 후
CWE-467 V511, V512, V568 포인터 유형에 sizeof () 사용
CWE-805 V512, V594, V3106 잘못된 길이 값으로 버퍼 액세스
CWE-806 V512 소스 버퍼의 크기를 사용하는 버퍼 액세스
CWE-483 V640, V3043 잘못된 블록 구분
CWE-134 V576, V618, V3025 외부에서 제어되는 형식 문자열 사용
CWE-135 V518, V635 멀티 바이트 문자열 길이의 잘못된 계산
CWE-462 V766, V3058 연관 목록의 중복 키 (Alist)
CWE-401 V701, V773 마지막 참조를 제거하기 전에 메모리가 부적절하게 릴리스 ( '메모리 누출')
CWE-468 V613, V620, V643 잘못된 포인터 크기 조정
CWE-588 V641 비 구조 포인터의 자식 액세스 시도
CWE-843 V641 호환되지 않는 유형의 자원 액세스 ( '유형 혼란')
CWE-131 V512, V514, V531, V568, V620, V627, V635, V641, V645, V651, V687, V706, V727 잘못된 버퍼 크기 계산
CWE-195 V569 서명되지 않은 변환 오류로 서명 됨
CWE-197 V642 숫자 자르기 오류
CWE-762 V611, V780 일치하지 않는 메모리 관리 루틴
CWE-478 V577, V719, V622, V3002 스위치 문의 기본 사례 누락
CWE-415 V586 더블 프리
CWE-188 V557, V3106 데이터 / 메모리 레이아웃 의존성
CWE-562 V558 스택 변수 주소의 반환
CWE-690 V522, V3080 확인되지 않은 반환 값을 NULL 포인터 포인터 참조 해제
CWE-457 V573, V614, V730, V670, V3070, V3128 초기화되지 않은 변수 사용
CWE-404 V611, V773 부적절한 자원 셧다운 또는 릴리스
CWE-563 V519, V603, V751, V763, V3061, V3065, V3077, V3117 사용하지 않는 변수에 대한 할당 ( 'Unused Variable')
CWE-561 V551, V695, V734, V776, V779, V3021 죽은 코드
CWE-570 V501, V547, V517, V560, V625, V654, V3022, V3063 표현식은 항상 거짓입니다.
CWE-571 V501, V547, V560, V617, V654, V694, V768, V3022, V3063 표현식은 항상 참입니다.
CWE-670 V696 항상 잘못된 제어 흐름 구현
CWE-674 V3110 통제되지 않은 재귀
CWE-681 V601 숫자 형식 간의 잘못된 변환
CWE-688 V549 인수가 잘못된 변수 또는 참조로 함수 호출
CWE-697 V556, V668 불충분 한 비교

cgisecurity 웹 사이트에 접속하면 OWASP TOP 10, SANS TOP 25, CWE 등 각 기관에서 발표한 애플리케이션 취약점별로 나눠 취약한 소스코드를 배포하고 있다.


다양한 언어(C, C++, JAVA, PHP, JSP 등)별로 취약점을 분류하여 배포하고 있으니 가이드라인을 보면서 연구한다면 실질적인 소스코드 진단 시 도움이 된다.


▶ NIST vulnerable code samples

▶ NIST Test Suites


소스코드 취약점 진단을 수행하거나 시큐어코딩 솔루션을 검토할 계획이라면 SAMATE 사이트에 접속하여 Tools > Source Code Security Analyzers 메뉴에서 상세한 목록을 확인할 수 있다.


수십 개의 도구를 목록화하고, 도구별 지원 가능한 언어와 무료인지 사용인지 확인이 가능하다.


▶ Source Code Security Analyzers

▶ 동적 링크 라이브러리 (DLL, Dynamic Link Library)

▶ 안드로이드 암호화 구현 취약점 (Android AES 복호화)

▶ DVWA 취약점 분석

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유