2023년 고품질 SW개발 컨설팅 및 테스팅 지원 사업 테스팅 사례 공유 합니다.
(재)전주정보문화산업진흥원의 SW품질역량센터에서는
2011년 부터 전라북도 ICT/SW기업을 대상으로 품질 향상을 위한 컨설팅 및 테스팅을 지원하고 있습니다.
목차
1. 테스팅 개요
- 기업명 : 000 소프트
- 기업주소 : 전라북도 전주시 ***
- 테스팅 내용 : 취업00000 시스템 시큐어 코딩 진단 테스팅
구 분 | 제품 개요 |
제품명(모듈명) | 취업0000000 시스템 |
제품설명 | 기업수요에 맞는 전문인력 양성으로 우수인력 지역 정착을 통한 중소 기업 경쟁력 강화를 위해, 취업0000 0000 시스템 |
- 테스팅 목적 : 기업 개발 제품의 소스코드에 대한 보안 취약점 테스트를 통한 보안 취약점 진단 및 가이드를 진행하고, 보안 품질 강화를 통해서 고객에게 고품질 제품을 전달하기 위한 테스팅을 목표
2. 테스팅 일정
수 행 일 정 | 컨설팅 내용 | 담 당 자 |
2023.03.15. | 테스팅 신청 | 000 팀장 |
2023.03.29. | 소스코드 시큐어 코딩 분석 | 김영찬 선임 000 팀장 |
2023.04.05. | 보고서 작성 | 김영찬 선임 |
3. 테스팅 결과 요약
본 테스팅의 지원 내용은 다음과 같습니다.
1) 시험 환경
No | 구 분 | 기본정보 |
1 | 사용 도구 | SPARROW SCE |
2 | 프로그래밍언어 | Java |
3 | 테스트 서버 OS | Windows Server 2009 |
4 | 분석 유형 | 소스코드 시큐어 코딩 분석 |
2) 시험 장소
기업 연구소 내에서 시험 지원
3) 점검 항목
점검 항목은 분석하여 검출하는 기준으로서 품질 (‘Security’) 품질 특성 기반으로 195개 항목을 설정함
순번 | 분류 | 체커 | 위험도 | 항목 내용 |
1 | Security | ANDROID_CLASS_LOADING_HIJACKING | 2 | 신뢰할 수 없는 소스 또는 환경에서 클래스를 로드하면 애플리케이션이 공격자 대신 악의적인 명령을 실행할 수 있다. 즉, 애플리케이션이 클래스를 로드하기 위해 검색하는 디렉토리의 이름을 공격자가 변경하여 자신이 제어권을 가진 디렉토리를 가리키도록 하여 악성행위가 가능하다. |
2 | Security | ANDROID_CLASS_LOADING_HIJACKING_ABSOLUTE_PATH | 3 | 신뢰할 수 없는 소스 또는 환경에서 클래스를 로드하면 애플리케이션이 공격자 대신 악의적인 명령을 실행할 수 있다. 즉, 애플리케이션이 클래스를 로드하기 위해 검색하는 디렉토리의 이름을 공격자가 변경하여 자신이 제어권을 가진 디렉토리를 가리키도록 하여 악성행위가 가능하다. |
3 | Security | ANDROID_CONTEXT_SEND_BROADCAST | 3 | Context.sendBroadcast() 메소드를 사용할 경우를 검출하고 있습니다. |
4 | Security | ANDROID_PERMISSION_CHECK_BYPASS | 3 | 안드로이드의 권한 검사 우회 |
5 | Security | ANDROID_WEB_SETTING_JAVA_SCRIPT | 3 | WebSetting 에서 제공하는 setJavaScriptEnabled() 메소드를 사용하여 javascript 을 허용할 경우 보안에 취약한 javascript 가 실행 될 수 있습니다. |
6 | Security | SECURITY.FILE.GLOBAL_ACCESS | 1 | 내부 저장소에 있는 파일을 접근할 때 MODE_PRIVATE 으로 접근하지 않았을 경우를 검출합니다. |
7 | Security | AVOID_MEMORY_AND_RESOURCE_LEAKS_DURING_SERIALIZATION | 3 | serialization 할 때 메모리 및 리소스 leak을 주의해야 합니다. |
8 | Security | CHECK_FLOATING_POINT_INPUTS_FOR_EXCEPTIONAL_VALUES_INFINITY | 3 | 실수 입력을 사용할때는 예외값인지를 확인해야 합니다. |
9 | Security | CHECK_FLOATING_POINT_INPUTS_FOR_EXCEPTIONAL_VALUES_NAN | 3 | 실수 입력을 사용할때는 예외값인지를 확인해야 합니다. |
10 | Security | CLEAR_TEXT_TRANSMISSION_OF_SENSITIVE_INFORMATION | 2 | 암호화 과정을 거치지 않은 민감한 정보를 전송할 경우를 검출합니다. |
11 | Security | COMMAND_INJECTION | 1 | 외부에서 전달되는 값은 바로 시스템 내부 명령어의 생성에 사용되지 않아야 합니다. |
12 | Security | CRITICAL_PUBLIC_VARIABLE_WITHOUT_FINAL_MODIFIER | 2 | 변경되면 안되는 public 멤버 변수가 final로 선언되지 않았을 경우 검출됩니다. |
13 | Security | CROSS_SITE_REQUEST_FORGERY | 1 | 폼 데이터 전달에 있어서 POST 방식을 사용하지 않았을 경우 공격자에 의하여 악의적인 웹 사이트가 사용자의 인증된 세션 안에서 원치 않은 행동을 할 수 있습니다. |
14 | Security | DANGEROUS_DOWNCAST | 3 | 위험한 다운캐스트를 사용하면 안됩니다. |
15 | Security | DATA_LEAK_BETWEEN_SESSIONS | 2 | 다중 스레드 환경에서 서블릿에 정보를 저장하는 필드가 포함되지 않도록 해야합니다. |
16 | Security | DEFENSIVELY_COPY_MUTABLE_INPUTS_AND_MUTABLE_INTERNAL_COMPONENTS | 3 | 상태가 변할 수 있는 입력값은 항상 방어적으로 복사하여 사용해야 합니다. |
17 | Security | DIRECT_USE_OF_UNSAFE_JNI | 2 | 다른 언어로 작성된 프로그램을 JNI를 통해 사용하는 경우를 검출합니다. |
18 | Security | DOWNLOAD_OF_CODE_WITHOUT_INTEGRITY_CHECK | 2 | 다운로드 될 코드를 제공할 때에 코드에 대한 암호화된 시그니처를 사용하지 않고 다운로드를 할 경우 코드의 출처나 무결성 검사 없이 클라이언트에서 실행하여 공격자가 의도하는 행위를 수행할 수 있습니다. |
19 | Security | DO_NOT_BASE_SECURITY_CHECKS_ON_UNTRUSTED_SOURCES | 1 | 믿을 수 없는 소스를 사용한 보안검사는 위험합니다. |
20 | Security | DO_NOT_COMPARE_OR_INSPECT_THE_STRING_REPRESENTATION_OF_FLOATING_POINT_VALUES | 2 | 실수 값을 문자열 표현을 통해 비교하거나 검사하면 안됩니다. |
21 | Security | DO_NOT_LET_EXTERNAL_PROCESSES_BLOCK_ON_IO_BUFFERS | 3 | 입출력 버퍼에 대해 외부 프로세스가 블록되지 않도록 합니다. |
22 | Security | DO_NOT_LOG_UNSANITIZED_USER_INPUT | 2 | 검증되지 않은 유저 입력을 log에 사용하면 안됩니다. |
23 | Security | DO_NOT_OPERATE_ON_FILES_IN_SHARED_DIRECTORIES | 3 | 공유 디렉토리 안의 파일은 주의하여 사용해야 합니다. |
24 | Security | DO_NOT_OPERATE_ON_UNTRUSTED_FILE_LINKS | 3 | 신뢰 할 수 없는 파일링크 사용시 주의해야 합니다. |
25 | Security | DO_NOT_RELY_ON_THE_DEFAULT_AUTOMATIC_SIGNATURE_VERIFICATION | 1 | 기본으로 이루어지는 자동 서명 인증에 의존하는 것은 위험합니다. |
26 | Security | DO_NOT_RELY_ON_THE_WRITE_METHOD_TO_OUTPUT_INTEGERS_OUTSIDE_THE_RANGE_0_TO_255 | 3 | 0 에서 255 에 속하지 않은 정수값을 write 메소드를 사용하여 출력하면 안됩니다. |
27 | Security | ELIMINATE_NONCHARACTER_CODE_POINTS_BEFORE_VALIDATION | 1 | 입력 문자열을 검증하기 전에 캐릭터가 아닌 것들을 제거해야 합니다. |
28 | Security | EVAL_INJECTION | 2 | 외부에서 입력이 eval() 함수의 인자로 사용될 경우 외부에서 입력되는 JavaScript가 사용될 경우 공격자가 원하는 임의의 작업을 수행할 수 있습니다. |
29 | Security | EXCLUDE_UNSANITIZED_USER_INPUT_FROM_FORMAT_STRINGS | 3 | 검증되지 않은 유저 입력을 포맷 스트링에 사용하면 안됩니다. |
30 | Security | EXISTING_PASSWORD_RECOVERY | 4 | 비밀번호 복구 시 임시 비밀번호를 새롭게 설정하는 것이 아니라 파일 등 외부로부터 기존 비밀번호를 얻어와 할당하는 경우를 검출합니다. |
31 | Security | EXPOSURE_OF_ADMINISTRATION_PAGE | 4 | 쉽게 노출될 수 있는 관리자 페이지 이름으로 페이지를 작성할 경우(예: admin.jsp) 이를 검출합니다. |
32 | Security | EXPOSURE_OF_DANGEROUS_METHOD | 4 | 옵션을 통해 지정한 위험한 메소드가 public으로 선언되어 있거나, 혹은 public으로 선언된 다른 메소드 내에서 위험한 메소드를 호출하는 경우를 검출합니다. |
33 | Security | EXPOSURE_OF_SYSTEM_DATA | 2 | 디버깅 정보가 output stream이나 logging을 통해 새어나가는 경우 악의적인 공격을 계획할 수 있습니다. |
34 | Security | EXTERNAL_CONTROL_OF_SYSTEM_OR_CONFIGURATION_SETTING | 1 | 시스템 설정이나 구성 요소를 외부에서 제어할 수 있으면 예상치 못한 결과(예: 서비스 중단)를 초래하거나 악용될 가능성이 있습니다. |
35 | Security | FORBIDDEN.REPLACING_EMAIL_ADDRESS | 4 | E-mail 주소 변수의 값을 직접 다른 값으로 대체하는 경우를 검출합니다. |
36 | Security | FORMAT_STRING | 3 | System.out.format() 을 사용할 때 포맷 스트링을 사용하지 않거나 자료형과 맞지 않는 포맷 스트링을 사용하였을 경우를 검출합니다. |
37 | Security | HARD_CODED_USER_NAME_AND_PASSWORD | 2 | java.sql.DriverManager.getConnection에서 암호에 해당하는 파라미터로 상수 문자열이 들어가는 경우를 검출합니다. |
38 | Security | HTTP_RESPONSE_SPLITTING | 1 | HTTP 요청에 들어 있는 인자값이 HTTP 응답헤더에 포함되어 사용자에게 다시 전달되는 경우 입력값에 CR(Carriage Return) 이나 LF(Line Feed)와 같은 개행문자가 존재하면 HTTP 응답이 2개 이상으로 분리될 수 있습니다. |
39 | Security | IMPROPER_AUTHORIZATION | 1 | 사용자 인증 후 모든 실행 경로에 대하여 적절하게 접근 제어를 하지 못 하였을 경우 의도치 않게 정보가 누출될 수 있습니다. |
40 | Security | INCORRECT_PERMISSION_ASSIGNMENT_FOR_CRITICAL_RESOURCE | 2 | 설정파일, 실행파일, 라이브러리 등을 SW 관리자외의 사용자가 읽고 쓰기가 가능할 경우 권한을 갖지 않은 사용자가 해당 자원을 사용할 수 있습니다. |
41 | Security | INFORMATION_LEAK_ANDROID | 3 | 중요 정보(단말기 정보, 시스템 데이터 등)을 안드로이드의 SD카드에 저장하는 경우를 검출합니다. |
42 | Security | INSUFFICIENT_SESSION_EXPIRATION | 2 | 불충분한 세션 만료의 사례로서 HttpSession.setMaxInactiveInterval의 파라미터로 -1이 들어가는 경우를 검출합니다. |
43 | Security | INTEGER_OVERFLOW | 2 | 정수형 변수의 오버플로우는 정수값이 증가하면서, Java에서 허용된 가장 큰 값보다 더 커져서 실제 저장되는 값은 의도하지 않게 아주 작은 수이거나 음수가 될 수 있습니다. |
44 | Security | LDAP_INJECTION | 1 | 공격자가 외부 입력을 통해서 의도하지 않은 LDAP 명령어를 수행할 수 있습니다. |
45 | Security | LEAK.INFORMATION.PRIVILEGED_BLOCK | 2 | private이 아닌 메소드 내에서 java.security.AccessController.doPrivileged()를 호출하는 경우를 검출합니다. |
46 | Security | LEFTOVER_DEBUG_CODE | 4 | 디버거 목적으로 삽입된 코드를 검출합니다. |
47 | MISSING_AUTHENTICATION_CONTROL | 4 | 페이지 내에서 인증을 통한 제어 루틴을 호출하지 않는 경우를 검출합니다. | |
48 | MISSING_AUTHENTICATION_FOR_CRITICAL_FUNCTION | 2 | 사용자의 자격인증 과정을 수행하지 않았을 경우 보안검사를 우회하여 서버에 접근할 수 있습니다. | |
49 | MISSING_CHECK_OF_INPUT | 4 | 입력으로 사용되는 변수(옵션으로 지정)에 대해, if 등의 조건문으로 검사를 수행하지 않고 사용된 모든 경우를 검출합니다. | |
50 | MISSING_LOGIN_CONTROL | 4 | 로그인 루틴을 호출 할 시 횟수 제한 여부를 검출합니다. | |
51 | MISSING_PASSWORD_RECOVERY_CONTROL | 4 | 비밀번호 복구 루틴을 호출 할 시 횟수 제한 여부를 검출합니다. | |
52 | MULTIPLE_BINDS_TO_THE_SAME_PORT | 2 | 하나의 포트가 여러 개의 서비스에 사용되는 경우 전달되는 패킷의 도난 또는 도용을 할 가능성이 있습니다. | |
53 | NORMALIZE_STRINGS_BEFORE_VALIDATING_THEM | 1 | 문자열을 검증하기 전에 normalize 해야합니다. | |
54 | OPEN_REDIRECT | 1 | 외부로부터 받은 문자열을 URL 주소로 사용하여 자동으로 연결하는 서버 프로그램은 취약점을 가질 수 있습니다. | |
55 | PASSWORD_IN_COMMENT | 2 | 주석문내에 비밀번호에 대한 정보가 있을 경우 공격자에 의해 비밀번호가 노출될 가능성이 있습니다. | |
56 | PASSWORD_IN_SERVLET_COMMENT | 2 | 주석문내에 비밀번호에 대한 정보가 있을 경우 공격자에 의해 비밀번호가 노출될 가능성이 있습니다. | |
57 | PASSWORD_MANAGEMENT_HEAP_INSPECTION | 2 | 비밀번호를 문자열 객체에 저장하였을 경우 프로그램이 비정상적으로 중단되어, 메모리 덤프가 일어나는 경우에 데이터가 외부에 노출될 수 있습니다. | |
58 | PASSWORD_MANAGEMENT_PASSWORD_IN_REDIRECT | 2 | HTTP리다이렉트는 웹브라우저를 통해 HTTP GET명령어를 발생시킨다. 이 경우 주소창에 파라미터의 형태로 전송내용이 노출되어 민감한 정보가 유출된다. | |
59 | PASSWORD_SAVED_FILE_WITHOUT_ENCRYPTION | 2 | 비밀번호를 외부 환경 파일에 저장 또는 통신 채널을 통하여 내보낼 때 암호화를 하지 않는 다면 인증 받지 않은 주체에 의해서 데이터 노출, 또는 스니핑될 수 있습니다. | |
60 | PATH_TRAVERSAL | 1 | 외부의 입력을 통하여 "디렉토리 경로 문자열" 생성이 필요한 경우, 외부 입력에서 경로 조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 영역에 대한 경로 문자열이 가능해져 시스템 정보누출, 서비스 장애 등을 유발 시킬 수 있습니다. | |
61 | PERSISTENT_COOKIE | 1 | 외부의 신뢰할 수 없는 입력을 적절한 검사 과정을 거치지 않고 쿠키에 저장하는 것은 위험하다. | |
62 | PRIVATE_COLLECTION | 2 | 특정 클래스의 컬렉션 타입의 private 필드 들이 private이 아닌 메소드에 의해서 레퍼런스가 반환되는 경우를 검출합니다. | |
63 | PROCESS_CONTROL | 2 | 프로세스를 생성하는 java.lang.Runtime.load, java.lang.Runtime.loadLibrary, java.lang.System.load 및 java.lang.System.loadLibrary 메소드를 호출하는 경우를 검출합니다. | |
64 | PUBLIC_DATA_ASSIGNED_TO_PRIVATE_ARRAY | 2 | public으로 선언된 데이터가 private으로 선언된 배열에 저장할 경우 private 배열을 외부에서 접근할 수 있게 되어 접근 제어가 이루어 지지 않는다. | |
65 | RELIANCE_ON_DNS_LOOKUPS_IN_A_SECURITY_DECISION | 2 | DNS 서버는 스푸핑 공격 대상이기 때문에 DNS명에 의존할 경우, 공격자가 DNS를 수정하여 공격자 IP주소로 도메인명을 지정할 수 있습니다. | |
66 | RELIANCE_ON_UNTRUSTED_INPUTS_IN_A_SECURITY_DECISION | 2 | 사용자의 인증 정보를 쿠키에 저장할 경우 쿠키에 입력된 값이 공격자에 의해서 변경될 수 있습니다. | |
67 | RESOURCE_INJECTION | 1 | 외부의 신뢰할 수 없는 입력이 적절한 검사과정을 거치지 않고, 자원(resource) 식별자로 사용될 경우 부 적절한 자원 접근이 일어날 수 있습니다. | |
68 | SAFELY_EXTRACT_FILES_FROM_ZIPINPUTSTREAM | 3 | ZipInputStream으로 부터 파일들을 추출할 경우 파일 경로 및 사이즈에 주의해야 합니다. | |
69 | SANITIZE_UNTRUSTED_DATA_PASSED_TO_A_REGEX | 3 | 정규표현식에 사용되는 신뢰 할 수 없는 데이터는 항상 검증을 거쳐야 합니다. | |
70 | SECURITY.ARGUMENT.ASSERT | 2 | 메소드의 인자를 assert 구문에 사용했을 경우 검출합니다. | |
71 | SECURITY.ARGUMENT.DOPRIVILEGE | 1 | AccessController.doPrivileged() 메소드에서 외부 값이 검증 없이 사용될 경우를 검출합니다. | |
72 | SECURITY.ARGUMENT.LOGGER | 3 | 지정한 예외 처리 블록에서 java.util.logging.Logger 를 사용하여 로그를 작성할 경우를 검출합니다. | |
73 | SECURITY.ARGUMENT.READ.BYTE | 3 | read() 메소드의 인자가 byte[] 인 경우 길이 관련 인자가 없을 경우를 검출합니다. | |
74 | SECURITY.ARGUMENT.THREAD_POOL | 3 | 스레드 풀을 사용할 때 같은 풀을 사용하여 sub-task 를 수행할 경우를 검출합니다. | |
75 | SECURITY.ARGUMENT.XML_INJECTION | 1 | SAX 와 DOM 과 같은 XML parser 를 이용하여 파싱 할 때 외부에서 입력받은 값을 그대로 사용하였을 경우를 검출 합니다. | |
76 | SECURITY.ASSERT.BOOLEAN | 3 | Assert 문에서 메소드를 호출하거나 incremental, assignment 문을 사용할 경우 다음 실행 되는 문장에 영향을 미치게 됩니다. | |
77 | SECURITY.ASSIGN.BIG_INTEGER | 3 | BigInter.toByteArray() 를 byte[] 에 바로 할당 할 경우를 검출합니다. | |
78 | SECURITY.BIG_INTEGER_EXTENDABLE | 1 | BigInteger 클래스가 확장성을 유지되는 경우를 검출합니다. | |
79 | SECURITY.CALL.APPEND.LOOP | 3 | 컬렉션 관련 클래스에 삽입 메소드를 호출 할 경우를 검출 합니다. | |
80 | SECURITY.CALL.BIG_ENDIAN | 3 | Big endian 으로만 읽기/쓰기 가능한 메소드들을 호출 했을 경우 검출합니다. | |
81 | SECURITY.CALL.DEFAULT_READ_OBJECT | 3 | readObject 메소드 내에 defaultReadObject 메소드 호출이 있는지 확인 합니다. | |
82 | SECURITY.CALL.DELETE_ON_EXIT | 2 | createTempFile() 를 호출한 후에 deleteOnExit() 를 호출 할 경우 검출합니다. | |
83 | SECURITY.CALL.DEPRECATED | 1 | 보안에 취약하다고 여겨지는 메소드를 사용하였을 경우를 검출합니다. | |
84 | SECURITY.CALL.DO_PRIVILEGED | 1 | AccessController 클래스의 doPrivileged 메소드를 호출 할 때 두 번째 인자가 없을 경우를 검출 합니다. | |
85 | SECURITY.CALL.FILE_DELETE | 2 | 파일 객체의 인스턴스에서 delete() 를 단독으로 호출 했을 경우를 검출합니다. | |
86 | SECURITY.CALL.GET_CONTEXT_CLASS_LOADER | 1 | getContextClassLoader 메소드를 호출 할 경우 검출 합니다. | |
87 | SECURITY.CALL.KEY_EQUALS | 3 | key.equals 만 메소드 내에서 호출 되었을 경우를 검출합니다. | |
88 | SECURITY.CALL.LOCK_HOLDING | 3 | Synchronized 선언한 메소드 내부에 스레드를 멈추게 하는 메소드가 호출 될 경우 검출합니다. | |
89 | SECURITY.CALL.PUBLIC_METHOD | 3 | readObject 메소드 내에 오버라이딩하는 메소드 호출이 있을 경우 검출합니다. | |
90 | SECURITY.CALL.RAW_COLLECTION | 3 | 원시 타입의 컬렉션에서 메소드를 호출 할 경우를 검출 합니다. | |
91 | SECURITY.CALL.REFLECTION | 1 | 클래스, 메소드, 필드에 접근 권한을 설정할 수 있는 reflection 을 사용하였을 경우를 검출합니다. | |
92 | SECURITY.CALL.REFLECT_PERMISSION | 1 | java.lang.ReflectPermission 을 사용하여 권한을 얻을 경우 검출 합니다. | |
93 | SECURITY.CALL.REMOVE.LOOP | 3 | Loop 에서 바로 컬렉션의 아이템을 삭제 할 경우를 검출 합니다. | |
94 | SECURITY.CALL.SECURITY_CHECK | 1 | 지정한 메소드 내에 보안 검사를 하는 메소드 호출이 있는지를 확인 합니다. | |
95 | SECURITY.CALL.SHUTDOWN_HOOK | 1 | addShutdownHook 메소드가 호출 된 후에 halt 메소드 호출을 했을 경우를 검출합니다. | |
96 | SECURITY.CALL.SYSTEM_GETENV | 2 | System.getEnv()를 호출 했을 경우 검출합니다. | |
97 | SECURITY.CALL.THREAD_INTERRUPTED | 3 | 스레드를 상속하거나 Runnable 을 구현하는 클래스 에서 synchronized 블럭을 사용할 때 Thread.interrupted() 를 호출 하지 않는 경우 검출합니다. | |
98 | SECURITY.CALL.THREAD_START | 3 | 생성자 내에서 스레드를 실행하는 메소드가 호출될 경우 객체가 초기화 되기 전에 새로 만들어진 스레드에서 현재 객체의 this 참조에 접근 할 수 있기 때문에 검출합니다. | |
99 | SECURITY.CALL.THREAD_STOP | 3 | Thread.stop()을 호출 했을 경우 검출합니다. | |
100 | SECURITY.CALL.THROWS.FINALLY | 3 | 메소드에서 throw 한 예외들에 대한 예외처리를 하지 않았을 경우를 검출 합니다. | |
101 | SECURITY.CALL.UNLOCK | 2 | unlock() 메소드를 finally 블럭 내에서 호출 하지 않은 경우를 검출합니다. | |
102 | SECURITY.CALL.URL_EQUALS | 3 | URL.equals() 를 호출 할 경우 검출합니다. | |
103 | SECURITY.CALL.WAIT.LOOP | 3 | Synchronized 블럭 내에서 wait 또는 await 메소드가 반복문이 아닌 곳에 있을 경우 검출합니다. | |
104 | SECURITY.CAST.FLOAT_DOUBLE | 3 | float 형 변수를 int 또는 long 형으로 cast 할 경우, double 형 변수를 long 형으로 cast 할 경우를 검출합니다. | |
105 | SECURITY.CHECK.OVERRIDE_METHOD | 1 | 클래스를 상속할 때 보안 검사를 하는 메소드를 호출하지 않았을 경우를 검출합니다. | |
106 | SECURITY.CLASS.CLONE | 2 | 민감한 클래스를 상속하고 Cloneable 을 구현하는 클래스에서 상위 클래스인 민감한 클래스를 clone 할 경우를 검출합니다. | |
107 | SECURITY.CLASS.MUTABLE_COPY | 2 | 변경될 수 있는 클래스의 생성자 인자 값으로 변경될 수 있는 값을 받아 필드 값으로 할당 할 경우를 검출합니다. | |
108 | SECURITY.CLASS_IN_TRUST_PACKAGE | 1 | 신뢰 하지 못한 클래스를 import 할 경우를 검출 합니다. | |
109 | SECURITY.COMPARE.CLASS_NAME | 2 | 클래스 이름을 비교할 경우를 검출 합니다. | |
110 | SECURITY.COMPARE.CYCLIC_ORDER | 3 | compareTo 메소드 내에서 cyclic order를 나타내는 클래스가 사용된 경우를 검출합니다. | |
111 | SECURITY.DECLARE.CLASS_NAME.JSL | 3 | Java standard library 에 존재하는 클래스 명과 같은 클래스를 선언 할 경우 검출합니다. | |
112 | SECURITY.DECLARE.INPUTSTREAM.WRAPPER | 3 | 메소드 내에 BufferedInputStream 의 내부 인스턴스가 System.in 를 인자로 사용하여 생성되었을 경우를 검출합니다. | |
113 | SECURITY.DECLARE.INSTANCE.ORDER | 3 | 생성자 내에 필드 멤버의 연산을 할 경우에 필드 멤버와 instance 생성의 순서가 잘 못 되어 있을 경우를 검출 합니다. | |
114 | SECURITY.DECLARE.LOCK_OBJECT | 3 | Synchronized 블럭에서 사용하는 잠금 객체가 public 이거나 private volatile 일 경우 검출합니다. | |
115 | SECURITY.EXCEPTION_THROWING_CONSTRUCTOR | 1 | 생성자 내에서 예외를 생성하는 경우를 검출합니다. | |
116 | SECURITY.EXPRESSION.BITWISE_OPERATION | 3 | 하나의 식에 시프트 연산과 사칙 연산이 동시에 사용되었을 경우를 검출 합니다. | |
117 | SECURITY.FILE_AND_FLAG.LOOP | 3 | Volatile flag 또는 Thread.interrupted 메소드와 함께 파일 I/O 메소드를 While 문 표현식에 사용하였을 경우 검출합니다. | |
118 | SECURITY.FLOAT_MAX_VALUE | 3 | strictfp 를 사용하지 않았을 경우를 검출 합니다. | |
119 | SECURITY.IMPLEMENT.EXTERNALIZABLE | 2 | Externalizable 을 구현하는 클래스에서 read, write 메소드를 호출 할 경우 synchronize 블럭내에 if 블럭이 없을 경우를 검출 합니다. | |
120 | SECURITY.IMPROPER_RESTORATION_ON_FAILURE | 3 | try 블록에서 예외를 throw하고, 그 아래에서 필드에 값을 할당 하는 경우를 검출합니다. | |
121 | SECURITY.INCOMPLETE_STATIC_INITIALIZER | 1 | 정적 초기자 내에서 불완전하게 초기화될 수 있는 정적 필드들을 검출합니다. | |
122 | SECURITY.INFINITE_LOOP | 3 | 무한 루프 가능성이 있는 루프를 검출합니다. | |
123 | SECURITY.INFORMATION_LEAK.EXCEPTION | 2 | 특정 예외 처리를 하는 Catch 문 안에 정보가 유출 될 수 있는 메소드를 호출 한 경우를 검출합니다. | |
124 | SECURITY.INITIALIZER.THREAD | 3 | 정적 초기자 안에서 필드 변수를 사용하여 스레드 생성하는 경우 백그라운드 스레드를 사용하기 때문에 검출합니다. | |
125 | SECURITY.INNER_CLASS.SERIALIZABLE | 1 | 내부 클래스가 Serializable 을 구현할 때 정적 내부 클래스가 아닐 때 검출 합니다. | |
126 | SECURITY.INTER_CLASS_CYCLE | 3 | 초기화 순환은 예상치 못한 결과를 초래합니다. | |
127 | SECURITY.LOOP_VARIABLE_FINAL | 3 | For 문에서 인스턴스를 초기화 할때 타입 앞에 final 한정자가 있는지를 검사합니다. | |
128 | SECURITY.METHOD.LOCALE | 2 | 문자열에 toUpperCase(), 또는 toLowerCase()를 할 때 locale 설정이 없을 경우를 검출 합니다. | |
129 | SECURITY.METHOD.OVERRIDE | 2 | 지정한 메소드가 public 이지만 final 이 아닐 경우를 검출합니다. | |
130 | SECURITY.METHOD.OVERRIDE.CLONEABLE | 1 | clone() 메소드에서 오버라이딩이 가능한 메소드가 호출 될 경우를 검출합니다. | |
131 | SECURITY.METHOD.OVERRIDE.GETPERMISSIONS | 1 | URLClassLoader 를 상속받은 클래스의 getPermissions 오버라이딩 함수에서 super.getPermissions 를 호출하지 않는 경우를 검출합니다. | |
132 | SECURITY.METHOD.OVERRIDE.STATIC | 3 | 상속하는 클래스에 오버라이딩 메소드가 public 정적일 경우를 검출 합니다. | |
133 | SECURITY.METHOD.PROTECTED | 2 | 메소드가 protected 한정자를 갖지만 하위 클래스에서 public 으로 오버라이딩 할 경우를 검출합니다. | |
134 | SECURITY.METHOD.SERIALIZABLE | 2 | Serializable 을 구현하는 클래스에서 특정 메소드를 구현할 경우 보안 검사 메소드가 호출 하지 않으면 검출합니다. | |
135 | SECURITY.MISSING.ACCESS_PERMISSION | 3 | 파일 생성(작성) 시 올바른 권한 설정 없이 파일을 생성하는 경우를 검출합니다. | |
136 | SECURITY.PARTIALLY_INITIALIZED_OBJECT | 2 | 스레드 내부에서 생성될 때 부분적으로 초기화 되어 사용될 수 있는 객체를 검출합니다. | |
137 | SECURITY.PATTERN.METHOD_CHAINING | 3 | 스레드 안전하지 않은 메소드 체이닝 패턴을 검출 합니다. | |
138 | SECURITY.PATTERN.THREAD_PER_MESSAGE | 3 | 메시지 별 스레드 패턴에서 스레드 풀을 사용하지 않았을 경우를 검출 합니다. | |
139 | SECURITY.PRIVATE_FIELD.INNER_CLASS | 2 | 내부 클래스 안에 있는 public 메소드에서 외부 클래스의 private 필드를 사용 할 경우를 검출 합니다. | |
140 | SECURITY.PUBLISH_BEFORE_INITIALIZATION | 3 | 특정 클래스에서 초기화 전에 인스턴스에 publish 할 경우를 검출합니다. | |
141 | SECURITY.RETURN.INPUTSTREAM_READ | 1 | InputStream.read()의 반환 값을 정수형 변수로 받지 않고 -1 과 비교할 경우를 검출합니다. | |
142 | SECURITY.RETURN.INTEGER_DATA | 3 | long 타입의 변수에 readInt 메소드의 반환 값을 '0xFFFFFFFFL' 마스킹 없이 사용할 경우를 검출 합니다. | |
143 | SECURITY.RETURN.WRAP_OR_DUPLICATE | 1 | duplicate() 메소드를 통해 CharBuffer 형의 값을 복사하는 경우를 검출합니다. | |
144 | SECURITY.SERIALIZABLE.FIELD.TRANSIENT | 2 | 필드가 private transient 하지 않을 경우 검출합니다. | |
145 | SECURITY.SERIALIZABLE.METHOD_MODIFIER | 1 | readResolve 와 writeReplace 메소드가 protected 가 아닐 경우를 검출합니다. | |
146 | SECURITY.SERIALIZABLE.METHOD_OVERRIDE | 2 | Serializable 구현 메소드 들을 오버라이딩 하지 않았거나 예외를 생성하지 않을 경우를 검출합니다. | |
147 | SECURITY.SERIALIZABLE.PRIVATE_MUTABLE_COMPONENT | 3 | readObject 메소드 내에서 private으로 선언된 변경될 수 있는 구성 요소에 대한 defensive copy 가 없을 경우를 검출합니다. | |
148 | SECURITY.SPLIT_MULTI_BYTE_ENCODED | 1 | 문자열 클래스 내에서 다중 바이트 문자를 다룰 때 인코딩 문제가 발생할 경우를 검출 합니다. | |
149 | SECURITY.STRING.ENCODING | 3 | InputStreamReader, OutputStreamWriter 객체의 인코딩 관련 파라미터 타입도 검사합니다. | |
150 | SECURITY.SYNCHRONIZE.ATOMIC_VALUE | 3 | Atomic 값을 보장 받아야 하는 데이터 타입을 사용했을 경우 검출합니다. | |
151 | SECURITY.SYNCHRONIZE.BACK_COLLECTION | 3 | 다른 컬렉션에서 가져온 값으로 초기화 될 경우를 검출 합니다. | |
152 | SECURITY.SYNCHRONIZE.CLASS_LOCK | 3 | Synchronized 블럭에 사용되는 잠금 클래스에 private final 로 선언한 필드가 있을 경우 검출합니다. | |
153 | SECURITY.SYNCHRONIZE.GET_CLASS | 2 | Synchronize 블락에서 getClass() 메소드를 잠금 객체로 사용했을 경우를 검출 합니다. | |
154 | SECURITY.SYNCHRONIZE.IMMUTABLE_OBJECT | 3 | 변경 불가능한 객체 (Immutable object) 가 synchronized 하지 않은 메소드에서 사용될 경우를 검출 합니다. | |
155 | SECURITY.SYNCHRONIZE.LOCK_OR_CONDITION | 2 | Synchronized 블럭에 사용되는 잠금 인스턴스가 잠금과 Condition 인터페이스를 구현하는 클래스의 객체일 경우를 검출 합니다. | |
156 | SECURITY.SYNCHRONIZE.METHOD.LOCK_FIELD | 2 | Private 불린 타입의 필드를 메소드에서 공유 데이터로 사용 할 때 메소드가 synchronized 가 아닐 경우 검출합니다. | |
157 | SECURITY.SYNCHRONIZE.ORDER | 1 | 설정하고 해제하는 잠금 들이 같은 순서로 진행 될 경우 deadlock 이 발생할 수 있습니다. | |
158 | SECURITY.SYNCHRONIZE.REUSABLE_OBJECT | 2 | 재사용 가능한 객체를 synchronized의 잠금 객체로 사용했을 경우 검출합니다 | |
159 | SECURITY.SYNCHRONIZE.STATIC.FIELD | 3 | 정적 필드가 synchronized 블럭 안에 정의되지 않았을 경우를 검출합니다. | |
160 | SECURITY.THREAD.LOCAL.NOT_REINITIALIZED | 3 | ThreadLocal 타입의 필드를 가진 클래스에 대해서 execute() 메소드를 수행할 때, try-finally 블록을 사용하지 않은 경우를 검출합니다. | |
161 | SECURITY.THREAD.SHARED_VARIABLE | 2 | 현재 run 메소드에 있는 필드의 타입이 primitive 이며 volatile 이 아닐 경우를 검출 합니다. | |
162 | SECURITY.THROW.THREAD_POOL | 3 | 스레드 풀 객체 생성으로 Executors.newFixedThreadPool() 메소드를 사용하였을 경우를 검출 합니다. | |
163 | SECURITY.TYPE.AUTO_CONVERSION | 2 | 컬렉션 관련 객체의 메소드 호출 시 인자 타입이 연산에 의해 변경될 경우를 검출합니다. | |
164 | SECURITY.VARIABLE_IN_EXPRESSION | 3 | 하나의 식 안에서 한 변수가 두번 이상 update 되었을 경우를 검출합니다. | |
165 | SENSITIVE_COOKIE_IN_HTTPS_SESSION_WITHOUT_SECURE_ATTRIBUTE | 2 | 쿠키에 데이터를 저장할 때 Cookie 객체의 setSecure(true) 메소드를 호출하지 않았을 경우 공격자에게 단순한 텍스트의 형태로 노출될 수 있습니다. | |
166 | SIGN_SEAL_WRITE | 3 | 객체를 직렬화 할 때, sign, seal, write 의 순서로 호출해야 합니다. | |
167 | SQL_INJECTION | 1 | 클라이언트에서 응용프로그램으로 들어가는 입력데이터를 통하여 SQL 쿼리를 삽입, 또는 주입 가능할 때 발생합니다. | |
168 | SQL_INJECTION_HIBERNATE | 1 | 외부의 신뢰할 수 없는 입력을 적절한 검사 과정을 거치지 않고 Hibernate API의 SQL 질의문 생성을 위한 문자열로 사용하면 위험하다. | |
169 | SQL_INJECTION_JDO | 1 | 외부의 신뢰할 수 없는 입력을 적절한 검사 과정을 거치지 않고 JDO(Java Data Objects) API 의 SQL 또는 JDOQL 질의문 생성을 위한 입력 값으로 사용하면 취약하다고 판정합니다. | |
170 | SQL_INJECTION_PERSISTENCE | 1 | 외부의 신뢰할 수 없는 입력을 적절한 검사 과정을 거치지 않고, 질의문에 그대로 사용하면, 질의문의 의미를 왜곡 시키거나 그 구조를 변경하여 임의의 질의 명령어가 수행될 수 있습니다. | |
171 | SSI_INJECTION | 3 | 외부에서 입력된 문자열이 필터링 없이 SSI를 생성하는데에 사용되는 경우를 검출합니다. | |
172 | TOCTOU_RACE_CONDITION | 2 | 공유자원(예: 파일)을 여러 스레드가 접근하여 사용할 경우 교착상태, 경쟁조건 및 기타 동기화 오류등이 발생할 수 있습니다. | |
173 | TRUST_BOUNDARY_VIOLATION | 1 | 신뢰할 수 없는 데이터와 신뢰할 수 있는 데이터가 혼재하면, 프로그래머가 신뢰할 수 없는 데이터를 실수로 신뢰하여 사용할 수 있습니다. | |
174 | UNRESTRICTED_UPLOAD_OF_FILE | 2 | 업로드하는 파일 타입과 크기를 제한하지 않았을 경우 위험한 유형의 파일을 공격자가 업로드하거나 전송할 수 있습니다. | |
175 | UNTRUSTED_DATA_IN_PRIVILEGED_BLOCK | 1 | 파라미터로 전달된 신뢰할 수 없는 데이터가 곧바로 특권 블록 내에서 사용된 경우를 검출합니다. | |
176 | USE_A_SUBSET_OF_ASCII_FOR_FILE_AND_PATH_NAMES | 3 | 파일명과 파일패스에는 ASCII 문자의 부분집합만을 사용해야 합니다. | |
177 | USE_COMPATIBLE_ENCODINGS_ON_BOTH_SIDES_OF_FILE_OR_NETWORK_IO | 3 | 파일이나 네트워크 입출력을 사용 할 때 호환되는 인코딩을 사용하여 읽고 써야 합니다. | |
178 | USE_OF_HARDCODED_CRYPTOGRAPHIC_KEY | 2 | 암호화된 비밀번호를 소스코드 내에 하드코드 하였을 경우 하드코드된 암호화키를 사용할 경우 암호화된 정보가 유출되며 해쉬함수를 역계산을 하여 비밀번호를 알아낼 수 있습니다. | |
179 | USE_OF_INNER_CLASS_CONTAINING_SENSITIVE_DATA | 2 | 외부 클래스의 private 필드를 접근하지 않아야 합니다. | |
180 | USE_OF_INSUFFICIENT_RANDOM_VALUES | 2 | 예측 가능한 난수를 사용하였을 경우 공격자가 난수를 예측하여 시스템에 접근, 수정 및 삭제 등의 작업을 할 수 있습니다. | |
181 | USE_OF_INSUFFICIENT_RANDOM_VALUES_OWASP | 2 | 예측 가능한 난수를 사용하였을 경우 공격자가 난수를 예측하여 시스템에 접근, 수정 및 삭제 등의 작업을 할 수 있습니다. | |
182 | USING_DYNAMIC_CLASS_LOADING | 2 | 동적으로 코드를 로드하는 경우를 검출합니다. | |
183 | USING_HASH_WITHOUT_SALT | 2 | 비밀번호 저장시 솔트값 없이 비밀번호에 대한 해쉬값을 얻어 낼 경우 공격자는 레인보우 테이블과 같이 가능한 모든 비밀번호에 대해 해쉬값을 미리 계산하여 비밀번호를 찾을 수 있습니다. | |
184 | USING_WEAK_CRYPTOGRAPHIC_ALGORITHM | 2 | DES, RC2, RC4, RC5와 같이 취약한 암호화 알고리즘을 사용하는 경우를 검출합니다. | |
185 | WEAK_CRYPTOGRAPHIC_HASH_HARDCODED_SALT | 2 | 암호화에 사용되는 솔트 값이 하드코드로 작성되었을 경우, 솔트 값을 이용하여 해쉬 결과값을 역으로 계산하여 암호를 알아 낼 수 있습니다. | |
186 | WEAK_ENCRYPTION_INADEQUATE_RSA_PADDING | 2 | 적절치 못한 RSA Padding 인자를 사용할 경우 보안상 위협될 수 있습니다. | |
187 | WEAK_ENCRYPTION_INSUFFICIENT_KEY_SIZE | 2 | 암호화에 적용되는 키의 길이가 짧을 경우 암호화 알고리즘을 취약하게 만든다. | |
188 | WEAK_PASSWORD_REQUIREMENTS | 1 | 사용자에게 강한 비밀번호를 요구하지않는 경우 검출합니다. | |
189 | XPATH_INJECTION | 1 | 외부의 신뢰할 수 없는 입력을 적절한 검사 과정을 거치지 않고 XPath 질의문 생성을 위한 문자열로 사용하면 위험하다. | |
190 | XQUERY_INJECTION | 1 | XQuery 를 사용하여 XML 데이터에 접근하는 응용프로그램에서 외부의 입력이 질의문 문자열을 생성하는데 사용될 경우 위험하다. | |
191 | XSS | 1 | 외부에서 입력한 문자열을 필터링 없이 사용하여 결과 페이지를 생성할 경우 접속자의 권한으로 부적절한 스크립트가 수행되어 정보 유출될 수 있습니다. | |
192 | XSS.WARNING | 4 | 외부에서 입력한 문자열을 특정 조건부 필터링 등을 사용하여 결과 페이지를 생성할 경우 접속자의 권한으로 부적절한 스크립트가 수행되어 정보 유출될 수 있습니다. | |
193 | XSS_ATTRIBUTE | 4 | 외부에서 입력한 문자열을 필터링 없이 사용하여 결과 페이지를 생성할 경우 접속자의 권한으로 부적절한 스크립트가 수행되어 정보 유출될 수 있습니다. | |
194 | XSS_DOM | 2 | JSP의 document.write() 메소드와 같이 JSP의 DOM 객체 출력을 수행하는 메소드의 인자값으로 외부의 입력을 사용할 경우 열람하는 사용자가 피해를 입을 수 있습니다. | |
195 | XSS_ERROR_MESSAGE | 1 | 오류 메시지를 전송할 때 외부 입력과 함께 전송할 경우를 검출합니다. |
4) 결과 요약
○ 본 소스코드 품질 테스팅은 ‘취업00000 시스템’을 대상으로 진행하였음. 품질에 대한 영향도 평가 기준에 따라 ‘안전’ 결함 주의보 확인.
영향도 | 설 명 |
위험 | Level 1 ~ Level5 까지 21개 이상 결함이 발생할 경우. 시스템에 잠재적인 이슈로 인해 추후에 비즈니스 영역에 피해를 미칠 위험성이 존재 |
주의 | Level 1 ~ Level5 까지 10개 이상 ~ 21개 이내 결함이 발생할 경우. 시스템에 잠재적인 이슈로 인해 추후에 결함이 발생할 수 있는 상태 |
안전 | Level 1 ~ Level5 까지 10개 이내 결함이 발생할 경우. 서비스에 큰 영향을 미치지 않고 중요하지 않은 품질 정보가 노출된 상태 |
○ 소스코드 통계
- 소스 파일 개수 364개, 빌드 라인 수 37,296라인
○ Top 10 이슈 검출 파일
○ 이슈분포
- Level 1에서 95개, Level 2에서 29개, Level 3에서 19개, 위험도가 낮은 수준인 Level 4에서 151개, Level 5에서 0개 이슈 검출
○ Top 10 이슈 검출 체커
○ 체커 타입 : 보안
김영찬 (소프트웨어 품질 전문가)
(재)전주정보문화산업진흥원(JICA)
소프트웨어 개발자로 10년간 발로 코딩 하다가 한계를 느끼고,
2015년부터 소프트웨어 품질에 몸을 담고 기업을 돕고 있음
email. sweng@jica.or.kr / tel. 063-281-4113
주업무 : 소프트웨어 품질 컨설팅, 테스팅, KOLAS 기술책임자, 개발자 네트워크 운영
자격
- SP, CMMI, VSE(ISO 29110), ISMS(ISO 27001) 인증 심사원
- AIT, ISTQB FL, CSTS, 29119 외 다수
'테스팅' 카테고리의 다른 글
[테스팅] 2023년 테스팅 사례 공유 - 전주00000000 시스템 시큐어 코딩 진단 테스팅 지원 (42) | 2024.06.05 |
---|---|
[테스팅] 2023년 테스팅 사례 공유 - 농식품00000관리시스템 시큐어 코딩 진단 테스팅 지원 (0) | 2024.06.05 |
2023년 고품질 SW개발 테스팅 지원 현황 - 10개사 35건 (0) | 2024.01.17 |
[테스팅] GS인증 테스팅 무료로 지원해드립니다 (0) | 2023.07.11 |
[테스팅] 전라북도 소프트웨어 테스팅 지원 서비스 (수시 접수) (0) | 2023.07.11 |