본문 바로가기
공부/KISA

경쟁조건: 검사시점과 사용시점(TOCTOU) - KISA 소프트웨어 개발 보안 가이드

by Skogkatt의 개인 블로그 2020. 7. 22.
반응형

https://www.kisa.or.kr/public/laws/laws3.jsp

 

기술안내서 가이드 < 관련법령·기술안내서 < 자료실 : 한국인터넷진흥원

기술안내서 가이드 한국인터넷진흥원 기술안내서 가이드 입니다. 게시판 목록 보기 기술안내서 가이드 표 대분류 소분류 기술안내서 가이드 대상 수준 인터넷 진흥 및 이용 활성화 인터넷 진흥

www.kisa.or.kr


구현 단계 시큐어코딩 가이드 - 시간 및 상태 - 경쟁조건: 검사시점과 사용시점(TOCTOU)

가. 개요

병렬 시스템(멀티 프로세스로 구현한 응용프로그램)에서는 자원(파일, 소켓 등)을 사용하기에 앞서 자원의 상태를 검사한다. 하지만, 자원을 사용하는 시점과 검사하는 시점이 다르기 때문에, 검사하는 시점(Time Of Check)에 존재하던 자원이 사용하던 시점(Time Of Use)에 사라지는 등 자원의 상태가 변하는 경우가 발생한다.

 

예를 들어, 프로세스 A와 B가 존재하는 병렬 시스템 환경에서 프로세스 A는 자원 사용(파일 읽기)에 앞서 해당 자원(파일)의 존재 여부를 검사(TOC) 한다. 이때는 프로세스 B가 해당 자원(파일)을 아직 사용(삭제) 하지 않았기 때문에, 프로세스 A는 해당 자원(파일)이 존재한다고 판단한다. 그러나 프로 세스 A가 자원 사용(파일 읽기)을 시도하는 시점(TOU)에 해당 자원(파일)은 사용 불가능 상태이기 때문에 오류 등이 발생할 수 있다.

 

이와 같이 하나의 자원에 대하여 동시에 검사시점과 사용시점이 달라 생기는 보안약점으로 인해 동기화 오류뿐만 아니라 교착상태 등과 같은 문제점이 발생할 수 있다.

 

나. 보안대책

  • 공유자원(예: 파일)을 여러 프로세스가 접근하여 사용할 경우, 동기화 구문을 사용하여 한 번에 하나의 프로세스만 접근 가능하도록(synchronized, mutex 등) 하는 한편, 성능에 미치는 영향을 최소화하기 위해 임계 코드 주변만 동기화 구문을 사용한다.

다. 코드 예제

JAVA
더보기

다음의 예제는 파일을 대한 읽기와 삭제가 두 개의 스레드에 동작하게 되므로 이미 삭제된 파일을 읽으려고 하는 레이스컨디션[각주:1]이 발생할 수 있다.

따라서 다음 예제와 같이 동기화 구문인 synchronized를 사용하여 공유자원 (Test_367.txt)에 대한 안전한 읽기/쓰기를 수행할 수 있도록 한다

 

C#
더보기

다음의 C# 코드도 파일에 동시에 접근하는 레이스 컨디션이 발생할 수 있다.

아래와 같은 코드를 추가하여 레이스 컨디션을 방지해야 한다.

 

C
더보기

아래 C 코드는 공유 자원 account에 대해 lock을 설정하지 않아 경쟁 조건이 발생할 수 있다. 입금과 출금이 빈번하게 발생하는 상황에서 경쟁 조건이 발생하면 account의 값이 달라진다. 아래 ex1은 정상적으로 deposit과 withdraw가 호출되는 상황이고 ex2는 경쟁 조건이 발생하는 상황이다. 최종 account의 값이 0과 -100으로 다른 것을 확인할 수 있다.

아래 C 코드는 mutex_lock()을 통해 공유 자원에 대한 동시 접근을 제한한 것이다.


참고자료

 

  1. 레이스컨디션(Race Condition): Race Condition은 두 개 이상의 프로세스가 공용 자원을 병행적으로(concurrently) 읽거나 쓸 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 달라지는 상황을 말한다. [본문으로]
반응형

댓글