시큐어 코딩 가이드 · · 1 min read
3. 시간 및 상태
3.1. 경쟁조건: 검사 시점과 사용 시점(TOCTOU)
정의
병렬 시스템에서는 자원(파일, 소켓 등)을 사용하기에 앞서 자원의 상태를 검사한다. 하지만, 자원을 사용하는 시점과 검사하는 시점이 다르기 때문에, 검사하는 시점(Time Of Check)에 존재하던 자원이 사용하던 시점(Time of Use)에 사라지는 등 자원의 상태가 변하는 경우가 발생한다.
하나의 자원에 대하여 동시에 검사시점과 사용시점이 달라 생기는 보안약점으로 인해 동기화 오류 뿐만 아니라 교착상태 등과 같은 문제점이 발생할 수 있다.
안전한 코딩 기법
- 공유자원을 여러 프로세스가 접근하여 사용할 경우, 동기화 구문을 사용하여 한 번에 하나의 프로세스만 가능하도록(Synchronized, mutex) 하는 한편, 성능에 영향을 최소화하기 위해 임계코드 주변만 동기화 구문을 사용한다.
3.2. 종료되지 않는 반복문 또는 재귀 함수
정의
재귀의 순환횟수를 제어하지 못하여 할당된 메모리나 프로그램 스택 등의 자원을 과다하게 사용하면 위험하다.
귀납 조건이 없는 재귀 함수는 무한 루프에 빠져들게 되고 자원고갈을 유발함으로써 시스템의 정상적인 서비스를 제공할 수 없게 한다.
안전한 코딩 기법
- 모든 재귀 호출 시, 재귀 호출 횟수를 제한하거나, 초기값을 설정(상수)하여 재귀 호출을 제한해야 한다.