솔트 없이 일방향 해시 함수 사용 정의 중요정보를 솔트(Salt)없이 일방향 해시함수를 사용해 저장한다면, 공격자는 미리 계산된 레인보우 테이블을 이용해 해시값을 알아낼 수 있다. 안전한 코딩기법 패스워드와 같이 중요정보를 저장할 경우, 가변 길이 데이터를 고정된 크기의 해시값으로 변환해 주는 일방향 해시함수를 이용해 저장한다. 솔트값은 사용자별로 유일하게 생성해야 하며, 이를 위해 사용자별 솔트 값을 별도로 저장하는 과정이 필요하다. 코드예제 다음은 안전하지 않은 코드예제로, salt 없이 길이가 짧은 패스워드를 해시함수에 전달해 원문이 공격자에 의해 쉽게 유추되는 코드입니다. #솔트 없이 일방향 해시 함수 사용(안전X) def get_hash_from_pwd_bad(pw): h = hashlib.sh..
주석문 안에 포함된 시스템 주요정보 정의 소프트웨어 개발자가 편의를 위해서 주석문에 패스워드를 적어둔 경우, 소프트웨어가 완성된 후에는 그것을 제거하는 것이 매우 어렵게 된다. 만약 공격자가 소스코드에 접근할 수 있다면 시스템에 손쉽게 침입할 수 있다. 안전한 코딩기법 주석에는 아이디, 패스워드 등 보안과 관련된 내용을 기입하지 않는다. 코드예제 주석문에 중요정보(아이디, 패스워드 등)를 지우지 않는 경우 노출 보안약점이 발생합니다. 프로그램 개발 시 주석문에 포함된 주요정보는 꼭 삭제해야 합니다. #주석문 안에 포함된 시스템 주요정보(안전X) def user_login_bad(id, passwd): # 주석문에 포함된 중요 시스템의 인증 정보 # id = admin # passwd = passw0rd ..
사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출 정의 개인정보, 인증 정보 등이 영속적인 쿠키(Persistent Cookie)에 저장된다면, 공격자는 쿠키에 접근할 수 있는 보다 많은 기회를 가지게 되며, 이는 시스템을 취약하게 만든다. 안전한 코딩기법 쿠키의 만료시간은 세션 지속 시간을 고려하여 최소한으로 설정하고 영속적인 쿠키에는 중요 정보(사용자 권한 등급, 세션 ID 등)가 포함되지 않도록 한다. 코드예제 다음은 안전하지 않은 코드예제로, 쿠키 만료시간을 과도하게 길게 설정하여 사용자 하드 디스크에 저장된 쿠키가 도용되는 상황을 보여주는 코드입니다. #사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출(안전X) def remind_user_state_bad(request): res = Htt..
부적절한 인증서 유효성 검증 정의 인증서가 유효하지 않거나 악성인 경우, 공격자가 호스트와 클라이언트 사이의 통신 구간을 가로채 신뢰하는 엔티티인 것처럼 속일 수 있다. 이로 인해 대상 호스트가 신뢰 가능한 것으로 믿고 악성 호스트에 연결하거나 신뢰된 호스트로부터 전달받은 것처럼 보이는 스푸핑 된(또는 변조된 데이터)를 아무런 의심 없이 수신하는 상황이 발생할 수 있다. 안전한 코딩기법 데이터 통신에 인증서를 사용하는 경우 송신 측에서 전달한 인증서가 유효한지 검증한 후 데이터를 송수신해야 한다. 코드예제 다음은 안전하지 않은 코드예제로, SSL 기반 소켓 연결 코드입니다. 클라이언트 측에서 통신 대상 서버를 인증하지 않고 접속하는 상황입니다. 이런 경우 서버를 신뢰할 수 없으며 클라이언트 시스템에 영향..
부적절한 전자서명 확인 정의 프로그램, 라이브러리, 코드의 전자서명에 대한 유효성 검증이 적절하지 않아 공격자의 악의적인 코드가 실행 가능한 보안약점 데이터 전송 또는 다운로드 시 함께 전달되는 전자서명은 원문 데이터의 암호화된 해시 값으로, 수신 측에서 이 서명을 검증해 데이터 변조 여부를 확인할 수 있다. 안전한 코딩기법 주요 데이터 전송 또는 다운로드 시 데이터에 대한 전자서명을 함께 전송하고, 수신측에서는 전달받은 전자 서명을 검증해 파일의 변조 여부를 확인해야 한다 코드예제 다음은 안전하지 않은 코드예제입니다. 송신측이 데이터와 함께 전달한 전자서명을 수신 측에서 별도로 처리하지 않고 그대로 신뢰해 데이터 내부에 포함된 파이썬 코드가 실행되는 취약한 코드입니다. #부적절한 전자서명 확인(안전X)..
취약한 패스워드 허용 정의 사용자에게 강한 패스워드 조합규칙을 요구하지 않으면, 사용자 계정이 취약하게 된다. 안전한 패스워드를 생성하기 위해서는 '패스워드 선택 및 이용 안내서'에서 제시하는 패스워드 설정 규칙을 적용해야 한다. 안내서 다운로드 : https://www.kisa.or.kr/2060305/form?postSeq=14&lang_type=KO KISA 한국인터넷진흥원 1. 안전한 패스워드 2. 이러한 패스워드 사용하지 마세요 3. 안전한 패스워드 생성 Tip 4. 패스워드 보안 지침(이용자 측면) 5. 패스워드 보안 지침(관리자 측면) www.kisa.or.kr 안전한 코딩기법 패스워드 생성 시 강한 조건 검증을 수행한다. 패스워드(패스워드)는 숫자와 영문자, 특수문자 등을 혼합하여 사용하고..
적절하지 않은 난수 값 사용 정의 예측 불가능한 숫자가 필요한 상황에서 예측 가능한 난수를 사용한다면, 공격자가 생성되는 다음 숫자를 예상해 시스템을 공격할 수 있다. 안전한 코딩기법 난수 발생기에서 시드(Seed)를 사용하는 경우에는 고정된 값을 사용하지 않고 예측하기 어려운 방법으로 생성된 값을 사용한다. 코드예제 random 라이브러리를 사용할 때는 유추하기 어려운 seed 값을 이용하여 난수를 생성해야 합니다. 다음은 안전하지 않은 코드예제입니다. 아래 코드와 같이 강도가 낮은 난수는 안전하지 않습니다. #적절하지 않은 난수 값 사용(안전X) def get_opt_num_bad(request): random_str = '' for i in range(6): random_str += str(rand..
충분하지 않은 키 길이 사용 정의 짧은 길이의 키를 사용하는 것은 암호화 알고리즘을 취약하게 만들 수 있다. 키는 암호화 및 복호화에 사용되는데, 키의 길이가 충분히 길지 않으면 짧은 시간 안에 키를 찾아낼 수 있고, 이를 이용해 공격자가 암호화된 데이터나 패스워드를 복호화할 수 있게 된다. 암호 알고리즘 및 키 길이 선택 시, 암호 알고리즘의 안전성 유지기간과 보안강도별 암호 알고리즘 키 길이 비교표를 기반으로 암호 알고리즘 및 키 길이를 선택해야 한다. 안전한 코딩기법 RSA 알고리즘은 적어도 2,048 비트 이상의 길이를 가진 키와 함께 사용해야 하고, 대칭 암호화 알고리즘(Symmetric Encryption Algorithm)의 경우에는 적어도 128비트 이상의 키를 사용해야 한다(암호 강도 1..