파일 열기, 보안의 핵심: Flatpak 사례로 배우는 안전한 파일 접근 방법

by DD
1개월 전
조회수 8

파일 열기(File Opening)는 간단해 보이지만, 보안 경계(Security Boundary)를 넘나들 때 TOCTOU(Time-of-Check to Time-of-Use) 레이스 컨디션(Race Condition) 등 다양한 취약점에 노출됨

안전한 파일 접근을 위해 파일 디스크립터(File Descriptor)를 사용하고, 경로 기반 API 사용을 최소화하는 fd-chasing 기법이 중요함

Flatpak의 사례를 통해 서드파티 라이브러리(Third-party Library)의 path 기반 API 사용이 보안 취약점(Security Vulnerability)을 야기할 수 있음을 보여줌

GLib/Gio APIRust의 파일 접근 API가 path 기반으로 설계되어 보안 문제를 야기할 수 있다는 비판이 제기됨

TOCTOU(Time-of-Check to Time-of-Use) 레이스 컨디션(Race Condition)과 해결책

파일 시스템(Filesystem)에서 파일 열기 시 발생하는 TOCTOU(Time-of-Check to Time-of-Use) 레이스 컨디션(Race Condition)은 보안 취약점의 주요 원인이다. 공격자는 파일 경로를 확인하는 시점과 파일을 사용하는 시점 사이에 파일 시스템을 조작하여 권한을 탈취할 수 있다. 이러한 문제를 해결하기 위해 파일 디스크립터(File Descriptor)를 사용하면, 커널(Kernel)이 파일의 inode를 고정하여 파일 시스템의 변경에 영향을 받지 않도록 한다. fd-chasing 기법은 디렉토리 파일 디스크립터를 사용하여 안전하게 경로를 탐색하는 방법이다.

fd-chasing 기법의 상세 구현

fd-chasing 기법은 `openat` 시스템 콜(System Call)과 `O_PATH` 플래그를 활용하여 구현된다. `O_PATH`는 파일을 열지 않고 파일 디스크립터(File Descriptor)를 얻어 파일 시스템의 안정적인 참조를 제공한다. `openat`을 사용하면 디렉토리 파일 디스크립터(Directory File Descriptor)를 기준으로 상대 경로를 열 수 있으며, `O_NOFOLLOW` 플래그를 통해 심볼릭 링크(Symlink)를 따르지 않고 심볼릭 링크 자체를 열 수 있다. libglnx는 이러한 기법을 활용하여 안전한 파일 시스템 연산을 제공하는 C 라이브러리이다.

Flatpak 사례를 통해 본 보안 문제

Flatpak은 샌드박스(Sandbox) 환경에서 애플리케이션을 실행하기 위해 설계되었지만, path 기반 API 사용으로 인해 보안 취약점이 발생했다. 특히, Flatpak은 D-Bus 서비스를 통해 샌드박스 내 애플리케이션으로부터 명령을 받아 실행하는데, 이 과정에서 path 문자열(Path String)을 사용함으로써 공격자가 권한을 탈취할 수 있는 경로가 열렸다. Flatpak 개발팀은 이러한 문제를 해결하기 위해 fd 기반 API로 전환하는 대규모 작업을 수행했다.

표준 라이브러리의 한계와 대안

표준 라이브러리(Standard Library)의 path 기반 API는 보안 문제를 야기할 수 있으며, 특히 GLib/Gio API와 Rust의 파일 접근 API가 이러한 문제점을 가지고 있다. 이러한 API는 파일 시스템의 안전성을 보장하지 못하며, 서드파티 라이브러리(Third-party Library)를 사용할 때 보안 취약점을 유발할 수 있다. 대안으로, fd-chasing과 유사한 방식으로 불투명한 핸들을 반환하는 API를 설계하여 파일 접근을 관리하는 방법이 제시되었다. 이는 FUSE를 활용하여 파일 시스템 접근을 관리하는 방법과도 연관된다.

How Hard Is It To Open a File?

댓글 0

첫 번째 댓글을 남겨보세요!