다음 리눅스 커널 버전 7.2에는 openat2 시스템 호출을 위한 OPENAT2_REGULAR 플래그가 포함됩니다. 이 기능을 통해 프로그램은 일반 파일만 열 수 있도록 보장하여, 예상치 못한 블로킹 동작과 보안 취약점을 유발할 수 있는 /dev/null이나 FIFO와 같은 특수 장치로 리디렉션되는 것을 방지할 수 있습니다.
커널에서 OPENAT2_REGULAR가 작동하는 방식 🛡️
OPENAT2_REGULAR 플래그는 openat2 호출에서 필터 역할을 합니다. 활성화되면 커널은 열기를 허용하기 전에 대상 파일이 일반 파일 유형(S_IFREG)인지 확인합니다. 파일이 블록 장치, FIFO 또는 소켓인 경우 작업은 EISDIR 또는 EPERM 오류와 함께 실패합니다. 이 확인은 심볼릭 링크를 확인한 후에 이루어지며, 링크를 사용하여 특수 장치를 가리키는 공격의 통로를 차단합니다. 이 구현은 사용자 파일을 처리하는 애플리케이션을 보호하기 위해 UAPI 그룹에서 요청했습니다.
/dev/null과 장난꾸러기 FIFO에 대한 걱정은 이제 안녕 😅
지금까지 믿음직한 프로그램은 파일을 열었는데 FIFO라서 영원히 데이터를 기다리게 하거나, 더 나쁘게는 /dev/null이 아무 말 없이 모든 출력을 삼켜버리는 상황에 처할 수 있었습니다. OPENAT2_REGULAR를 사용하면 이러한 걱정은 사라집니다. 파일이 일반 파일이 아니면 커널이 거절하고 개발자는 수 시간의 디버깅 시간을 절약할 수 있습니다. 마치 디스크 입구에 필터를 설치하여 가짜가 아닌 진짜 파일만 통과시키는 것과 같습니다.