Czy jest jakaś zaleta tworzenia pliku tymczasowego w sposób bardziej staranny sposób
Pliki tymczasowe są zazwyczaj tworzone w katalog tymczasowy (taki jak /tmp
), w którym wszyscy inni użytkownicy i procesy mają dostęp do odczytu i zapisu (każdy inny skrypt może utworzyć nowe pliki). Dlatego skrypt powinien być ostrożny w tworzeniu plików, takich jak używanie z odpowiednimi uprawnieniami (np. Tylko do odczytu dla właściciela, patrz: help umask
) i nazwa pliku powinna być trudna do odgadnięcia (idealnie losowa). W przeciwnym razie, jeśli nazwy plików nie są unikalne, może stworzyć konflikt z tym samym skryptem uruchamianym wiele razy (np. race condition) lub jakiś atakujący może albo porwać niektóre poufne informacje (np. Gdy uprawnienia są zbyt otwarte i nazwa pliku jest łatwa do odgadnięcia) lub utworzyć/zastępowanie pliku własną wersją kodu (np. zastępowanie poleceń lub zapytań SQL w zależności od tego, co jest przechowywane).
Można używać następujące podejście do tworzenia katalogu tymczasowego:
TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"
lub plik tymczasowy:
TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"
Jednak wciąż jest przewidywalny i nie uważane za bezpieczne.
Zgodnie man mktemp
, możemy przeczytać:
Tradycyjnie wiele skryptów powłoki przyjąć nazwę programu z PID jako przyrostek i użyć jej jako tymczasową nazwą. Ten schemat nazewnictwa jest przewidywalny, a warunki wyścigu, które stwarza, są łatwe do wygrania przez atakującego.
więc pewności, zaleca się użyć polecenia mktemp
stworzyć niepowtarzalny tymczasowy plik lub katalog (-d
).
Nie używaj plików tymczasowych. Zamiast tego używaj tymczasowych katalogów. I nie używaj mktemp. Zobacz tutaj, dlaczego: http://www.codeproject.com/Articles/15956/Security-Tips-for-Temporary-File-Usage-in-Applicat – ceving
@ceving Ten artykuł jest po prostu błędny, przynajmniej po zastosowaniu do polecenia powłoki mktemp (w przeciwieństwie do wywołania biblioteki mktemp). Ponieważ mktemp tworzy sam plik z ograniczoną umaską, atak ten działa tylko wtedy, gdy atakujący działa na tym samym koncie, co atakujący ... w takim przypadku gra jest już stracona. Aby uzyskać najlepsze praktyki w świecie skryptów powłoki, zobacz http://mywiki.wooledge.org/BashFAQ/062 –
Możesz również użyć 'tempfile (1)' na systemach, które go mają. –