가. 원인 - 재귀함수의 순환횟수를 제어하지 않아 자원을 과다하게 사용하는 경우 나. 영향 - 귀납조건 없이 재귀함수를 호출하여 무한루프에 빠짐 - 자원고갈을 유발하여 정상 서비스 불가 다. 보안대책 - 재귀함수 사용 시 호출횟수를 제한 라. 안전한 코드 1. 재귀함수 종료조건 int factorial( int num ) { // 팩토리얼 계산을 위한 재귀함수의 종료조건 적용 if ( num
가. 원인 - 병렬실행 환경에서 공유자원의 검사시점과 사용시점의 공유자원의 상태가 달라 오작동을 일으키는 경우 나. 영향 - 프로그램이 교착상태 발생 - 경쟁자원의 변조나 삭제 등을 통해 동기화 오류 발생 다. 보안대책 - 경쟁자원에 여러 스레드가 접근 시 동기화 사용 - 동기화 구문(Synchronized)을 이용하여 한번에 하나의 스레드만 접근하도록 구현 - 동기화 구문은 임계코드 주변에만 적용 라. 안전한 코드 1. 동기화 구문 사용 class FileManager extends Thread { private static final String SYNC = "SYNC"; private String mode = "READ"; public FileManager( String mode ){ this.mo..
가. 원인 - 일정시간 내 여러번의 인증실패 시 계정잠금 또는 추가인증이 충분하지 않을 경우 나. 영향 - 무차별 대입 인증시도 등을 통해 로그인 및 권한획득 다. 보안대책 - 인증로직 구현 시 인증시도 횟수를 제한 - 인증실패 초과 시 계정잠금 또는 추가 인증과정을 수행 라. 안전한 코드 1. 인증시도 횟수제한 ... String loginID = request.getParameter( "id" ); String loginPW = request.getParameter( "pass" ); ... // 인증 처리 전 현재 실패횟수를 체크 // 5회 이상 실패 시 계정잠금 int loginFailCnt = dbms.getLoginFailCnt( loginID ); if ( loginFailCnt >= 5 )..
가. 원인 - 원격으로 소스코드나 실행파일을 다운로드 후 무결성 검사없이 사용할 경우 나. 영향 - 호스트 파일을 변조하여 DNS 스푸핑 - 악성코드가 삽입된 소스코드를 실행 - 변조된 데이터를 사용하여 의도하지 않은 결과를 유발 다. 보안대책 - 안전한 암호화 기법을 적용 후 전송 및 사용 시 복호화 - 최소한의 권한으로 다운로드한 코드를 실행 라. 안전한 코드 1. 안전한 암호화 적용 1. 파일생성 String jarFile = "./download/util.jar"; byte[] loadFile = FileManager.getBytes( jarFile ); // 개인키로 파일을 암호화 loadFile = encrypt( loadFile, Encrypt.PRIVATE_KEY ); FileManager..
가. 원인 - 일방향 해쉬 함수를 사용할 때 솔트를 적용하지 않은 경우 나. 영향 - 레인보우 테이블 등을 통해 모든 해쉬값을 미리 계산하여, 암호문의 원문을 추출 다. 보안대책 - 해쉬 값을 생성할 때 반드시 솔트를 적용 라. 안전한 코드 1. 솔트 적용 public String getPasswordHash( String password, byte[] salt ) { MessageDigest md = MessageDigest.getInstance( "SHA-256" ); md.reset(); md.update( salt ); String result = md.digest( password.getBytes() ); return result; } 마. 진단방법 1. 해쉬함수 사용하는 소스코드를 확인 2. ..
가. 원인 - 주석문 안에 시스템 중요정보가 작성되어 있는 경우 - 개발과정에서 개발편의상 중요정보를 포함하여 작성한 주석을 삭제하지 않은 경우 나. 영향 - 바이너리 파일의 디컴파일을 통해 중요정보가 유출 - 유출된 정보를 기반으로 시스템 공격 다. 보안대책 - 주석문에 계정정보 등의 중요정보를 작성하지 않음 - 개발완료 시 개발에 사용한 계정정보 등의 중요정보를 확실하게 삭제 라. 안전하지 않은 코드 1. 주석문 내 중요정보 ... // 관리자 계정 ( admin / admin1234 ) if ( !checkLogin( this.ID, this.PASS ) ) { showAlert( "Not Allow Login" ); return; } ... 마. 진단방법 1. DB접속, 관리자 로그인 등이 구현된..
가. 원인 - 개인정보 / 인증정보 / 금융정보와 같은 중요정보를 영속적인 쿠키에 저장하는 경우 나. 영향 - 쿠키에 저장된 중요정보 유출 및 변조를 통해 사용자 권한 / 인증을 우회 다. 보안대책 - 쿠키 만료시간을 최소한으로 설정 - 영속적 쿠키(Max-Age)에 사용자 권한등급, 인증정보 등의 중요정보를 포함 제외 라. 안전한 코드 1. 쿠키 만료시간 설정 ... if ( !checkLogin( this.ID, this.PASS ) ) { showAlert( "Not Allow Login" ); return; } ... String saveID = request.getParameter( "save_id" ); Cookie loginCookie = new Cookie ( "save_id", saveI..
가. 원인 - 비밀번호 조합규칙이 미흡하거나 길이가 충분하지 않을 경우 나. 영향 - 패스워드 무작위 대입 또는 추측공격을 통해 계정정보가 노출 다. 보안대책 - KISA "암호이용안내서"의 패스워드 설정규칙을 적용 - 패스워드에 숫자 / 영문자 / 특수문자 등을 혼합하여 사용 - 패스워드를 주기적으로 변경하여 사용 라. 안전한 코드 1. 패스워드 검증 String password = request.getParameter( "password" ); ... // 영문+숫자포함하여 최소 10자리 이상 Pattern p = Pattern.compile( "((?=.*[a-zA-Z])(?=.*0-0).{10, })" ); Matcher match = p.matcher( password ); if ( !match..
가. 원인 - 암호키가 소스코드에 하드코딩되어 암호화에 사용 나. 영향 - 실행파일이 유출 시, 디컴파일을 통해 암호화키가 유출되어 중요정보를 복호화 다. 보안대책 - 암호키는 암호화하여 안전한 별도의 위치에 저장 후 사용 라. 안전한 코드 1. 안전한 암호키 사용 public String encryptData( String plainText ) { String key = getPassword( "/var/password.ini" ); key = decrypt( key ); SecretKeySpec keySpec = new SecretKeySpec( key.getBytes(), "AES" ); ... Cipher cipher = Cipher.getInstance( "AES" ); cipher.init( ..
가. 원인 - 예측 가능한 난수를 발생시키는 취약한 API를 사용 나. 영향 - 다음 숫자를 예상하여 시스템을 공격가능 다. 보안대책 - Java.lang.Math 클래스의 random 메서드의 사용을 자제 - Java.util.Random 클래스의 random 메서드를 사용 - 현재 시간을 기반으로 조합하여 매번 변경되는 시드값을 사용 - 보안결정을 위한 값을 생성 시 java.security.SecureRandom 클래스를 사용 라. 안전한 코드 1. Seed가 가능한 랜덤함수 사용 import java.util.Random; ... public int generateRandom( ... ) { int ran = -1; Date cur = new Date(); ... Random r = new Ran..
- Total
- Today
- Yesterday