SK shieldus Rookies 16기 (애플리케이션 보안#03)

만두다섯개·2023년 11월 6일
0

SK 루키즈 16기

목록 보기
10/52

주요 정보

  • 교육 과정명 : 클라우드기반 스마트융합보안 과정 16기
  • 교육 회차 정보 : '23. 11. 3. 애플리케이션 보안 #02

참고 정보

  • DRF : Django RESTfulAPI 서버 생성 라이브러리. 토큰 및 세션 인증을 제공한다
  • HTTP : GET, POST, PUT, DELETE 방식이 존재한다. GET 방식으로도 PUT, DELETE 지원 가능
  • GET 방식 :
    1. body 없이 header 만으로 전송된다
    2. 링크/북마크 가능
    3. 요청 길이제한 존재
    4. 아래처럼 ? 뒤에 쿼리문자열, 각 쿼리는 &로 구분
    [ /test?name=vlaue&date=2023 ]
  • POST 방식 :
    1. body에 쿼리 데이터가 들어간다
    2. 링크/북마크 불가
    3. 데이터 길이에 제한이 없다.
    4. URL을 가지지 않아 주로 중요한 데이터 전송시 사용한다

보완할 점

  • 장고 활용한 실습

무엇을 깨달았나

  • 파이썬 시큐어 코딩 - 시간 및 상태, 에러처리, 코드오류, 캡슐화, API 오용 종류

#3 시간 및 상태

경쟁조건 TOCTOU

  • Time of check to time of use의 약자로 병렬시스템에서 자원 사용전 자원의 상태를 검사한다.
  • 이때 자원의 사용과 검사의 시점의 불일치로 검사할때는 존재하던 자원이 사용할때는 없는 상황이 발생하기도 한다.

경쟁조건 TOCTOU 해결방법 제안

  • 쓰레드를 사용해 파일 접근시, .LOCK(), with lock:을 사용해 한 사용자만 파일접근하도록 한다
  • 임계영역 주변만 동기화 구문을 사용한다
  • 파이썬에서 Lock 객체 사용 시, lock.acquire() 자원을 잠그고, lock.release()자원 해제(with 대체가능)

종료되지 않은 반복문 또는 재귀 함수

  • 메모리, 프로그램 스택 등의 자원이 반복되는 문장 혹은 함수로 인해 시스템 자원 고갈, 서비스 가용성 저해.
  • 스택 오버플로우 발생 가능

종료되지 않은 반복문 또는 재귀 함수 해결방법 제안

  • 종료 조건(base case)을 정확히 명시한다.
  • 파이썬에서는 재귀 횟수가 1,000번으로 설정되어 있다.
  • setrecursionlimit 함수를 사용해 반복 수 제한을 임의로 사용할 경우 호출 횟수에 유의(사용할 만큼만 호출 횟수를 명시)

#4 에러처리

오류 메시지 정보노출

  • 응용 프로그램에서 오류 메시지가 실행환경, 사용자 등의 데이터 포함해 공격자의 악성 행위로 이어질 수 있다.
  • Traceback(추적 메시지)로 프로그램 내부 구조 파악가능.

오류 메시지 정보노출 해결방안

  • 최소한의 유용한 정보만 사용자에게 제공해야 한다.
  • 미리 정의된 오류 메시지를 제공하도록 해야 한다.
  • Django, Flask 프레임워크에서는 HTTP 오류 코드 요청 처리목적으로 에러 페이지 핸들러 제공

오류상황 대응 부재

  • 오류 발생 예외 처리를 하지 않을 경우, 표시되는 데이터나 확정 경로는 공격자의 악성 행위로 악용될 수 있다

오류상황 대응 부재 해결방안

  • 단순하게 try – except를 사용하는 것이 아니라, 각 발생 가능한 except 내에서 상황 예외 처리문을 명시해야 한다.
  • 예를들어, 암호화 설정 키를 받는 함수에서 오류 발생시, pass 만 기입해 놓는다면, 해당 암호화 설정 키는 기본 키 값으로 처리될 수 있다. 이를 랜덤한 키 값으로 설정하는 것.

부적절한 예외 처리

  • 프로그램 수행 중 함수 결과 값 처리 또는 예외 상황 조건을 검사하지 않을 때 예기치 않은 문제 발생 가능

부적절한 예외 처리 해결 방안

  • 값을 반환하는 모든 함수의 결과 값을 검사
  • 예외 처리 사용 시 광범위한 예외 처리 대신 구체적인 예외 처리를 수행한다.
  • 예외 발생 시 외부보다는 내부적으로 예외 내용을 알려주면 좋다. (외부 노출은 위험을 감수하는 것 또는 정상적인 사용자에게 불안감을 줄 수 있다)

#5 코드오류

Null Pointer

  • Null Pointer 역참조 발생 조건은? 어떤 객체의 값이 Null이 될 수 없는 상황에서 해당 객체를 참조할 때. 널 포인터 역참조는 객체의 값이 Null일 때 오류를 발생시킬 수 있다.
  • 즉, Null 이 될수 없는 객체의 값이 Null일 때, 해당 객체를 참조해 오류가 발생하는 것.
  • 공격자의 의도적인 널 포인터 역참조 발생 예외 상황으로 추후 공격에 활용가능
  • 파이썬에서 Null 객체가 없다. None 키워드를 사용해 null 개체, 변수를 정의한다
  • 파이썬에서 Null pointer dereference 발생하지 않는다. (널 포인터 값 대입시 일어나는 에러, C, C++, JAVA, Net 등에서는 발생한다)
  • 파이썬에서 None 이 0 또는 다른 값을 정의하지 않는다.

코드오류 해결 방안

  • None 반환 함수 사용 시 해당 함수에서 반환한 값(None 값, 0, 빈 문자열 등) 존재. 해당 값이 특정 조건문에서 False로 나올 수 있으므로 사용 유의
  • None 값이 될 수 있는 데이터 참조 전 해당 값이 None인지 검사해 시스템 오류를 감소시킬 수 있다. (조건문 사용, is None)

부적절한 자원 해제

  • 파일 식별자, 힙 메모리, 소켓 등의 프로그램 자원을 할당, 사용 후 반환하지 않을 때 프로그램 오류 및 에러발생
  • 파일을 열고 난 후, 예외처리 발생 시, 해당 파일을 꼭 닫아줘야 한다.

부적절한 자원 해제 해결 방안

  • 자원 사용을 자원 획득, 자원 사용, 자원 반환(또는 해제), 자원 반환(close) 으로 사용한다
  • try 절에서 할당한 자원이 예외가 발생 시, 해당 자원이 시스템에 반환되지 않는다. finally 절에서 예외로 인해 반환되지 못한 자원을 다시 반환해야 한다

신뢰할 수 없는 데이터의 역직렬화

  • 직렬화란? 클래스 인스턴스 정보를 바이트스트림으로 복사하는 작업이다. 프로그램에서 특정 클래스의 현재 인스턴스 상태를 다른 서버로 전달하기 위해 직렬화가 일어난다. 메모리상 실행 객체 상태를 그대로 복제해 파일로 저장하거나 수신 측에 전달한다.
  • 역직렬화란? 반대 연산으로 바이너리 파일, 바이트스트림 파일로 객체 구조를 복원하는 과정을 말한다.
  • 네트워크상에서 직렬화된 정보를 전달하는 과정에서, 공격자가 전송 데이터 또는 저장된 스트림을 조작가능한 경우, 신뢰할수 없는 역직렬화가 발생.
  • 신뢰할수 없는 역질렬화로 인해 무결성 침해, 원격코드 실행, 서비스 거부공격 발생 가능

신뢰할 수 없는 데이터의 역직렬화 해결 방안

  • 스택 메모리 사용 시, 초기화 여부와 상관없이 해당 메모리의 변수는 임의값이라고 생각하기 쉽다. 그러나 만약 초기화하지 않는다면, 해당 변수에는 이전 함수에 사용된 값을 포함하고 있다.
  • 공격자는 위 내용을 악용해 메모리 저장 값을 읽거나, 특정 코드를 실행한다.
  • 변수 사용 전 올바른 초기값 할당으로 스택 메모리 영역을 안전하게 사용한다.
  • 신뢰하는 데이터만 역직렬화 하도록 프로그램을 구성한다. (서명 이용 민감정보나 중요 정보를 전송 및 검증해 확인)
  • 역직렬화 데이터가 사전에 검증된 클래스만을 포함하는지 검증한다
  • 제한된 실행 권한으로 역직렬화 코드를 실행한다.
  • 해시값을 사용해 역직렬화 검증

#6 캡슐화

잘못된 세션에 의한 데이터 정보 노출

  • 다중 스레드 환경에서 싱글톤 객체 필드에 경쟁조건 발생 가능
  • 싱글톤 패턴이란? 객체의 인스턴스가 오직 1개만 생성되는 패턴
  • 전역 변수가 스레드별로 사용 시, 해당 변수는 스레드 별 지정 변수를 각각 담는게 아닌, 마지막 스레드가 사용한 값만 담게 된다.

잘못된 세션에 의한 데이터 정보 노출 해결 방안

  • 다중 스레드 환경에서는 정보 저장 전역 변수 포함되지 않도록 코드를 작성해 다른 세션에서 데이터를 공유하지 않도록 해야 한다. (변수 범위 유의)
  • 다중 스레드 환경에서 클래스 변수의 값은 하위 메소드와 공유되므로 필요시 인스턴스 변수로 선언해 사용한다.

제거되지 않고 남은 디버그 코드

  • 디버깅 목적 삽입 코드는 개발 완료 시 제거.
  • 디버그 코드는 민감정보, 설정 등 시스템 제어 정보를 담고 있을 수 있다.
  • 디버그 코드가 남겨진 채로 배포될 경우, 공격자가 식별 과정을 우회 또는 정보 노출로 이어질 수 있다.

제거되지 않고 남은 디버그 코드 해결 방안

  • SW 배포 전 디버그 코드를 확인 및 삭제한다.
  • Django, Flask 프레임워크는 전역 수준에서 DEBUG 모드 설정
  • Django 에서는 DEBUG 옵션 False로 지정 후 app_run()한다 (at settings.py)
  • 아래 페이지처럼 서버 에러코드만 나오게 된다. 만약 해당 옵션을 True 설정 시 시스템 관련 정보가 에러페이지에 노출 가능.

-Flask 에서는 app.debug를 False 로 설정한다 (default True)

Public 메소드로부터 반환된 Private 배열

-public으로 선언된 메소드 배열 반환 시, 해당 배열의 참조 객체가 외부에 공개된다. 외부에서 배열 수정, 객체 속성 변경이 가능해진다.

  • 배열 뿐 아니라 변경 가능한(mtable) 객체에 해당한다

Public 메소드로부터 반환된 Private 배열 해결 방안

  • private 선언 배열을 public 메소드에서 반환하지 않아야 한다.
  • 필요시에는 private 배열의 복사본을 반환. 배열의 원소는 clone() 메소드를 사용해 복사된 원소를 저장 및 사용한다.
  • 배열이 String 타입일 경우(immutable) privtate 배열의 복사본을 만들고 이를 반환하도록 작성한다( 배열 반환시 인덱스 슬라이싱 사용한다)

Private 배열에 public 할당

  • public 선언된 메소드 인자가 private 배열에 저장되면 외부에서 해당 배열 접근으로 배열의 수정과 객체 속성 변경이 가능.

Private 배열에 public 할당 해결방안

  • public 선언된 메소드 인자를 private 배열에 저장하지 않는다
  • 사용자 전달 값으로 클래스 외부에서 private 값 변경 금지, 필요시 별도 인스턴스 변수로 정의하거나, 값 검증 후 사용한다
  • 리스트 슬라이싱을 사용해 외부값을 private 배열에 대입한다

#7 API 오용

DNS lookup에 의존한 보안결정

  • 공격자가 DNS 엔트리를 속일 수 있다. 따라서 도메인명에 의존해 보안결정(인증 및 접근통제)를 하지 않아야 한다
  • 로컬 DNS 서버의 캐시가 공격자에 의해 오염된 상황이라면, 사용자와 특정 서버 간 네트워크 트래픽이 공격자를 경유하도록 할 수도 있다.
  • 공격자가 도메인에 속한 서버처럼 위장도 가능
  • 알약 등의 보안 프로그램은 DNS 내용을 확인하는 기능을 가지고 있다.

DNS lookup에 의존한 보안결정 해결 방안

  • 실제 서버의 IP와 도메인 주소를 비교해 DNS 변조에 대응한다.
profile
磨斧爲針

0개의 댓글