API 오용 의도된 사요에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안약점이다. DNS lookup에 의존한 보안결정 정의 공격자가 DNS 엔트리를 속일 수 있으므로 도메인명에 의존해서 보안결정(인증 및 접근통제 등)을 하지 않아야 합니다. 만약, 로컬 DNS 서버의 캐시가 공격자에 의해 오염된 상황이라면, 사용자와 특정 서버 간의 네트워크 트래픽이 공격자를 경유하도록 할 수도 있고, 공격자가 마치 동일 도메인에 속한 서버인 것처럼 위장할 수도 있습니다. 안전한 코딩기법 보안결정에서 도메인명을 이용한 DNS lookup을 하지 않도록 해야 합니다. 코드예제 다음은 안전하지 않은 코드예제입니다. 도메인명을 통해 해당 요청을 신뢰할 수 있는지를 검사하는 코드로,..
Private 배열에 Public 데이터 할당 정의 public으로 선언된 메소드의 인자가 private로 선언된 배열에 저장되면 private 배열을 외부에서 접근하여 배열 수정과 객체 속성 변경이 가능해집니다. 안전한 코딩기법 public으로 선언된 메소드의 인자를 private로 선언된 배열에 저장하지 않도록 해야합니다. 사용자가 전달한 값으로 클래스 외부에서 private 값을 변경해서는 안되며, 필요한 경우 별도의 인스턴스 변수로 정의하거나, 의도한 기능이라면 전달된 값의 정상 여부를 검증한 후 적용해야 합니다. 코드예제 다음은 안전하지 않은 코드예제로, __를 이용하여 파이썬 내부 배열을 생성하고 외부 값을 대입하는 pubic 메소드를 사용하는 코드입니다. #Private 배열에 Public ..
Public 메소드로부터 반환된 Private 배열 정의 파이썬은 명시적인 private선언이 없지만, 대부분의 파이썬 코드가 따르는 규칙으로 이름 앞에 밑줄(ex. _apple)로 시작하면 private로 처리됩니다. public으로 선언된 메소드에서 배열을 반환하면, 해당 배열의 참조 객체가 외부에 공개되어 외부에서 배열 수정과 객체 속성 변경이 가능해집니다. 이런 속성은 배열뿐만 아니라 변경가능한 모든 객체에 해당됩니다. 안전한 코딩기법 private로 선언된 배열을 public으로 선언된 메소드로 반환하지 않도록 해야합니다. private 배열에 대한 복사본을 반환하도록하고 배열의 원소에 대해서는 clone() 메소드를 통해 복사된 원소를 저장하도록 해서 private 선언된 배열과 객체 속성에 ..
제거되지 않고 남은 디버그 코드 정의 디버깅 목적으로 삽입된 코드는 개발이 완료되면 제거해야 합니다. 디버그 코드는 민감한 정보 또는 의도하지 않은 시스템 제어로 이어질 수 있는 정보를 담고 있을 수도 있습니다. 만약 디버그 코드가 남겨진 채로 배포될 경우, 공격자가 식별 과정을 우회하거나 의도하지 않은 정보 노출로 이어질 수 있습니다. 안전한 코딩기법 소프트웨어 배포 전 반드시 디버그 코드를 확인 및 삭제합니다. 코드예제 아래 코드는 Django의 미들웨어 셋팅 파일인 settings.py 의 일부입니다. 개발 시 사용된 DEBUG 옵션이 True로 설정되어 있다면 정보 노출의 위험이 있습니다. 따라서 개발이 끝난 소스코드를 배포 및 운영할 경우에는 반드시 DEBUG 옵션을 False로 변경해야 합니다..
캡슐화 중요한 데이터 또는 기능성을 불충분하게 캡슐화하거나 잘못 사용함으로써 발생하는 보안약점으로 정보노출, 권한 문제 등이 발생할 수 있다. 잘못된 세션에 의한 데이터 정보 노출 정의 다중 스레드 환경에서는 싱글톤(Singleton) 객체 필드에 경쟁조건이 발생할 수 있습니다. 따라서 다중 스레드 환경에서는 정보를 저장하는 전역변수가 포함되지 않도록 코드를 작성하여 서로 다른 세션에서 데이터를 공유하지 않도록 해야 합니다. 안전한 코딩기법 싱글톤 패턴을 사용하는 경우, 변수 범위에 주의를 기울여야 합니다. 특히 다중 스레드 환경에서 클래스 변수의 값은 하위 메소드와 공유되므로 필요한 경우 인스턴스 변수로 선언하여 사용해야 합니다. 코드예제 다음은 안전하지 않은 코드예제입니다. 다중 스레드 환경에서 파이..
신뢰할 수 없는 데이터의 역직렬화 정의 송신자가 네트워크를 이용해 직렬화된 정보를 수신자에게 전달하는 과정에서 공격자가 전송한 데이터 또는 저장된 스트림을 조작할 수 있는 경우, 신뢰할 수 없는 역직렬화로 인해 무결성 침해, 원격코드실행, 서비스 거부 공격 등이 발생할 수 있는 보안약점입니다. *직렬화(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 인지 검사하여 시스템 오류를 줄일 수 있습니다. 코드예제 다음은 안전하지 않은 코드 예제입니다. 파이썬에서는 포인터를 사용하지는 않지만 데이터에 대한 적절한 검사를 수행하지..