단일 프로세스로 액세스 가능한 임시 파일

단일 프로세스로 액세스 가능한 임시 파일

파일을 생성한 프로세스(및 해당 하위 항목)에서만 액세스할 수 있는 파일을 생성하고, 프로세스가 종료되면 파일이 사라지도록 하고, 이상적으로는 파일을 디스크에 유지하지 않으려고 합니다. 예를 들어, /mylocation/myfile.txt파일을 현재 프로세스에서만 읽을 수 있고 다른 프로세스에서는 읽을 수 없으며 동일한 사용자에게서도 읽을 수 없는 을 만들고 싶습니다 . /mylocation아래 어딘가와 같은 곳이 아닌 다른 마법의 위치를 ​​사용하고 싶지만 /prod/PID모든 파일 이름에 대해 작동해야 합니다.

배경은 $FOO/mypassword동일한 사용자 계정으로 실행되지만 비밀 비밀번호는 다른 여러 프로세스가 있는 기존 라이브러리를 사용하고 있다는 것입니다. 다른 프로세스에서 라이브러리로 비밀번호를 안전하게 전달하고 싶습니다. 이상적인 솔루션은 다른 사용자 계정을 사용하거나 라이브러리가 파일에서 비밀번호를 읽지 않도록 하는 것이지만 이러한 측면을 제어할 수는 없습니다.

답변1

글쎄요, "파일"의 의미와 라이브러리가 파일에 액세스하는 방법에 따라 다릅니다. 내가 생각한 몇 가지 접근 방식은 다음과 같습니다(두 가지 접근 방식).

  1. 일반적인 의미에서 임시 파일을 사용하십시오 mkstemp. mkstemp링크되지 않은 파일의 파일 설명자를 반환합니다. 그런 다음 $FOO/mypasswd에 대한 심볼릭 링크를 만들 수 있습니다 /proc/self/fd/returned_number. 파일을 열 때와 연결 해제 사이에 작은 창이 존재하며, 동일한 사용자로 실행되는 다른 프로그램에서는 파일을 열고 파일 설명자를 저장하여 나중에 비밀번호를 읽을 수 있습니다. 임시 디렉토리가 tmpfs에 있으면 디스크에 기록되지 않을 것임을 확신할 수 있습니다.
  2. seek비밀번호 파일이 필요하지 않은 경우 pipe/를 사용하여 pipe2파일 설명자를 만든 후 심볼릭 링크를 사용하여 위와 같이 진행합니다. 파이프에 비밀번호를 입력하는 경우를 처리하려면 하위 프로세스를 분기해야 합니다.
  3. 이를 위해 FUSE를 남용할 수도 있습니다.
  4. (또는 다른 동적 링커 트릭)을 사용하여 LD_PRELOAD// 가로채고 일반적인 위치에서 비밀번호를 입력하여 라이브러리를 "수정"할 수 있습니다.openreadclose

이것들 중 아무것도 아닌진짜다른 프로세스로부터 보호됩니다. 예를 들어, 동일한 사용자로 실행되는 다른 프로세스는 ptrace메모리에서 직접 프로세스를 읽고 비밀번호를 읽을 수 있습니다.

답변2

#!/bin/bash
exec 3<>file
rm file
exec program

정확하게 말하면 경쟁 조건이 있습니다. 그리고 프로그램은 파일 설명자를 사용해야 합니다. 파일 경로를 전달해야 하는 경우 를 사용하십시오 /proc/self/fd/3. 그러나 이론적으로는 다른 프로세스가 이 proc 경로를 통해 파일에 액세스할 수 있습니다(삭제된 경우에도).

관련 정보