시큐어코딩
- home
- 보안소식
- 시큐어코딩
32. [시간 및 상태] 검사시점과 사용시점
2019.07.01 16:18
안녕하세요 지에스인포입니다.
오늘은 행안부 SW 개발보안가이드의 47개 보안 취약점 중 32번째 항목인 '검사시점과 사용시점'에 대해 공부 해 보겠습니다.
# 검사시점과 사용시점 : 자원을 사용하는 시점과 검사하는 시점이 달라서 자원의 상태변동으로 야기되는 보안 취약점
'검사시점과 사용시점' 보안취약점은 '시간 및 상태' 카테고리에 있는 항목으로서, 동시 또는 거의 동시 수행을 지원하는 병렬 시스템이나 하나 이상의 프로세스가 동작되는 환경에서 시간 및 상태를 부적절하게 관리하여 발생 할 수 있는 보안약점 중 하나입니다.
병렬시스템(멀티프로세스로 구현한 응용프로그램)에서는 자원(파일, 소켓 등)을 사용하기에 앞서 자원의 상태를 검사하게 되는데요. 그러나 자원을 사용하는 시점이 검사 시점과 다르기 때문에 검사하는 시점 (Time Of Check)에 존재하던 자원이 사용하던 시점(Time Of Use)에 사라지는 등 자원의 상태가 변하는 경우가 생겨나면, 이러한 보안 취약점이 발생하게 됩니다.
예를 들어, 프로세스 A와 B가 존재하는 병렬시스템 환경에서 프로세스 A는 자원사용(파일 읽기)에 앞서 해당 자원(파일)의 존재 여부를 검사(TOC)합니다. 이 때는 프로세스 B가 해당 자원(파일)을 아직 사용(삭제)하지 않았기 때문에, 프로세스 A는 해당 자원(파일)이 존재한다고 판단하게 됩니다. 그러나 프로세스 A가 자원 사용을 시도하는 시점(TOU)에 해당 자원은 사용불가능 상태이기 때문에 오류 등이 발생 할 수 있게 됩니다.
이와 같이 하나의 자원에 대하여 동시에 검사시점과 사용시점이 달라 생기는 보안약점으로 인해 동기화 오류 뿐 아니라 교착상태 등과 같은 문제점까지 발생 할 수 있는데요.
이를 방지하기 위해서는 공유자원(ex 파일) 을 여러 프로세스가 접근하여 사용 할 경우, 동기화 구문을 사용하여 한 번에 하나의 프로세스만 접근 가능하도록(synchronized, mutex) 하는 한편, 성능에 미치는 영향을 최소화 하기 위해 임계코드 주변만 동기화 구문을 사용하도록 해야 합니다.
좀 설명이 어렵죠? 예제와 함께 보시겠습니다!
위의 소스코드 예제는 하나의 파일에 대한 읽기와 삭제가 두 개의 스레드에 동작하게 되므로 이미 삭제된 파일을 읽으려고 하는 레이스컨디션이 발생 할 수 있습니다.
여기서 레이스컨디션이란?
-> 두 개 이상의 프로세스가 공용 자원을 병행적으로 (concurrently) 읽거나 쓸 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 달라지는 상황
즉, 위의 경우에서 파일에 대한 읽기(Access) 프로세스가 삭제(Delete) 프로세스보다 먼저 이루어졌다면 파일의 오류가 없지만, 삭제가 읽기보다 먼저 행해질 경우 읽기 프로세스 단계에서는 해당 파일을 찾지 못해 오류가 발생 할 수 있다는 것인데요. 이렇게 프로세스의 실행 순서에 따라 실행결과가 달라지는 부분은 안정적인 프로그램 로직 수행에 매우 큰 치명타를 입힐 수 있습니다.
따라서, 아래와 같이 시큐어코딩을 해 주는 것이 필요합니다.
위의 예제에서는 동기화 구문인 synchronized를 사용하여 공유자원 (Test_367.txt)에 대한 안전한 읽기/쓰기를 수행 할 수 있도록 하고 있습니다. 이렇게 하면 두 가지 이상의 프로세스가 동시에 수행되게 되어 아까와 같은 레이스컨디션의 문제를 미연에 방지 할 수 있겠지요?
시큐어코딩의 목적은 '프로그램이 개발자의 의도에 맞춰 안정적으로 수행되는 것'입니다. 따라서 직접적인 공격 뿐 아니라 이처럼 프로그램의 로직 수행에 있어서도 오류가 나지 않도록 정교하게 소스코드를 짜는 것 역시 시큐어코딩의 중요한 부분이라고 할 수 있겠습니다. 프로그래머가 많은 변수에 대해 정확히 대응 할 수록 소프트웨어의 보안성 역시 향상된다는 사실을 기억해야겠습니다.
오늘은 '검사시점과 사용시점(TOCTOU)' 항목에 대해 알아보았습니다.
다음에도 알차고 흥미로운 주제와 함께 찾아뵙겠습니다.
항상 정보보호 전문기업 (주)지에스인포의 블로그를 찾아주신 여러분들께 감사를 표하며, 오늘은 여기서 마침 인사 올리겠습니다.