본문 바로가기

테스팅

[테스팅] 2023년 테스팅 사례 공유 - 전주00000000 시스템 시큐어 코딩 진단 테스팅 지원

2023년 고품질 SW개발 컨설팅 및 테스팅 지원 사업 테스팅 사례 공유 합니다.

(재)전주정보문화산업진흥원의 SW품질역량센터에서는

2011년 부터 전라북도 ICT/SW기업을 대상으로 품질 향상을 위한 컨설팅 및 테스팅을 지원하고 있습니다.

 

목차

     

    1. 테스팅 개요

    - 기업명 : 000 테

    - 기업주소 : 전라북도 전주시 ***

    - 테스팅 내용 :  전주00000 시스템 시큐어 코딩 진단 테스팅

    구 분 제품 개요
    제품명(모듈명) 전주00000시스템 시큐어 코딩 진단 테스팅
    제품설명 전주0000홈페이지

     

    - 테스팅 목적 : 기업 개발 제품의 소스코드에 대한 보안 취약점 테스트를 통한 보안 취약점 진단 및 가이드를 진행하고, 보안 품질 강화를 통해서 고객에게 고품질 제품을 전달하기 위한 테스팅을 목표

     

    2. 테스팅 일정

    수 행 일 정 컨설팅 내용 담 당 자
    2023.06.16. 테스팅 신청 000 팀장
    2023.06.30. 소스코드 시큐어 코딩 분석 김영찬 선임
    000 팀장
    2023.07.04. 보고서 작성 김영찬 선임

     

    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 APISQL 질의문 생성을 위한 문자열로 사용하면 위험하다.
    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 JSPdocument.write() 메소드와 같이 JSPDOM 객체 출력을 수행하는 메소드의 인자값으로 외부의 입력을 사용할 경우 열람하는 사용자가 피해를 입을 수 있습니다.
    195   XSS_ERROR_MESSAGE 1 오류 메시지를 전송할 때 외부 입력과 함께 전송할 경우를 검출합니다.

     

    4) 결과 요약

    본 소스코드 품질 테스팅은 전주0000시스템을 대상으로 진행하였음. 품질에 대한 영향도 평가 기준에 따라 안전결함 주의보 확인.

    영향도 설 명
    위험 Level 1 ~ Level5 까지 21개 이상 결함이 발생할 경우. 시스템에 잠재적인 이슈로 인해 추후에 비즈니스 영역에 피해를 미칠 위험성이 존재
    주의 Level 1 ~ Level5 까지 10개 이상 ~ 21개 이내 결함이 발생할 경우. 시스템에 잠재적인 이슈로 인해 추후에 결함이 발생할 수 있는 상태
    안전 Level 1 ~ Level5 까지 10개 이내 결함이 발생할 경우. 서비스에 큰 영향을 미치지 않고 중요하지 않은 품질 정보가 노출된 상태

    [표 7] 영향도 평가 기준

     

    소스코드 통계

    - 소스 파일 개수 330, 빌드 라인 수 25,606라인

     

    Top 10 이슈 검출 파일

     

    이슈분포

    - Level 1에서 34, Level 2에서 32, Level 3에서 7, 위험도가 낮은 수준인 Level 4에서 176, 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 외 다수