가. 원인 - 암호화에 사용하는 키의 길이가 충분하지 않을 경우 나. 영향 - 짧은 길이의 키를 사용하여 암호화 알고리즘을 취약하게 만듬 - 검증된 암호화 알고리즘을 사용하더라도 짧은 시간안에 키를 찾아내 중요정보를 복호화 다. 보안대책 - RSA와 같은 공개키 암호화 알고리즘은 2048bit 이상의 키를 사용 - AES / ARIA / SEED 등과 같은 대칭키 알고리즘은 128bit 이상의 키를 사용 라. 안전한 코드 1. 2048bit 이상의 RSA 암호화 키 사용 final KeyPairGenerator keyGen = KeyPairGenerator.getInstance( "RSA" ); keyGen.initialize( 2048 ); final KeyPair key = keyGen.generat..
가. 원인 - 프로그램 내부에 비밀번호를 하드코딩한 경우 나. 영향 - 하드코드된 비밀번호를 내부인증에 사용하거나, 외부 컴포넌트와 통신에 사용할 경우, 관리자 정보가 노출될 수 있음 - 하드코드된 비밀번호가 인증실패를 야기할 경우, 원인파악의 어려움 발생 다. 보안대책 - 비밀번호는 암호화하여 별도의 파일이나 DB에 안전하게 저장 후 사용 - 디폴트 암호 대신 "최초 로그인" 모드를 사용하여 사용자가 직접 패스워드를 입력하도록 설계 라. 안전한 코드 1. DB계정정보 암호화 후 사용 private static final String DB_USER = "db_manager"; ... public Connection getConnection( ) { Connection conn = null; ... // ..
가. 원인 - 사용자 및 시스템의 중요정보를 평문으로 송/수신할 경우 나. 영향 - 네트워크 스니핑을 통해 인가되지 않은 사용자에게 민감정보 등이 노출 다. 보안대책 - 로그인 시 반드시 HTTPS와 같은 안전한 통신채널을 사용 - 중요정보는 암호화 후 전송하거나 안전한 통신채널을 사용 - 중요정보를 쿠키로 전송할 경우, HTTPS통신으로만 값이 전달될 수 있도록 보안속성( setSecure(true) )을 설정 - 중요정보를 쿠키로 전송 시 HTTP 통신을 해야할 경우, 반드시 암호화 후 전송 라. 안전한 코드 1. 패스워드를 암호화 후 전송 String pwd = getPassword(); ... // 데이터 암호화 후 전송이므로 서버의 공개키로 양방향 암호화 처리 후 전송 // 서버의 비밀키로만 복..
가. 원인 - 패스워드 / 개인정보 / 인증정보 / 금융정보 등의 중요정보를 암호화하지 않고 평문으로 저장 나. 영향 - 저장된 파일이나 DB정보가 유출될 경우, 개인정보, 패스워드 등의 중요정보 및 민감정보가 유출 다. 보안대책 - 개인정보 / 금융정보 / 패스워드 / 민감정보를 저장 시 암호화 후 저장 - 중요정보를 읽거나 쓸 경우에 권한검증을 수행 - 디스크나 메모리에 있는 민감한 데이터를 지울때 안전한 방식으로 삭제 라. 안전한 코드 1. 패스워드 암호화 후 저장 String pw = request.getParameter("password"); // 패스워드는 128비트 이상의 암호키를 사용하는 일방향 암호화 처리 후 저장 MessageDigest digest = MessageDigest.getI..
가. 원인 - 중요정보를 취약한 암호 알고리즘을 사용하여 암/복호화 처리 - BASE64와 같은 지나치게 간단한 인코딩으로 암/복호화 나. 영향 - 중요정보가 복호화 되어 노출 다. 보안대책 - 자체 개발한 암호화 알고리즘은 사용하지 않음 - 이미 검증된 표준화 된 암호화 알고리즘을 사용 - 3DES, AES, RSA, SHA2 등의 안전한 암호화 알고리즘을 사용 라. 안전한 코드 1. 안전한 암호화 알고리즘 사용 public byte[] encrypt( byte[] msg, Key key ) { byte[] result = null; try { Cipher c = Cipher.getInstance( "AES/CBC/PKCS5Padding" ); c.init( Cipher.ENCRYPT_MODE, k )..
가. 원인 - 중요 자원에 대한 읽기/수정/삭제 권한을 의도하지 않게 허가하는 경우 나. 영향 - 인가되지 않은 사용자가 중요 자원에 접근/사용/변조 등을 수행 다. 보안대책 - 설정파일 / 실행파일 / 라이브러리 등은 SW관리자만 읽고 쓸 수 있도록 설정 - 허가받지 않은 사용자가 중요 자원에 대한 접근을 제한 라. 안전한 코드 1. 파일 소유자만 읽을 수 있도록 권한 설정 ... String uploadFile = saveUploadFile( request ); File file = new File ( uploadFile ); // 첫번째 인자는 권한부여 여부 // 두번째 인자는 소유자(true) / 모든사용자(false)를 나타내며 디폴트는 true file.setExecutable( false )..
가. 원인 - 인가 사용자만 접근해야 하는 기능에 올바른 접근권한 검증을 수행하지 않을 경우 나. 영향 - 권한없는 사용자에 의해 기능이 사용됨 - 권한없는 사용자에 의해 데이터가 유출 다. 보안대책 - 역할에 따라 제공되는 정보와 기능의 노출을 최소화 - 사용자 권한 별 ACL을 적용 - URL 조작을 통해 리소스에 직접 접근할 수 없도록 차단 - 파라미터 조작을 통한 직접 접근을 할 수 없도록 차단 라. 안전한 코드 1. 권한검증 public ModelAndView deleteUserInfo( ... ) { String userID = (String) session.getAttribute("LoginID"); ... // 로그인 사용자가 유저정보를 삭제할 권한이 있는지 확인 if ( checkUser..
가. 원인 - 적절한 인증과정 없이 중요정보를 열람 또는 변경처리 나. 영향 - 권한없는 사용자가 중요기능을 사용 - 권한없는 사용자가 중요정보를 변조 다. 보안대책 - 보안검사를 우회하여 서버에 접근할 수 없도록 설계 - 중요정보를 제공하는 페이지에 접근 시 재인증 수행 - 안전하다고 확인된 라이브러리나 프레임워크를 사용 라. 안전한 코드 1. 정보 소유자 검증 public ModelAndView modifyUserInfo( ... ) { String userID = (String) session.getAttribute("LoginID"); String requestID = request.getParameter("userID"); // 회원정보를 변경하려는 ID와 기능요청자의 ID가 동일한 사람인지 화..
가. 원인 - 포멧스트링을 사용하는 함수에 입력값 검증없이 포멧문자열로 사용 - 포멧문자열과 파라미터 숫자가 일치하지 않을 경우 나. 영향 - 프로세스를 공격 - 메모리 데이터를 읽거나 쓰기 (%n) - 리턴주소를 조작하여 임의코드를 실행 다. 보안대책 - 외부입력값을 포멧스트링으로 사용하지 않고 포멧 문자열 생성에 포함제외 - 포멧스트링에 사용되는 인자와 매개변수의 갯수를 일치 - 포멧문자열을 사용하지 않는 함수를 사용 라. 안전한 코드 1. 입력값을 매개변수로 사용 public static void main( String[] args ) { ... Calendar validate = Calendar.getInstance(); ... // System.out.println("[%s] input comm..
가. 원인 - 버퍼 크기보다 큰 데이터를 버퍼에 기록할 경우 - 버퍼의 영역을 넘어 다른 메모리 영역에 침범할 경우 나. 영향 - 메모리 상 중요한 정보를 읽거나 시스템 충돌유도 - 리턴주소를 조작하여 임의의 코드를 실행하도록 조작 다. 보안대책 - 버퍼의 범위를 넘는 데이터를 접근하지 못하도록 버퍼 크기와 인덱스를 정확히 사용 - 문자열 저장 시 버퍼의 마지막에 NULL로 종료 라. 안전한 코드 1. 버퍼 크기를 정확히 사용 typedef struct _charvoid { char data[16]; void *prev; void *next; } charvoid; public void main( char* args ) { charvoid cv_struct; ... int data_size = sizeof..
- Total
- Today
- Yesterday