Vardy 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

 

반응형