출력을 고정 이름 파일로 리디렉션하는 것은 보안 위험이 될 수 있다는 것을 읽었습니다 /tmp
. 공격자(또는 악의적인 사람)가 /tmp/tmpfileformyscript.tmp
스크립트를 실행할 때 파일이 생성된 것을 알아차리면(그가 내 파일에 대한 읽기 액세스 권한이 없더라도) script )script) 예를 들어, 그는 ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmp
내가 스크립트를 실행할 때 내 파일이 파괴되도록 하는 심볼릭 링크를 만들 수 있습니다 ..bashrc
그래서 나는 그런 것을 사용할 수 있습니다 filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"
.
그러나 때때로 캐싱을 위해 tmp 파일을 사용하고 싶은 경우가 있는데, 이 경우 "tmpfile.tmp.*"가 그 안에 일치하는 항목이 있는지 알고 싶고 일치 /tmp
하는 경우 새 파일을 만드는 대신 해당 파일을 사용합니다. 불행하게도 내가 아는 한 test
해당 기능은 파일 글로빙을 지원하지 않습니다.[ -f filename ]
그래서 내 질문은 두 가지입니다.
- 임시 파일을 안전하게 만드는 방법은 무엇입니까? 이것이
"predictablename.$RANDOM"
허용되는 관행입니까, 아니면 더 나은(더 안전하고 쉬운) 방법이 있습니까? - 이 파일에 쉽게 액세스하거나 나중에 검사하여 파일의 존재를 확인하려면 어떻게 해야 합니까
predictablename
?
답변1
사용mktemp
유틸리티는 예측할 수 없는 이름을 가진 임시 파일을 생성합니다. POSIX에 의해 표준화되지 않았지만 *BSD 및 Linux에서 사용할 수 있습니다.
> /tmp/predictable.$RANDOM
기본적으로 예측 가능하기 때문에 좋은 옵션은 아니며 공격자가 스크립트를 속여 쓰기 액세스 권한이 있는 파일을 덮어쓰거나 임시 파일에 대한 액세스 권한을 부여할 수 있는 공격에 스크립트를 노출시킵니다. 이것은 하나입니다안전하지 않은 임시 파일취약점. mktemp
파일이 안전하게 생성되고(심볼릭 링크가 포함되어 있더라도 기존 파일을 덮어쓰지 않음) 서비스 거부를 피할 수 있을 만큼 예측할 수 없는 이름을 사용하기 때문에 이 취약점은 존재하지 않습니다.
임시 파일을 생성하고 작업하는 것만으로는 충분하지 않은 경우 를 사용하여 임시 디렉토리를 생성 mktemp -d
하고 그 안에서 작업하십시오.
mktemp
또한 변수가 설정된 경우 사용 $TMPDIR
하고 설정되지 않은 경우 해당 변수로 돌아가도록 주의하세요./tmp
TMPDIR
점점 더 많은 배포판에서 UID가 있는 위치와 같은 개인 디렉터리를 설정하고 있습니다 /run/1234/tmp
. 1234
이는 더 이상 사용자 간에 임시 파일을 공유할 수 없는 대신 임시 파일 취약점의 위험을 제거합니다(가끔 유용하지만 자주는 아님, /tmp
여전히 사용 가능하지만 사용할 수 없음 TMPDIR
).
반복 가능한 파일 이름이 필요한 경우 사용자의 홈 디렉터리에 잘 정의된 이름(임의의 구성 요소 없음)으로 파일을 만듭니다. 현대의 실천은XDG 사용자 디렉토리 사양. 데이터 손실 없이 파일을 삭제할 수 있다면 XDG_CACHE_HOME
기본값이 ~/.cache
.
CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"
¹32767개의 가능한 값만 필요할 뿐만 아니라 많은 값을 시도하지 않고도 쉽게 예측할 수 있습니다. Bash의 난수 생성기는 다음과 같습니다.$RANDOM
LCGPID 및 최초 사용 시간을 기준으로 시드됩니다. Zsh는 시작 시 플랫폼 rand
에 의해 시드 됩니다. ATT Ksh는 rand
플랫폼의 PID 시드입니다. Mksh는 더 정교한 시드를 갖춘 LCG이지만 여전히 안전한 품질은 아닙니다. 이 모든 것은 다른 프로세스에 의해 예측될 수 있으며 성공 가능성이 매우 높습니다.
답변2
mktemp는 이러한 목적으로 설계되었습니다. 매뉴얼 페이지에서:
TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
echo "program output" >> $TMPFILE
mktemp는 파일을 생성하거나 0이 아닌 종료 상태로 종료합니다. 논리적 OR(||)는 mktemp가 파일을 생성할 수 없는 경우 스크립트가 종료되도록 합니다. 이 명령을 실행하면 파일을 사용할 수 있는지 확인할 수 있습니다. 다시 확인할 필요가 없습니다. 추가해야 할 유일한 것은 스크립트 끝에서 파일을 정리하는 것입니다.
이는 스크립트가 신호에 의해 종료되는 경우에도 마찬가지입니다. 그것이 필요한지 아닌지는 당신이 결정해야 할 것입니다.
두 가지 모두 명령을 사용하여 수행할 수 있습니다 trap
.