답변:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
기존 파일 또는 심볼릭 링크에 의해 하이재킹되기 쉬운 일반 파일 생성과 달리 네임 파이프 생성 mkfifo
또는 기본 기능 은 지정된 위치에 새 파일을 생성하거나 실패합니다. 같은 뭔가 : >foo
의 공격자가 출력을 예측할 수 있다면 있기 때문에 안전하지 않은 mktemp
다음 공격자가 자신의 목표 파일을 만들 수 있습니다. 그러나 mkfifo foo
그러한 시나리오에서는 실패 할 것입니다.
완전한 POSIX 이식성이 필요한 경우 mkfifo -m 600 /tmp/myfifo
하이재킹에 안전하지만 서비스 거부가 발생하기 쉽습니다. 강력한 임의 파일 이름 생성기에 액세스하지 않으면 재 시도를 관리해야합니다.
임시 파일과 관련된 미묘한 보안 문제를 신경 쓰지 않으면 간단한 규칙을 따를 수 있습니다. 개인 디렉터리를 만들고 모든 것을 보관하십시오.
tmpdir=
cleanup () {
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? 트랩 자체 변수 확장을 할 수 있습니까?
$tempdir
될 때 명령이 확장 됩니다 trap
. 이 경우 값이 tempdir
작은 따옴표 를 포함 하면 코드가 끔찍하게 부서지는 것을 제외하고는 아무런 차이가 없습니다 . 내 코드는 항상 작동합니다.
$tempdir
로컬에 선언 된 것으로 나타 났 으며 트랩에 액세스하려면 전역 적으로 정의해야합니다. 이제 이해가
$tempdir
값 이 변경되지 않는 한 기본적으로 모든 목적에 허용됩니다. 동일한 임시 이름을 사용하여 여러 임시 파일 / 디렉토리를 만들지 않도록주의하십시오.
"드라 이런"옵션을 사용하십시오.
mkfifo $(mktemp -ut pipe.XXX)
-u
옵션 사용은 "권장되지 않습니다".
-t
이지만, 안정적으로 작동하는 한 계속 사용할 것입니다.
-t
낙담 했다는 말은 어디에 있습니까?
mkstemp()
함수 ( linux.die.net/man/3/mkstemp )를 호출하여 작은 C 응용 프로그램을 만들 것 입니다. -t
스위치는, 그것이 낙담하지 않는 -p
, 내 나쁜.
mktemp
임시 파일을 생성 한 다음 삭제하고 동일한 이름을 가진 명명 된 파이프를 생성하는 데 사용할 수 있습니다 .
예를 들면 다음과 같습니다.
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPE
before를 삭제하면 mkfifo
관련된 '안전하지 않은'문제를 피할 수 TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
있습니까?
mkfifo
는 쉘에서 일반적인 정기적 인 파일 작성과 달리 실제로 안전합니다. 그렇지 않은 경우 파일을 만든 다음 삭제해도 전혀 도움이되지 않습니다 (실제로 파일 이름을 추측하지 않아도 해커의 작업을 크게 촉진시킵니다). 따라서 dogbane의 답변은 효과가 있지만 중간 파일 생성은 쓸모없는 합병증입니다.
mktemp
맨 페이지에서 -u
'안전하지 않은'옵션 이라는 것을 알고 있습니까?
mktemp -d
여전히 입력에 대한 몇 가지 포인트가 있습니다. 모든 도움을 주셔서 감사합니다. 정말 감사합니다!
mktemp -u
는 일반 파일을 만들 때 안전하지 않습니다. 서비스 거부에 대한 보호 기능을 제공하기 때문에 (파일 이름이 충분히 예측할 수없는 경우) 공격자가 프로그램에 따라 파일을 만들지 못합니다. 일반 파일 대신 fifo를 만드는 것은 매뉴얼 페이지에서 다루지 않는 드문 사용 사례입니다.
두 개의 개별 프로세스가 이름으로 파이프에 액세스 할 수있는 Unix를 사용 mkfifo
하거나 mknod
유닉스에서 사용합니다. 한 프로세스는 독자로, 다른 프로세스는 작가로 열 수 있습니다.
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
명명 된 파이프는 다른 파일과 마찬가지로 삭제할 수 있습니다.
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe는 한 번만 읽기 위해 일반 파일로 사용될 수 있습니다.
mkfifo
있습니다. 임시 명명 된 파이프 에 대한 내 질문은 mkdir
임시 디렉토리 작성을 다루는 것 이상 으로 다루지 않습니다 .
mktemp
를 안전하게 만드는 문제를 어떻게 해결 합니까?
mktemp
결과 자체 에서 명명 된 파이프를 생성하는 셸 함수를 사용하는 것입니다 (물론 임시 파일을 먼저 삭제 한 다음 mkfifo
동일한 방식으로 실행 ). mktemp
또한 임시 디렉토리를 만드는 데 사용될 수 있습니다 -t -d
.