신뢰할 수 없는 데이터의 역직렬화 정의 송신자가 네트워크를 이용해 직렬화된 정보를 수신자에게 전달하는 과정에서 공격자가 전송한 데이터 또는 저장된 스트림을 조작할 수 있는 경우, 신뢰할 수 없는 역직렬화로 인해 무결성 침해, 원격코드실행, 서비스 거부 공격 등이 발생할 수 있는 보안약점입니다. *직렬화(Serialization)는 프로그램에서 특정 클래스의 현재 인스턴스 상태를 다른 서버로 전달하기 위해 클래스의 인스턴스 정보를 바이트 스트림으로 복사하는 작업으로, 메모리 상에서 실행되고 있는 객체의 상태를 그대로 복제해 파일로 저장하거나 수신 측에 전달하게 됩니다. *역직렬화(Deserialization)는 반대 연산으로 바이너리 파일(Binary File) 이나 바이트 스트림(Byte Stream) ..
부적절한 자원 해제 정의 프로그램의 자원(힙 메모리, 소켓 등)을 할당받아 사용을 마치고 더 이상 사용하지 않는 경우에는 적절히 반환해야 하는데, 프로그램 오류 또는 에러로 사용이 끝난 자원을 반환하지 못하는 경우에 문제가 발생할 수 있습니다. 안전한 코딩기법 자원을 획득하여 사용한 다음에는 반드시 자원을 해체 후 반환해야 합니다. 코드예제 다음은 안전하지 않은 코드예제입니다. try문 내의 코드 실행 중 오류가 발생할 경우, close() 메서드가 실행되지 않아 사용한 자원이 반환되지 않는 경우를 보여주는 코드입니다. #부적절한 자원 해제(안전X) def get_config_bad(): lines = None try: f = open('config.cfg') lines = f.readlines() ra..
코드오류 타입 변환 오류, 자원의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안약점이다. Null Pointer 역참조 정의 널 포인터 역참조는 '일반적으로 그 객체가 Null이 될 수 없다'라고 하는 가정을 위반했을 때 발생합니다. 공격자가 의도적으로 널 포인터 역참조를 발생시키는 경우, 공격자는 그 결과로 발생하는 예외상황을 이용해 추후 공격 계획에 활용할 수 있습니다. 안전한 코딩기법 None을 반환하는 함수를 사용할 때, None이 될 수 있는 데이터를 참조하기 전 해당 데이터의 값이 None 인지 검사하여 시스템 오류를 줄일 수 있습니다. 코드예제 다음은 안전하지 않은 코드 예제입니다. 파이썬에서는 포인터를 사용하지는 않지만 데이터에 대한 적절한 검사를 수행하지..
부적절한 예외 처리 정의 프로그램 수행 중에 함수의 결과 값에 대한 적절한 처리 또는 예외 상황에 대한 조건을 적절하게 검사하지 않을 경우, 예기치 않은 문제를 야기할 수 있습니다. 안전한 코딩기법 값을 반환하는 모든 함수의 결괏값을 검사해야 합니다. 결괏값이 개발자가 의도했던 값인지 검사하고, 예외처리를 사용하는 경우, 구체적인 예외처리를 수행해야 합니다. 코드예제 다음은 안전하지 않은 코드예제로, 다양한 예외가 발생할 수 있음에도 불구하고 광범위한 예외처리로 예외상황에 따른 적절한 조지가 부적절한 상황을 보여주는 코드입니다. #부적절한 예외 처리(안전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)이 다르기 때문에, 검사하는 시점에 존재하던 자원이 사용하던 시점에 사라지는 등 자원의 상태가 변하는 경우가 발생합니다. 이와 같은 문제는 동기화 오류뿐만 아니라 교착상태 등과 같은 문제가 발생할 수 있습니다. 안전한 코딩기법 변수, 파일과 같은 공유자원을 여..