ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Keyword Note
    Certification/SW보안약점진단원 2023. 7. 15. 01:45

    [설계 단계]

    4분류 / 20가지 

    입력데이터 검증 및 표현 - 10

    보안 기능 - 8

    에러처리 -1

    세션통제 - 1

     

    1. 입력데이터 검증 및 표현

        1-1. DBMS 조회 및 결과 검증

            - DBMS 조회 시 질의문(SQL) 내 입력값과 그 조회결과에 대한 유효성 검증방법(필터링 등) 설계 및 유효하지 않은 값에 대한 처리 방법 설계

            * 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.

            * 외부입력값이 삽입되는 SQL쿼리문을 동적으로 생성해서 실행하지 않도록 해야한다. - ORM프레임워크 사용, 정적쿼리구조, ORM프레임워크에서 제공하는 함수를 사용하여 외부 입력값에 의해 SQL 질의문 구조가 변경되지 않도록

            * 외부입력값을 이용해 동적으로 SQL쿼리문을 생성해야하는 경우, 입력값에 대한 검증을 수행한 뒤 사용해야 한다. - 필터, 인터셉트(MVC프레임워크, 입력값 검증 작업 애플리케이션에 일괄 적용), 라이브러리/validator 

             * 필터링 대상 : ' " = & | ! ( ) { } $ % @ 예약어(UNION SELECT IF THEN) 함수(DATABASE() CONCAT() COUNT() )

     

     

        1-2. XML 조회 및 결과 검증

            - XML 조회시 질의문(XPath, XQuery 등) 내 입력값과 그 조회결과에 대한 유효형 검증방법(필터링 등) 설계 및 유효하지 않은 값에 대한 처리 방법 설계

            * XML 문서를 조회하는 기능을 구현해야하는 경우 XML쿼리에 사용되는 파라미터는 반드시 XML 쿼리를 조작 할 수 없도록 필터링해서 사용하거나, 미리 작성된 쿼리문에 입력값을 자료형에 따라 바인딩해서 사용해야 한다.

            * 필터링 대상 : " [ ]  / = @

     

        1-3. 디렉토리 서비스 조회 및 결과 검증

            - 디렉토리 서비스(LDAP 등)를 조회할 때 입력값과 그 조회결과에 대한 유효성 검증 방법 설계 및 유효하지 않은 값에 대한 처리 방법 설계

            * LDAP 인증서버로 인증을 구현하는 경우 인증요청을 위해 사용되는 외부입력값은 LDAP 삽입 취약점을 가지지 않도록 필터링 해서 사용해야 한다.

            * 필터링 대상 : = + < > # ; \

     

        1-4. 시스템 자원 접근 및 명령어 수행 입력값 검증

            - 시스템 자원 접근 및 명령어를 수행할 때 입력값에 대한 유효성 검증방법 설계 및 유효하지 않은 값에 대한 처리 방법 설계

            * 외부입력값을 이용하여 시스템자원(IP,PORT,프로세스,메모리,파일)등 식별하는 경우 허가되지 않은 자원이 사용되지 않도록 해야한다.

            * 서버 프로그램 안에서 쉘을 생성하여 명령어를 실행해야 하는 경우 외부입력값에 의해 악의적인 명령어가 실행되지 않도록 해야 한다. - 서버프로그램 안 셸 생성 지양, 외부 입력값이 직접적으로 사용 X, 사용되어야 하는 값 목록화, 프로퍼티나 XML 사용하여 허용 목록 작성

           * 필터링 대상 : | & ; 등

     

        1-5. 웹 서비스 요청 및 결과 검증

            - 웹 서비스(게시판 등) 요청(스크립트 게시)과 응답결과(스크립트를 포함한 웹 페이지)에 대한 유효성 검증 방법 설계 및 유효하지 않은 값에 대한 처리 방법 설계

            * 사용자로부터 입력받은 값을 동적으로 생성하는 응답페이지에 사용하는 경우 XSS 필터링을 수행한 뒤 사용해야 한다.

            * DB조회결과 동적으로 생성되는 응답페이지에 사용하는 경우 HTML인코딩 또는 XSS 필터링을 수행한 뒤 사용해야 한다.

     

        1-6. 웹 기반 중요 기능 수행 요청 유효성 검증

            - 비밀번호 변경, 결제 등 사용자 권한 확인이 필요한 중요기능을 수행할 때 웹 서비스 요청에 대한 유효성 검증방법 설계 및 유효하지 않은 값에 대한 처리방법 설계

            * 시스템으로 전송되는 모든 요청에 대해 정상적인 사용자의 유효한 요청인지 아닌지 여부를 판별 할 수 있도록 해야 한다. - CSRF 토큰, 사용자화 상호 처리 기능 - CAPTCHA, 재인증 요구

     

        1-7. HTTP 프로토콜 유효성 검증

            - 비정상적인 HTTP 헤더, 자동연결 URL 링크 등 사용자가 원하지 않는 결과를 생성하는 HTTP 헤더/응답결과에 대한 유효성 검증방법 설계 및 유효하지 않은 값에 대한 처리방법 설계

            * 외부입력값을 쿠키 및 HTTP 헤더정보로 사용하는 경우, HTTP 응답분할 취약점을 가지지않도록 필터링해서 사용해야 한다.

            * 외부입력값이 페이지이동(리다이렉트 또는 포워드)을 위한 URL로 사용되어야 하는 경우, 해당 값을 시스템에서 허용된 URL목록의 선택자로 사용되도록 해야 한다.

     

        1-8. 허용된 범위 내 메모리 접근

            - 해당 프로세스에 허용된 범위의 메모리 버퍼에만 접근하여 읽기 또는 쓰기 기능을 하도록 검증방법 설계 및 메모리 접근요청이 허용범위를 벗어났을 때 처리방법 설계

            * C/C++ 같이 메모리를 프로그래머가 관리하는 플랫폼을 사용하는 경우 메모리 버퍼의 경계값을 넘어서 메모리를 읽거나 저장하지 않도록 경계설정 또는 검사를 반드시 수행해야 한다. - Non-executable Stack, 랜덤스택(ASLR), 스택가드

            * 개발 시, 메모리 버퍼오버플로우를 발생시킬 수 있는 취약한 API를 사용하지 않도록 통제해야 한다.

     

        1-9. 보안기능 입력값 검증

            - 보안기능(인증, 권한부여 등) 입력 값과 함수(메소드)의 외부입력 값 및 수행 결과에 대한 유효성 검증방법 설계 및 유효하지 않은 값에 대한 처리방법 설계

            * 사용자의 역할, 권한을 결정하는 정보는 서버에서 관리해야 한다.

            * 쿠키값, 환경변수, 파라미터값 등 외부입력값이 보안기능을 수행하는 인자로 사용되는 경우, 입력값에 대한 검증작업을 수행한 뒤 제한적으로 사용해야 한다.

            * 중요상태정보나 인증, 권한결정에 사용되는 정보는 쿠키로 전송되지 않아야 하며, 불가피하게 전송해야하는 경우에듣 해당 정보를 암호화해서 전송해야 한다. - 암호화 혹은 HMAC으로 무결성 검사

     

        1-10. 업로드/다운로드 파일 검증

            - 업로드/다운로드 파일의 무결성, 실행권한 등에 관한 유효성 검증방법 설계 및 부적합한 파일에 대한 처리방법 설계

            * 업로드되어 저장되는 파일의 타입, 크기, 개수, 실행권한을 제한해야 한다.

            * 업로드되어 저장되는 파일은 외부에서 식별되지 않아야 한다. - 안전한 난수 파일명, 중복되지 않도록, 원본파일명과 저장경로/파일명 매핑정보 관리

            * 파일 다운로드 요청 시 요청파일명에 대한 검증 작업을 수행해야 한다.

            * 다운로드받은 소스코드나 실행파일은 무결성 검사를 실행해야 한다. - 체크섬(해시 값)

     

    2. 보안기능

        2-1. 인증 대상 및 방식

            - 중요정보/기능의 특성에 따라 인증방식을 정의하고 정의된 인증방식을 우회하지 못하게 설계

            * 중요기능이나 리소스에 대해서는 인증 후 사용 정책이 적용되어야 한다. - 중요기능 분류, 일괄적 인증

            * 안전한 인증방식을 사용하여 인증우회나 권한상승이 발생하지 않도록 해야 한다. - OTP, 실패 로깅

            * 중요기능에 대해 2단계(2-factor)인증을 고려해야 한다. - 멀티 디바이스 인증, 공인인증서, 바이오정보

               2단계 인증은 type1 - PW/PIN지식기반 type2-토큰/스마트카드-소유기반, type3-지문홍채생체기반 중 2개 이상

     

     

        2-2. 인증 수행 제한

            - 반복된 인증 시도를 제한하고 인증 실패한 이력을 추적하도록 설계

            * 로그인 기능 구현 시, 인증시도 횟수를 제한하고 초과된 인증시도에 대해 인증제한 정책을 적용해야 한다. - 계정 잠금, 추가 요구 등

            * 실패한 인증시도에 대한 정보를 로깅하여 인증시도 실패가 추적될 수 있게 해야 한다. - 영속성 있는 저장장치에 기록, 사용자 ID, 로그인 실패 횟수, 로그인 시도 시간, IP 주소, 계정 상태 등 포함

     

        2-3. 비밀번호 관리

            - 생성규칙, 저장방법, 변경주기 등 비밀번호 관리정책별 안전한 적용방법 설계

            * 비밀번호를 설정할 때 한국인터넷진흥원의 암호이용안내서->패스워드 선택 및 이용 안내서 의 비밀번호 생성 규칙을 적용해야 한다.

            * 네트워크로 비밀번호를 전송하는 경우 반드시 비밀번호를 암호화하거나 암호화된 통신 채널을 이용해야 한다. - TLS, VPN

            * 비밀번호 저장 시 솔트가 적용된 안전한 해쉬함수를 사용해야 하며 해쉬함수 실행은 서버에서 해야 한다. - 생성되는 다이제스트는 동일하므로 딕셔너리 공격 - 솔트로 방지, 32바이트 이상, 서버에서 실행 SHA-2계열(224 256 384 512) 이상

            * 비밀번호 재설정/변경안전하게 변경할 수 있는 규칙을 정의해서 적용해야 한다.

            * 비밀번호 관리 규칙을 정의해서 적용해야 한다.

     

        2-4. 중요자원 접근통제

            - 중요자원(프로그램 설정, 민감한 사용자 데이터 등)을 정의하고, 정의된 중요 자원에 대한 신뢰할 수 있는 접근통제 방법(권한 관리 포함) 설계 및 접근통제 실패 시 처리방법 설계

            * 중요자원에 대한 접근통제 정책을 수립하여 적용해야 한다.

            * 중요기능에 대한 접근통제 정책을 수립하여 적용해야 한다.

           SSI 인젝션?

            ACL, RBAC - 최소권한, 권한분리 

            * 관리자페이지에 대한 접근통제 정책을 수립하여 적용해야 한다. - URL쉽게 추측 X, 암호화통신채널, 별도포트, 접속가능한 IP 설정, 추가인증

     

        2-5. 암호키 관리

            - 암호키 생성, 분배, 접근, 파기 등 암호키 생명주기별 암호키 관리방법을 안전하게 설계

            * DB데이터 암호화에 사용되는 암호키는 한국인터넷진흥원의 암호이용안내서 에서 정의하고 있는 방법을 적용해야 한다.

            * 설정파일(xml, properties)내의 중요정보 암호화에 사용되는 암호키는 암호화해서 별도의 디렉터리에 보관해야 한다.      

            암호키 관리 수준 - FIPS 140-2 by NIST

     

        2-6. 암호연산

            - 국제표준 또는 검증필 암호모듈로 등재된 안전한 암호알고리즘을 선정하고 충분한 암호키길이, 솔트, 충분한 난수 값을 적용한 안전한 암호연산 수행방법 설계

            * 대칭키 또는 비대칭키를 이용해서 암호화를 수행해야 하는 경우 한국인터넷진흥원의 암호이용안내서 에서 정의하고 있는 암호화 알고리즘과 안정성이 보장되는 암호 키 길이를 사용해야한다. - 대칭키 128비트 비대칭키 2048비트

            * 복호화되지 않는 암호화를 수행하기 위해 해쉬함수를 사용하는 경우 안전한 해쉬 알고리즘솔트값을 적용하여 암호화해야 한다.

            * 난수 생성 시 안전한 난수 생성 알고리즘을 사용해야 한다. - FIPS 140-2 인증 받은 암호모듈의 난수생성기, 256비트 이상 seed 사용

     

        2-7. 중요정보 저장

            - 중요정보(비밀번호, 개인정보 등)를 저장/보관하는 방법이 안전하도록 설계

            * 중요정보 / 개인정보는 암호화해서 저장해야 한다.

            * 불필요하거나 사용하지 않는 중요정보가 메모리에 남지 않도록 해야 한다.

     

        2-8. 중요정보 전송

            - 중요정보(비밀번호, 개인정보, 쿠키 등)를 전송하는 방법이 안전하도록 설계

            * 인증정보와 같은 민감한 정보 전송 시 안전하게 암호화해서 전송해야 한다.

            * 쿠키에 포함되는 중요정보는 암호화해서 전송해야 한다.

     

    3. 에러처리

        3-1. 예외처리

            - 오류메시지에 중요정보(개인정보, 시스템정보, 민감정보 등)가 노출되거나, 부적절한 에러/오류 처리로 의도치 않는 상황이 발생하지 않도록 설계

            * 명시적인 예외의 경우 예외처리 블럭을 이용하여 예외발생 시 수행해야하는 기능이 구현되도록 해야한다.

            * 런타임 예외의 경우 입력값의 범위를 체크하여 어플리케이션이 정상적으로 동작할 수 있는 값만 사용되도록 보장해야 한다.

            * 에러가 발생한 경우 상세한 에러 정보가 사용자에게 노출되지 않게 해야 한다.

     

    4. 세션통제

        4-1. 세션 통제

            - 다른 세션 간 데이터 공유 금지, 세션 ID노출 금지, (재)로그인 시 기존 세션ID 재사용 금지 등 안전한 세션 관리방안 설계 ex) 불충분한 세션 관리(타임아웃, 재사용 등), 잘못된 세션에 의한 정보노출(다중 스레드 환경에서 싱글톤 객체 필드에 대한 레이스컨디션 발생 가능성)

            * 세션간 데이터가 공유되지 않도록 설계해야 한다. - 웹애플리케이션의 컨트롤러 컴포넌트 / 싱글톤 객체로 생성되는 서비스 컴포넌트는 클래스 멤버변수나 클래스변수가 세션간 공유될 가능성이 있음

            * 세션이 안전하게 관리되도록 해야 한다. - 세션 제거(Java의 경우 session.invalidate()), 일정시간 미사용 삭제, HttpOnly,패스워드변경시 재할당

            * 세션ID가 안전하게 관리되도록 해야 한다. - 안전한 서버에서 생성, 128비트, 안전산 난수알고리즘, URL Rewrite 금지, 주기적으로 세션ID 재할당, 로그인 시 이전 세션ID 파기 후 재할당

     

    [구현단계]

    7분류 / 49가지 17 16 2 3 5 4 2

    입력데이터 검증 및 표현 - 17

    보안기능 - 16

    시간 및 상태 - 2

    에러 처리 - 3

    코드 오류 - 5

    캡슐화 - 4 

    API 오용 - 2

     

    1. 입력데이터 검증 및 표현

        1-1. SQL 삽입

            * PreparedStatement - 컴파일된 쿼리문(상수)

            * 특수문자 및 쿼리 예약어 필터링

            * Spring, Struts 프레임워크 -> 외부 입력값 검증 모듈 / 보안 모듈

            PreparedStatement pstmt = con.prepareStatement(sql);

            pstmt.setSetring(1, gubun);

            (MyBatis)

            ${keyword} - 취약

            #{keyword} - 양호, 바인딩

            (Hibernate)

            query.setString(0, name); - 양호, 바인딩

            ?대신 :name 

            query.setParameter("name", name);

            (C#)

            string query = "Select * From Products Where ProductID = @ProductID";

            cmd.Parameters.AddWithValue("@ProductID", Convert.ToInt32(Request["ProductID"]);

     

        1-2. 코드 삽입 - 프로세스

            * 동적코드를 실행할 수 있는 함수 사용하지 않음

            * 실행 가능한 동적코드를 입력값으로 받지 않음

            * 외부 입력 값에 대하여 화이트리스트 방식 구현

            * 유효한 문자만 포함되도록 사용자 입력값 필터링

            (JAVA)

            String retValue = (String)scriptEngine.eval(src); - 취약, 외부 입력값을 javascript eval 실행

            if (src.matches("[\\w]*") == false) { ... - 양호, 특수문자 필터링

            (JSP)

            (new Function(<%=name%>))(); - 취약

            (PHP)

            eval('$myvar = ' . $_GET['arg'] . ';'); - 취약

            fwrite, include

     

        1-3. 경로 조작 및 자원 삽입

            * 외부 입력값을 자원 식별자로 사용하는 경우 적절한 검증

            * 사전에 정의된 적합한 리스트에서 선택되도록

            * 입력이 파일명인 경우 directory traversal 위험 문자 필터링(.. / \ 등)

               -> 필터링 하였으나 컨텍스트 경로에 접근 가능하므로 웹 및 서블릿 설정 파일에 접근 가능하여 취약

     

     

        1-4. 크로스사이트 스크립트

            * < > & " -> &lt; &gt; &amp; &quot; 치환 

              ' / ( ) -> &#x27; &#x2F; &#x28; &#x29;

              , % - DOM

            * HTML 인코딩

            * 허용되는 HTML 태그 화이트리스트로 만들어 해당 태그만 지원

            * 잘 만들어진 외부 라이브러리 활용(Lucy-XSS-Filter 등)

            <%=Encoder.encodeForJS(Encoder.encodeForHTML(keyword))%>); - 양호

            var sanitizedStr = Sanitizer.GetSafeHtmlFragment(str); - 양호

            (JSTL)

           <c:out value=”${param.name}” escapeXml=”false” /> - 취약

            <c:out value=”${param.name}” /> - 양호

             <!-- <%=param%> --> - 취약

            URL로 포함되어 이동하면 양호?

            문자형 아니면 양호

            subString 이용하여 글자 수가 짧게 제한되면 양호

     

        1-5. 운영체제 명령어 삽입 - 운영체제 명령어 exec(), system(), Runtime.getRuntime().exec

            * 검증 없이 시스템 내부 명령어로 사용하지 않는다

            * 명령어 생성에 필요한 값들을 미리 지정해놓고 외부 입력에 따라 선택하여 사용

            * | ; & : > 제거

            시스템 프로퍼티 사용 - 양호

            String cmdStr = EgovProperties.getPathProperty(Globals.SERVER_CONF_PATH

     

        1-6. 위험한 형식 파일 업로드

            * 화이트리스트 확장자

            * 파일명 추측할 수 없는 문자열로 변경

            * 저장경로는 web document root 밖

            * 실행속성 제겆

     

        1-7. 신뢰되지 않은 URL 주소로 자동접속 연결

            * URL,도메인 화이트리스트 관리

     

        1-8. 부적절한 XML 외부개체 참조 - XML 외부개체

            * 로컬 정적 DTD를 사용하도록 설정

            * 외부에서 전송된 XML에 포함된 DTD를 비활성화

            * 비활성화 불가능한 경우에 외부 엔티티 및 외부 문서 유형 선언을 각 파서에 맞는 고유한 방식으로 비활성화

            Student employee = (Student) jaxbUnmarshaller.unmarshal( document ); - 외부 doc 마샬링 취약

     

        1-9. XML 삽입 - XQuery, XPath 질의문

            * XQuery 또는 Xpath 쿼리에 사용되는 외부 입력데이터에 대하여 특수문자 및 쿼리 예약어를 필터링
    하고 파라미터화된 쿼리문을 지원하는 XQuery를 사용한다.

            (XQuery)

            String es = "doc('users.xml')/userlist/user[uname='$xname']";

            expr.bindString(new QName("xname"), name, null); - 바인딩 양호

            (XPath)

            XQuery xquery = new XQueryFactory().createXQuery(new File("login.xq"));   

            vars.put("loginID", nm); - 양호 파라미터화된 쿼리

     

        1-10. LDAP 삽입

            * DN과 필터에 사용되는 사용자 입력 값에는 특수문자 제거( * ( ) = + < > # ; \ 등)

            oDE = new DirectoryEntry(GetStrPath()) - 취약, 인증하지 않음

            oDE = new DirectoryEntry(GetStrPath(), userSN, userPW); - 양호 인증 후 LDAP 

     

        1-11. 크로스사이트 요청 위조

            * POST

            * CSRF 토큰

            * 중요로직 재인증

     

        1-12. 서버사이드 요청 위조

            * 화이트리스트

            * 내부 값 블랙리스트

            * 인증, 접근권한 확인 후 요청

     

        1-13. HTTP 응답분할

            * CR, LF 필터링 \r\n

     

        1-14. 정수형 오버플로우 - 허용된 정수 값 범위 벗어나

            * 언어/플랫폼 별 정수타입 변화 확인

            int usrNum = checked(Int32.Parse(args[0])); - 양호, checked 구문을 사용하여 오버플로우의 발생 여부 및 크기 확인

     

        1-15. 보안인증 결정에 사용되는 부적절한 입력 값 - 보안기능 결정에 검증되지 않은 외부 입력 값을 허용하여 보안기능을 우회하는 보안약점

     

     

        1-16. 메모리 버퍼 오버플로우 - 메모리 버퍼의 경계값을 넘어서 메모리를 읽거나 저장하여 예기치 않은 결과 발생

            * 메모리 크기 검사

            * 마지막 데이터 null

     

     

        1-17. 포맷 스트링 삽입

            * printf(), snprintf() 등 포맷 문자열을 사용하는 함수를 사용할 때는 사용자 입력값을 직접적으로 
    포맷 문자열로 사용하거나 포맷 문자열 생성에 포함시키지 않는다. 

            * C언어 국한 X - JAVA 시간정보 탈취 예시 

     

    2. 보안기능

        2-1. 적절한 인증 없는 중요 기능 허용 - 중요정보(금융정보, 개인정보, 인증정보 등)를 적절한 인증없이 열람(또는 변경) 가능한 보안약점

     

        2-2. 부적절한 인가 - 중요자원에 접근할 때 적절한 제어가 없어 비인가자의 접근이 가능한 보안약점

            * ACL 관리

            * 공격노출면 최소화(기능을 역할에 따라 배분 )

     

        2-3. 중요한 자원에 대한 잘못된 권한 설정 - 중요자원에 적절한 접근 권한을 부여하지 않아 중요정보가 노출/수정 가능한 보안약점

            umask(0); - 취약

            umask(077); - 양호

     

        2-4. 취약한 암호화 알고리즘 사용

        2-5. 암호화되지 않은 중요 정보

     

        2-6. 하드코드된 중요 정보

        2-7. 충분하지 않은 키 길이 사용

        2-8. 적절하지 않은 난수 값 사용

            java.security.SecureRandom() 클래스

           Random(), Math,random() 사용 불가

            java.util.Random() <- 고정된 seed 설정하면 동일난수, 매번 변경되는 seed 쓰더라도 보안결정을 위해서는 사용 불가

     

        2-9. 취약한 비밀번호 허용

     

        2-10. 부적절한 전자서명 확인

            JarFile jf = new JarFile(f); - 취약

            JarFile jf = new JarFile(f, true);

            CoeSigner[] signers = en.getCodeSigners(); - 양호

     

        2-11. 부적절한 인증서 유효성 검증 

            * SELF SIGN 취약 

            * CN 확인 필요

            * CRL 인증서 해지 목록

            * OCSP 실시간 인증서 상태 확인

            결과 값이 X509_V_OK 이외의 값을 허용하는지 확인

     

        2-12. 사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출

        2-13. 주석문 안에 포함된 시스템 주요 정보

        2-14. 솔트 없이 일방향 해쉬 함수 사용

        2-15. 무결성 검사 없는 코드 다운로드

            * 체크섬을 통한 코드 무결성 확인

     

        2-16. 반복된 인증시도 제한 부재

     

    3. 시간 및 상태

        3-1. 경쟁조건 : 검사 시점과 사용 시점(TOCTOU) - synchronized, mutex(mutex_lock) / 레이스컨디션

        3-2. 종료되지 않는 반복문 또는 재귀 함수

     

    4. 에러 처리

        4-1. 오류 메시지 정보 노출

             e.printStackTrace(); - 취약

            System.err.print(e.getMessage()); - 취약 

            Console.WriteLine(e); - 취약

            logger.error("ERROR-01: 파일 열기 에러"); - 양호

        4-2. 오류상황 대응 부재

        4-3. 부적절한 예외 처리

     

    5. 코드 오류

        5-1. Null Pointer 역참조

           null인지 검사하는 if문 추가 (여러 조건문 중 앞에 있어야 함)

     

        5-2. 부적절한 자원 해제

            finally 에서 자원 해제 해야 함 .close()

            using구문 으로 자원을 할당하면 구문이 끝나는 시점에서 자동 해제(C#)

            오류 발생 하던 안하던 fclose()

            함수의 역할 자체가 자원을 return하는 것이라면 해제는 호출하는쪽의 역할이므로 양호

        5-3. 해제된 자원 사용

            free 이후에 참조 X 마지막에 free

        5-4. 초기화되지 않은 변수 사용

            변수의 초기값은 항상 지정

        5-5. 신뢰할수 없는 데이터의 역직렬화

            readObject(); (ObjectInputStream.readObject())

            서명값 검증(signedMap.verfity) 후 getObject

     

    6. 캡슐화

        6-1. 잘못된 세션에 의한 데이터 정보 노출

            <%! ,,, %> 취약(선언부)

            <% ... %> 양호(서블릿) / 안에 클래스 있고 private아니면 ㄱㅊ, final 쓰면 ㄱㅊ

            클래스나 컨트롤러 사이에서 private로 선언 취약 - 멤버 변수로 선언되어 스레드간 공유, 지역변수로 선언하여 스레드간 공유되지 않도록 해야함

     

        6-2. 제거되지 않고 남은 디버그 코드

        6-3. Public 메서드로부터 반환된 Private 배열

            .clone()

            String은 복사만 해도 됨

     

        6-4. Private 배열에 Public 데이터 할당

            .clone()

            String은 복사만 해도 됨 / String도 그대로 return 하면 취약

     

    7. API 오용

        7-1 DNS lookup에 의존한 보안 결정

               도메인에 의존하지 않고 IP비교

        7-2. 취약한 API 사용

              취약 - strcat(), strcpy(), strncat(), strncpy(), sprintf(), gets(), Socket, System.exit()-JAVA, Application.Exit()-C#

              양호 - strcat_s(), strcpy_s(), strncat_s(), strncpy_s(), sprinf_s(), gets_s(), fgets(), URLConnection

     

    필터링 문자열 체크

     

    참고 자료 :

    https://www.kisa.or.kr/2060204/form?postSeq=9&page=1 

     

    KISA 한국인터넷진흥원

     

    www.kisa.or.kr

    https://www.kisa.or.kr/2060204/form?postSeq=5&page=1 

     

    KISA 한국인터넷진흥원

     

    www.kisa.or.kr

     

    반응형

    'Certification > SW보안약점진단원' 카테고리의 다른 글

    SW보안약점진단원 취득 후기  (2) 2023.07.28

    댓글

Designed by Tistory.