Kabuk komut dosyalarından geçici dosyaları nasıl güvenli bir şekilde oluşturabilir ve erişebilirim?


14

Ben /tmpbir saldırgan (veya malcontent) /tmp/tmpfileformyscript.tmpbenim komut dosyası çalıştırdığımda bir dosya oluşturulduğunu fark ederse (benim için okuma erişimi olmasa bile) Örneğin, komut dosyamı çalıştırdığımda dosyamı ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmpyok etmeme neden olacak bir symlink yapabilir .bashrc.

Bunun yerine böyle bir şey kullanabilirim filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename".

Ancak, bazen önbelleğe almak için bir tmp dosyası kullanmak istiyorum, bu durumda "tmpfile.tmp. *" Öğesinin herhangi bir şeyle eşleşip eşleşmediğini bilmek istiyor /tmpve yeni bir dosya oluşturmak yerine bu dosyayı kullanıyorum. Ne yazık ki testve eşdeğeri [ -f filename ]anlatabildiğim kadarıyla dosya globbingini desteklemiyor.

Dolayısıyla sorum iki yönlü:

  1. Geçici olarak nasıl güvenli bir şekilde dosya oluşturabilirim? Kabul "predictablename.$RANDOM"edilebilir bir uygulama mı yoksa daha iyi (daha güvenli, daha kolay) bir yol var mı?
  2. Daha sonra kontrol ederek dosyaya nasıl kolayca erişebilir ve / veya varlığını nasıl belirleyebilirim predictablename?

Yanıtlar:


13

mktempTahmin edilemeyen bir adla geçici bir dosya oluşturmak için yardımcı programı kullanın . POSIX tarafından standartlaştırılmamıştır, ancak Linux'un yanı sıra * BSD'de de mevcuttur.

> /tmp/predictable.$RANDOMiyi bir seçim değildir çünkü çoğunlukla tahmin edilebilirdir¹, bu da komut dosyanızı saldırganın komut dosyanızı yazma erişimine sahip olduğunuz bir dosyanın üzerine yazması veya geçici dosyaya erişmesi için kandırabileceği bir saldırıya açar. Bu, güvenli olmayan geçici bir dosya güvenlik açığıdır. mktempbu güvenlik açığı bulunmaz çünkü dosyayı güvenli bir şekilde oluşturur (sembolik bağlantılar olsa bile mevcut bir dosyanın üzerine yazmaz) ve hizmet reddinden kaçınmak için yeterince öngörülemeyen bir ad kullanır.

Bir geçici dosya oluşturmak ve onunla çalışmak yeterince iyi değilse, ile geçici bir dizin oluşturun mktemp -dve orada çalışın.

mktemp$TMPDIRdeğişken ayarlanmışsa, ayarlanmamışsa geri düşmeye de özen gösterir /tmp.

Giderek daha fazla dağıtım TMPDIRözel bir dizin olarak ayarlandı , örneğin UID'niz /run/1234/tmpnerede 1234. Bu, geçici dosyaları güvenlik açıkları riskini ortadan kaldırır, maliyetler artık kullanıcılar arasında geçici dosyaları paylaşamayacaktır (bu bazen yararlıdır, ancak çok sık değildir; /tmphala mevcut değildir, sadece mevcut değildir TMPDIR).

Yeniden üretilebilir bir dosya adına ihtiyacınız varsa, kullanıcının ana dizini altında iyi tanımlanmış bir ada sahip (rastgele bir bileşeni olmayan) bir dosya oluşturun. Modern kural XDG kullanıcı dizini belirtimidir . Dosya veri kaybına neden olmadan kaldırılabilirse XDG_CACHE_HOME, varsayılan olarak ortam değişkenini kullanın ~/.cache. Muhtemelen uygulamanızın adını taşıyan bir alt dizin oluşturmalı ve orada çalışmalısınız.

CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"

¹ Sadece gelmez $RANDOMsadece 32767 olası değerleri alır, ama hatta birçok değerleri denemeden tahmin etmek kolaydır. Bash'ın rasgele sayı üreteci, PID ve ilk kullanım zamanı ile tohumlanan bir LCG'dir . Zsh's, platformun randbaşlangıç ​​zamanına göre ekildi. ATT Ksh's, platformun randPID tarafından tohumlandığını gösteriyor. Mksh, daha karmaşık ama yine de güvenlik kalitesinde bir tohumu olmayan bir LCG'dir. Hepsi oldukça büyük bir başarı şansı olan başka bir süreçle tahmin edilebilir.


Aslında sizin tartışmanız $TMPDIRve ~/.cachetam da ihtiyacım olan şey bu. Biraz daha düşündükten sonra, bunun olmasını istediğim tek nedenin /tmpbölümleme olduğunu fark ettim - böylece önbellek /homebölümü dolduramadı . Ancak bu kullanım durumu için bu tam bir sorun değil, bu yüzden bir alt dizin ~/.cacheihtiyaçlarıma mükemmel bir şekilde uyuyor ve güvenlik sorununu önlüyor.
Wildcard

mktempAIX veya Windows'ta Git kabuğunda kullanılamaz. file.$RANDOM$RANDOMTaşınabilir çözüm gibi görünüyor . $RANDOM$RANDOMBash rastgele sonuçlar bağımsız ve zayıf değildir varsayarak, 2 ^ 32 alanını artırmak gerekir.

@jww Bash'ın rastgele sonuçları zayıf: bu bir LCG, tahmin edilemezlik gerektirmeyen birçok uygulama için yeterince iyi olurken olduğu kadar tahmin edilebilir.
Gilles 'SO- kötü olmayı kes

9

mktemp bunun için tasarlandı. Man sayfasından:

TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
echo "program output" >> $TMPFILE

mktemp dosyayı oluşturur veya sıfır olmayan bir çıkış durumuyla çıkar. Mantıksal veya (||), mktemp dosyayı oluşturamazsa komut dosyasının çıkmasını sağlar. Bu komuttan sonra dosyanın kullanılabilir olduğundan emin olabilirsiniz. Tekrar kontrol etmeye gerek yoktur. Eklemeniz gerekebilecek tek şey, komut dosyanızın sonunda dosyanın temizlenmesi.

Ve muhtemelen komut dosyası bir sinyalle sonlandırıldığında. Bunun gerekli olup olmadığı karar vermeniz gereken bir şeydir.

Her ikisi de trapkomut kullanılarak yapılabilir .


Ah! Bu çok faydalı; aramam gerekmiyor $RANDOM. Ama sonra sorumun 2. kısmı — bu dosyaya daha sonra nasıl erişebilirim? (Çok basit bir önbellek uygulamak için.)
Wildcard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.