부적절한 예외 처리 정의 프로그램 수행 중에 함수의 결과 값에 대한 적절한 처리 또는 예외 상황에 대한 조건을 적절하게 검사하지 않을 경우, 예기치 않은 문제를 야기할 수 있습니다. 안전한 코딩기법 값을 반환하는 모든 함수의 결괏값을 검사해야 합니다. 결괏값이 개발자가 의도했던 값인지 검사하고, 예외처리를 사용하는 경우, 구체적인 예외처리를 수행해야 합니다. 코드예제 다음은 안전하지 않은 코드예제로, 다양한 예외가 발생할 수 있음에도 불구하고 광범위한 예외처리로 예외상황에 따른 적절한 조지가 부적절한 상황을 보여주는 코드입니다. #부적절한 예외 처리(안전X) def get_content_bad(): try: f = open('fruit.txt') s = f.readline() i = int(s.strip..
오류상황 대응 부재 정의 오류가 발생할 수 있는 부분을 확인하였으나, 오류에 대해 예외처리를 하지 않을 경우, 공격자는 오류 상황을 악용해 개발자가 의도하지 않은 방향으로 프로그램이 동작하도록 할 수 있습니다. 안전한 코딩기법 오류가 발생할 수 있는 부분에 대하여 try-except문을 사용하여 예외처리를 해야 합니다. 코드예제 다음은 안전하지 않은 코드예제입니다. try문에서 오류를 포착하고 있지만, 그 오류에 대해 아무 조치를 하지 않는 상황을 보여주는 코드입니다. #오류상황 대응 부재(안전X) def error_test_bad(request): try: num = int(request.GET.get('num') or 1) print(f'{100/num}') except ZeroDivisionErro..
에러처리 에러를 처리하지 않거나, 불충분하게 처리하여 에러정보에 중요정보(시스템 내부정보 등)가 포함될 때, 발생할 수 있는 보안약점이다. 오류 메시지 정보노출 정의 응용 프로그램이 실행환경, 사용자 등 관련 데이터에 대한 민감한 정보를 포함하는 오류 메시지를 생성해 외부에 제공하는 경우, 공격자의 악성 행위로 이어질 수 있습니다. 예외발생 시 예외이름이나 추적 메시지를 출력하는 경우, 프로그램 내부 구조를 쉽게 파악할 수 있기 때문입니다. 안전한 코딩기법 오류 메시지는 정해진 사용자에게 유용한 최소한의 정보만 포함하도록 합니다. 소스코드에서 예외상황은 내부적으로 처리하고 사용자에게 민감한 정보를 포함하는 오류를 출력하지 않고 미리 정의된 메시지를 제공하도록 설정해야 합니다. 코드예제 사용자 요청을 정상..
종료되지 않는 반복문 또는 재귀 함수 정의 재귀함수의 순환 횟수를 제어하지 못해 할당된 메모리나 프로그램 스택 등의 자원을 개발자가 의도한 범위보다 과도하게 초과하여 사용하면 위험합니다. 기본 케이스가 정의되어 있지 않은 재귀함수는 무한 루프에 빠지게 되고 자원고갈을 유발함으로써 시스템의 정상적인 서비스를 제공할 수 없게 합니다. 안전한 코딩기법 모든 재귀 호출 시 호출 횟수를 제한하거나 재귀함수 종료조건을 명확히 정의하여 호출을 제어해야 합니다. 코드예제 다음은 안전하지 않은 코드예제로, 재귀문을 빠져나오는 조건을 정의하지 않아 시스템 장애를 유발할 수 있는 코드입니다. #종료되지 않는 반복문 또는 재귀 함수(안전X) def factorial_bad(num): return num * factorial_..
시간 및 상태 통시 또는 거의 동시에 여러 코드 수행을 지원하는 병렬 시스템이나 하나 이상의 프로세스가 동작되는 환경에서 시간 및 상태를 부적절하게 관리하여 발생할 수 있는 보안약점이다. 경쟁조건: 검사시점과 사용시점(TOCTOU) 정의 병렬시스템(멀티프로세스로 구현한 응용프로그램)에서는 자원(파일, 소켓 등)을 사용하기에 앞서 자원의 상태를 검사합니다. 하지만, 자원을 사용하는 시점(Time Of Use)과 검사하는 시점(Time Of Check)이 다르기 때문에, 검사하는 시점에 존재하던 자원이 사용하던 시점에 사라지는 등 자원의 상태가 변하는 경우가 발생합니다. 이와 같은 문제는 동기화 오류뿐만 아니라 교착상태 등과 같은 문제가 발생할 수 있습니다. 안전한 코딩기법 변수, 파일과 같은 공유자원을 여..
반복된 인증시도 제한 기능 부재 정의 일정 시간 내에 여러 번의 인증 시도 시 계정 잠금 또는 추가 인증 방법 등의 충분한 조치가 수행되지 않는 경우, 공격자는 성공할 법한 계정과 패스워드들을 사전으로 만들고 무차별 대입하여 로그인 성공 및 권한 획득이 가능하다. 안전한 코딩기법 최대 인증시도 횟수를 적절한 횟수로 제한하고 설정된 인증 실패 횟수를 초과할 경우 계정을 잠금하거나 추가적인 인증 과정을 거쳐서 시스템에 접근이 가능하도록 한다. 코드예제 다음은 안전하지 않은 코드예제로, 사용자 로그인 시도에 대한 횟수를 제한하지 않는 코드입니다. 로그인 페이지 {% csrf_token %} 아이디: 패스워드: {{ msg }} #반복된 인증시도 제한 기능 부재(안전X) def get_user_pw(user_i..
무결성 검사없는 코드 다운로드 정의 원격지에 위치한 소스코드 또는 실행 파일을 무결성 검사 없이 다운로드 후 이를 실행하는 프로그램이 존재한다. 이러한 프로그램은 호스트 서버의 변조, DNS 스푸핑(Spoofing), 전송 시의 코드 변조 등의 방법을 이용해 공격자가 악의적인 코드를 실행하는 위협에 취약하게 된다. 파일 무결성을 확인하는 두 가지 주요 방법으로는 암호화 해시 및 디지털 서명이 있다. 안전한 코딩기법 DNS 스푸핑(Spoofing)을 방어할 수 있는 DNS lookup을 수행하고 코드 전송 시 신뢰할 수 있는 암호 기법을 이용해 코드를 암호화 다운로드한 코드는 작업 수행을 위해 필요한 최소한의 권한으로 실행 소스코드는 신뢰할 수 있는 사이트에서만 다운로드해야 하고 파일의 인증서 또는 해시값..
솔트 없이 일방향 해시 함수 사용 정의 중요정보를 솔트(Salt)없이 일방향 해시함수를 사용해 저장한다면, 공격자는 미리 계산된 레인보우 테이블을 이용해 해시값을 알아낼 수 있다. 안전한 코딩기법 패스워드와 같이 중요정보를 저장할 경우, 가변 길이 데이터를 고정된 크기의 해시값으로 변환해 주는 일방향 해시함수를 이용해 저장한다. 솔트값은 사용자별로 유일하게 생성해야 하며, 이를 위해 사용자별 솔트 값을 별도로 저장하는 과정이 필요하다. 코드예제 다음은 안전하지 않은 코드예제로, salt 없이 길이가 짧은 패스워드를 해시함수에 전달해 원문이 공격자에 의해 쉽게 유추되는 코드입니다. #솔트 없이 일방향 해시 함수 사용(안전X) def get_hash_from_pwd_bad(pw): h = hashlib.sh..