728x90
반응형
SMALL

SW개발보안가이드중 구현단계에서의 점검항목은 크게 7가지 이다.  (입보시에코캡아)
  1. 입력데이터 검증 및 표현
  2. 보안기능
  3. 시간 및 상태
  4. 에러처리
  5. 코드오류
  6. 캡슐화
  7. API 오용
       7-1.DNS Lookup 에 의존한 보안결정
       7-2. 취약한 API사용

이 장에서는 "7.API 오용" 에 대한 점검항목을 설명한다.


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

구분 설명
원인/영향 DNS Lookup 명령어를 통해 얻은 도메인명을 가지고 유효성을 판단하는 경우 DNS 위변조시에는
잘못된 도메인명에 의해서 트래픽이 공격자를 경유하게 될 수도 있고, 공격자가 마치 동일 도메인에
속한 서버인 것처럼 위장할 수 있다
대응 보안결정에 DNS 조회결과를 사용하지 않는다. -> IP주소를 직접 참조한다.

취약)
String ip = req.getRemoteAddr();
InetAddress addr = InetAddress.getByName(ip); <-- ip에 대한 도메인명을 조회
if (addr.getCanonicalHostName().endWidth('trustme.com")) {  <-- 조회된 도메인명으로 체크
      ………….
}

안전)
String ip = req.getRemoteAddr();
if (ip == null || "".equals(ip)) return;
String trustedAddr = "127.0.0.1" ;
if (ip.equals(trustedAddr)) {    <-- ip 주소값으로 체크
       .........
 }



7-2. 취약한 API사용

구분 설명
원인/영향 ① J2EE 애플리케이션이 컨테이너에서 제공하는 자원연결관리를 사용하지 않고 직접 제작하는 경우
② J2EE 애플리케이션이 프레임워크 메소드를 호출하지 않고 Socket을 직접 사용하는 경우
③ J2EE 애플리케이션에서 System.exit() 사용은 컨테이너까지 종료시킨다. 
대응 ① 컨테이너에서 제공하는 자원연결관리 기능을 사용한다
② Socket 을 직접 사용하지 않고 프레임워크 메소드를 호출하여 사용한다.
③ J2EE 애플리케이션에서 System.exit() 을 사용하지 않는다.

취약) conn = DriverManager.getConnection(url, user, pw);   <-- 자원에 대한 직접 연결 하고 있음
안전) DataSource datasource = (Datasource) ctx.lookup(CONNECT_STRING);  <-- 연결 스트링
        conn = datasource.getConnection():  

취약) socket = new Socket ("kisa.co.kr", 8080) ;    <-- 소켓으로 직접 연결 시도
안전) URL url = new URL ("http://127.0.0.1:8080/DataServlet");
       URLConnection urlConn = url.openConnection();

취약) catch (EXception e) {
           System.exit(1);
       }

 

728x90
반응형
LIST
728x90
반응형
SMALL

이번 장에서는 SW개발보안가이드중 분석/설계단계에서 검증해야할 항목중 <보안기능>
에 관한 8가지 점검항목에 대해서 설명하고자 한다.
이 장도 SW보안약점진단원 시험에 제일 많이 나오는 범위이기도 하다.


SR2-1. 인증 대상 및 방식

항목 설명
1) 인증후 사용 중요기능이나 리소스에 대해서는 인증 후 사용 정책이 적용되어야 한다.
- 중요기능 식별하고 식별된 중요기능에 대해서 일괄적으로 인증을 처리하는
  시스템을 설계   ① 컴포넌트 ② 라이브러리 ③ Servlet Filter
2) 안전한 인증방식
   (일회용패스워드)
 안전한 인증방식을 사용하여 인증우회나 권한상승이 발생하지 않도록한다.
     <일회용 패스워드>
   - 일회용 패스워드는 시각정보, 이벤트정보, 질의응답방식으로 취득한 정보를 이용
     하여 생성할 수 있다
   - 일회용 패스워드는 시간적 제한을 설정해야 한다. (금융권 30~60초)
   - 일회용 패스워드는 중복및 유추가 불가능하도록 6자리 이상이 숫자 및 문자로
     구성한다.
   - OTP발생기와 인증서버에서 동일한 정보를 생성해야 한다.
3) 2 Factor 인증 중요기능에 대해서는 2단계 인증을 고려한다.
   - Type1 : 지식기반  Type2 : 소유기반  Type3:생체기반
   - 로깅기능 마련
구현단계 적절한 인증기능이 없는 중요기능 허용
DNS Lookup에 의존한 보안결정


SR2-2. 인증 수행 제한

항목 설명
1)인증시도 횟수 제한 인증시도횟수 제한하고, 초과된 시도에 대해서는 인증제한 정책 적용
  - 5회 이내로 제한
  - 자동입력방지 문자 
2)실패한 인증시도 로깅 실패한 인증시도에 대해서는 로그를 남겨서 추적할수 있게 한다.
구현단계 반복된 인증시도 제한 기능 부재



SR2-3. 비밀번호 관리

항목 설명
1)패스워드 설정규칙 <안전하지 않은 패스워드>
 - 한글,영어 등을 포함한 사전적인 단어로 구성된 패스워드
 - 스펠링을 거꾸로 한 패스워드
 - 널리 알려진 단어로 구성된 패스워드 (컴퓨터용어 사이트,기업 등의
                                            특정명칭으로 구성된 패스워드)
 - 사용자ID를 이용한 패스워드
 - 제3자가 쉽게 알수 있는 개인정보를 바탕으로 구성된 패스워드
   (가족생일, 주소,휴대폰번호 등)
 - 패턴이 존재하는 패스워드
    (동일한 문자의 반복, 키보드상에 연속한 위치에 존재하는
    문자들의 집합)
 - 숫자가 제일 앞이나 제일 뒤에 오는 구성의 패스워드 (security1, may12)
 - 숫자와 영문자를 비슷한 문자로 치환한 형태를 포함한 구성의 패스워드
    (영문자 O 을 숫사 0 으로 , 영문자 I 를 숫자 1 로 치환)
 - 특정 인물의 이름을 포함한 패스워드
    (사용자, 유명인 연예인등)
 - 한글발음을 영문으로, 영문단어의 발음을 한글로 변형한 형태의 패스워드
 - 시스템에서 예시로 제시되는 패스워드
 - 시스템에서 초기로 설정된 패스워드
 - 이전에 사용했던 패스워
2) 패스워드 암호화,통신채널  - 암호화하거나 암호화된 전송채널 이용 (TLS , VPN)
   TLS_RSA_WITH_AES_256_CBC_SHA …
3) salt가 적용된 해쉬함수  - SHA-2 이상   (SHA-1, MD5 등은 안전하지 않음)
 - 솔트값은 랜덤하게 생성
 - 솔트값은 암호키가 저장되는 장소에 저장
4) 패스워드 재설정, 변경 규칙  - 기존 패스워드 확인
5) 패스워드 관리규칙  - 변경주기
 - 만료기간 설정, 최소사용기간 설정
 - 성공한 로그인 시간 관리 (사용자에게 알림으로써 도용여부 확인)
구현단계 하드코드된 비밀번호
취약한 비밀번호 허용



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

항목 설명
1) 중요자원에 대한 접근통제  - 중요자원에 대한 접근권한을 최소한으로 설정한다.
 - ACL이나 RBAC를 적용
2) 중요기능에 대한 접근통제  - 접근권한은 최소한으로
 - RBAC를 적용
 - 개별적용을 하는 경우 코딩규칙이 개발가이드에 반영되었는지..
3) 관리자 페이지  접근통제  - URL은 쉽게 추측할 수 없도록 설정한다. 
       -> 도메인 대신 IP를 통해서 접속하도록)
 - 원격연결시 암호화 통신채널 사용
 - 외부망에 있는 경우 
           ① IP통제, ② 80이 아닌 별도포트 사용, ③ SSL적용, ④ 추가인증
 - 내부망에 있는 경우 
           ① 80이 아닌 별도포트 사용, ② SSL적용 권고
구현단계 부적절한 인가
중요한 자원에 대한 잘못된 권한 설정



SR2-5. 암호키 관리

항목 설명
1) 암호키 관리규칙  - DB데이터 암호화에 사용되는 암호키는 DB와는 물리적으로 분리된 
   장소에 별도보관
 - 패스워드나 암호키는 메모리에 저장하지 않으며 설사 저장했더라도 
   사용종료 후 즉시 메모리를 0 으로 초기화한다
 - 암호키 생성 및 변경시 암호키에 대한 백업기능을 구현한다.

< FIPS 140-2 레벨분류 >
  ① Level1 - 암호모듈에 대한 기본적인 보안요구사항만을 충족하여
                 최소한의 보안
  ② Level2 - 침입자의 불법적인 접근을 방지하고 침입이후에 변조를
                 나타내는 증거를 제공함으로써 물리적인 보안매커니즘을
                 제공
  ③ Level3 - 강력한 변조 탐지 및 대응의 일환으로 침입을 감지하면
                 저장된 키 삭제
  ④ Level4 - 암호모듈의 외부의 전압이나 온도등을 감지하여 슈퍼쿨링
                 등 환경의 이상변화 시, 암호키를 삭제한다.
2) 설정파일內 중요정보 암호화  - 설정파일내 중요정보 (DB계정정보, 시스템중요정보) 가 암호화해서
   저장
구현단계 하드코드된 비밀번호
주석문안에 포함된 시스템 주요 정보

*** 암호키 종류별 유효기간 ***

키종류 사용유효기간
송신자 사용기간 수신자 사용기간
대칭키 비밀키 최대 2년 최대 5년
공개키 암호화 공개키 최대 2년
  복호화 개인키 최대 2년
  검증용 공객키 최소 3년
  서명용 개인키 최대 3년

 

SR2-6.  암호연산 (알고리즘 / 키길이 / 해쉬알고리즘+salt /난수)

항목 설명
1) 안전한 암호 알고리즘 <대칭키>
 - 안전 : AES, SEED, ARIA,  3DES, Blowfish, KASUMI
 - 취약 : DES, RC5, MD5…
<공개키>
 - 안전 : RSA, ECC, ECDSA, KCDSA
2) 안전한 암호키 길이  - 대칭키 : 128 bit 이상
 - 공개키 : 2048 bit 이상
 - 타원곡선 : 256 bit 이상
3) 안전한 해쉬알고리즘+Salt  - SHA-2 이상 (SHA-224, 256, 384, 512)
4) 안전한 난수생성 알고리즘  - FIPS 140-2 인증을 받은 암호모듈의 난수생성기와 256 비트 이상의 
   Seed를 사용하여 난수를 생성한다.
 - 난수의 무작위성을 보장하기 위해 이전 난수생성 단계의 결과를 다음 
   난수생성 단계의 Seed로 사용하는 의사난수생성기를 이용한다.
 java.math.Random() - 취약
   java.util.Random() , java.security.SecureRandom() - 안전
구현단계 취약한 암호화 알고리즘 사용
충분하지 않은 키 길이 사용
솔트없이 일방향 해쉬함수 사용
적절하지 않은 난수값 사용



SR2-7. 중요정보 저장

항목 설명
1) 중요정보 암호화 저장  - 중요정보 또는 개인정보는 암호화 해서 저장한다.
   (사용자 하드디스크에 저장된 쿠키를 통한 정보노출)
 - 특히, 쿠키, HTML5로컬저장소와 같은 클라이언트 즉 하드드라이브에 중요
   정보가 저장되지 않도록 한다., 부득히 저장 시 암호화해서 저장
2) 메모리에 중요정보 제거  - 중요정보가 메모리에 남지않도록..

<입력폼 자동완성 비활성화>
<input type=text name=id  autocomplete=off>
  -> 이 기능이 활성화되면 캐싱되기 때문..
구현단계 중요정보 평문 저장
사용자 하드디스크에 저장되는 쿠키를 통한 정보노출



SR2-8. 중요정보 전송

항목 설명
1) 중요정보 암호화 전송  - 인증정보와 같이 민감한 정보는
     ①암호화해서 전송하거나
     ②암호화된 통신채널로 전송
2) 쿠키의 중요정보 암호화 전송 - 쿠키에는 중요정보가 포함되지 않도록 설계하며, 부득이 쿠키에 중요정보가
   포함된 경우에는 반드시 세션쿠키로 설정히야 하며, 전달되는 중요정보는
   암호화해서 전송해야 한다.
   

 

728x90
반응형
LIST

+ Recent posts