아래와 같은 코드는 TOCTOU 문제를 야기할 수 있습니다.
TOCTOU 문제는 자주 발생할 수 있는 문제인데요, TOCTOU 문제가 무엇인지 어떤 상황에 발생할 수 있는 살펴보겠습니다.
TOCTOU는 'Time of check to time of use' 의 약자입니다. 소프트웨어 개발 시 조건과 조건의 결과 사이에서 시스템의 변경을 이용한 Race condition이라고 할 수 있습니다. 특히 어떤 리소스를 사용하기 전에 리소스 상태를 체크하는 로직 사이에서 많이 발생할 수 있습니다.
이해가 잘 안되실 수 있으니 아래 코드를 예시로 말씀드리겠습니다. access() 호출 이후 unlink를 호출합니다. 의도는 access로 파일이 존재한다면 unlink로 파일을 제거하려는 코드인 것 같습니다. 여기서 TOCTOU가 발생할 수 있습니다. 조건인 access와 조건의 결과로 수행하는 unlink 사이에 race condition으로 파일을 바꿔치기 한다면 다른 파일이 삭제될 수 있습니다. 아주 짧은 순간이겠지만 Race Condition으로 충분히 가능한 문제입니다.
1 2 3 4 | if (access(filePath, F_OK) != -1) { unlink(filePath); } |
예제를 하나 더 살펴볼까요? Wikipedia에 등록되어 있는 예제입니다. 여기서도 조건 access 이후에 조건의 결과로 파일을 open합니다. access()와 open() 사이에 충분히 TOCTOU 문제가 발생할 수 있을 것 같습니다. Attacker가 공격할 수 있는 여지를 주고 있습니다. setuid() 이용하는 Victim을 속여 시스템 암호를 저장하는 파일을 덮어쓰기를 시도하고 있습니다.
Victim |
Attacker |
||||
|
|
이렇게 TOCTOU 공격은 Unix 파일시스템 Operation 사이에서 많이 발생할 수 있습니다. 파일시스템 외에도 소켓이나 데이터베이트 트랜잭션 등에서도 발생할 수 있습니다.
그럼 이 문제를 어떻게 막아야 할까요? TOCTOU 문제는 개념적으로는 매우 단순하지만 이 문제를 회피하거나 발생한 문제를 막기엔 굉장히 까다롭고 어렵습니다. 위의 두 예시는 모두 파일 디스크립터가 아닌 파일 이름으로 참조하기 때문에 동일한 파일이라는 보장이 없습니다. 만약 프로그램이 root 권한이라면 심볼릭 링크등을 이용해 높은 권한을 얻은 프로그램이 동작할수도 있겠죠. TOCTOU 문제는 아래 Link들을 추가로 참고해주세요!
https://wiki.sei.cmu.edu/confluence/display/c/FIO45-C.+Avoid+TOCTOU+race+conditions+while+accessing+files
https://cwe.mitre.org/data/definitions/367.html
'Linux > System Programming' 카테고리의 다른 글
shared memory with mutex (1) | 2022.04.17 |
---|---|
[inotify] inotify로 watch 중인 파일을 vi(vim)나 gedit으로 수정 시 문제 (0) | 2018.12.10 |
[Inotify] 파일 이벤트 감시 (2) | 2018.06.11 |
shared memory with semaphore (2) | 2018.05.19 |
[ODP] 실행시간 측정하기 (0) | 2018.05.17 |