Yanıtlar:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
Mevcut bir dosya veya sembolik bir bağlantı tarafından ele geçirilmeye yatkın olan normal dosya oluşturma işleminin aksine, belirtilen ad mkfifo
veya alt işlev aracılığıyla bir ad borusu oluşturulması ya da belirtilen yerde yeni bir dosya oluşturur veya başarısız olur. Gibi bir : >foo
şey güvensiz çünkü eğer saldırgan çıktısını tahmin mktemp
edebilirse saldırgan kendisi için hedef dosyayı oluşturabilir. Ancak mkfifo foo
böyle bir senaryoda başarısız olur.
Tam POSIX taşınabilirliğine ihtiyacınız varsa, mkfifo -m 600 /tmp/myfifo
kaçırılmaya karşı güvenli ancak hizmet reddine eğilimlidir; Güçlü bir rasgele dosya adı üretecine erişmeden, yeniden deneme girişimlerini yönetmeniz gerekir.
Geçici dosyalardaki ince güvenlik sorunlarıyla ilgilenmiyorsanız, basit bir kuralı uygulayabilirsiniz: özel bir dizin oluşturun ve her şeyi orada tutun.
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
mı? Tuzak kendi değişken genişlemesini yapabilir mi?
$tempdir
anda trap
komut değerlendirilir anda tuzak tetiklenir değil. Bu durumda, değeri tempdir
tek bir alıntı içeriyorsa, kodunuzun her zaman işe yaradığı durumlarda, kodunuzun korkunç şekilde kırılması dışında herhangi bir fark yaratmaz .
$tempdir
Yerel olarak ilan edildiğimi ve tuzağın buna erişebilmesi için küresel olarak tanımlanması gerektiğini ortaya koydu . Şimdi mantıklı ...
$tempdir
değer değişmediği sürece , bu temelde tüm amaçlar için kabul edilebilir. Birden fazla geçici dosya / dizin oluşturmak için aynı adı kullanmamaya dikkat edin ...
Daha güvenli bir alternatif, güvenli mktemp
bir dizin oluşturmak için kullanmaktır , daha sonra adlandırılmış yönelticinizi bu dizinin içine koymak rm -R $dir
, sonunda dizinden kurtulmak için yapmaktır .
mktemp
FIFO'yu bir dizinde oluşturmayı seçtim , çünkü gerçekten kabul edilebilir tek cevap buydu.
"Kuru çalıştırma" seçeneğini kullanın:
mkfifo $(mktemp -ut pipe.XXX)
-u
"teşvik edilmez" seçeneğinin kullanılması .
-t
, ama güvenilir bir şekilde çalıştığı sürece, onunla giderdim.
-t
cesareti kırıldığı söyleniyor ?
mkstemp()
işlevi çağıran küçük bir C uygulaması yapardım ( linux.die.net/man/3/mkstemp ). -t
Anahtar, öyle cesareti değil -p
, benim hatam.
Kullanabilirsiniz mktemp
Geçici bir dosya oluşturmak için , sonra silin ve aynı isimli bir adlandırılmış kanal oluşturun.
Örneğin:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPE
önce mkfifo
kaçınmak yapmaktan ilişkili 'güvensiz' sorunu TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?
mkfifo
, kabuktan normal dosya oluşturmanın aksine, aslında güvenlidir. Olmazsa, bir dosya oluşturmak ve sonra onu silmek hiç yardımcı olmaz (aslında dosya adını tahmin etmesini istemeksizin saldırganın işini büyük ölçüde kolaylaştıracaktır). Dogbane'nin cevabı işe yarıyor ama ara dosya oluşturma işe yaramaz bir komplikasyon.
mktemp
Man sayfasının hangi açıdan -u
'güvensiz' diye adlandırıldığını biliyor musunuz ?
mktemp -d
, girişin için hala bazı puanların var. Yardımlarınız için teşekkürler, gerçekten minnettarım!
mktemp -u
normal bir dosya oluştururken güvensizdir, çünkü hizmet reddine karşı koruma sağlar (ürettiği ad yeterince tahmin edilemezse) ancak saldırganın programın burnunun altında dosyayı oluşturmasını engellemez. Normal bir dosya yerine bir fifo oluşturmak, man sayfasının ele almadığı nadir bir kullanım durumudur.
İki ayrı işlemle boruya isme göre erişilebildiği Unix'te mkfifo
ya da kullanın mknod
- bir işlem onu bir okuyucu, diğeri bir yazar olarak açabilir.
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
Belirtilen boru, herhangi bir dosya gibi silinebilir:
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe sadece bir kez okumak için normal bir dosya kullanılabilir.
mkfifo
. Geçici olarak adlandırılmış yöneltmeler hakkındaki soruma değil , mkdir
geçici dizinler oluşturmaya değiniyor.
mktemp
, güvenli bir şekilde adlandırılmış yöneltme oluşturmayı hedefleyen sorunları nasıl çözer?
mktemp
sonucun kendisinden adlandırılmış boruyu yaratacak bir kabuk fonksiyonuna sahip (tabii ki önce temp dosyasını silerek ve sonra mkfifo
aynı şekilde çalışarak ). mktemp
geçici bir dizin oluşturmak için de kullanılabilir, -t -d
anahtarla deneyin .