모의해킹은 크게 화이트 박스와 블랙 박스 진단으로 분류된다.
화이트 박스는 관리자 권한을 얻은 상태에서 보안 설정 값을 검사하는 것으로 국내 환경에 맞춰진 공신력 있는 기관의 소프트웨어 보안약점 진단가이드를 기준으로 수행한다.
블랙박스는 비인가자의 권한으로 패스워드 획득, 관리자 권한 획득, 고객정보 획득 등을 얻기위해 수행하는 것으로 국내외 공신력 있는 기관의 주요정보통신기반시설 기술적 취약점 분석 평가 방법 가이드, OWASP TOP 10 등의 기준으로 수행한다.
소스코드 취약점 진단 시 기준, 사용 도구, 국내외 진단항목 매핑, 샘플 환경에 대해 말해보고자 한다. 하단의 취약점 진단 항목은 소프트웨어 보안약점 진단가이드 기준으로 국내 코드별 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 상관 관계를 확인할 수 있다.
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
소스코드 취약점 진단을 수행하거나 시큐어코딩 솔루션을 검토할 계획이라면 SAMATE 사이트에 접속하여 Tools > Source Code Security Analyzers 메뉴에서 상세한 목록을 확인할 수 있다.
수십 개의 도구를 목록화하고, 도구별 지원 가능한 언어와 무료인지 사용인지 확인이 가능하다.
▶ Source Code Security Analyzers
▶ 동적 링크 라이브러리 (DLL, Dynamic Link Library)