Używanie evaljest często odradzane, ponieważ pozwala na wykonanie dowolnego kodu. Jeśli jednak użyjemy eval echo, wygląda na to, że reszta ciągu stanie się argumentem, echowięc powinno być bezpieczne. Czy mam rację?
nie zawsze bezpieczne, możesz owinąć bombę widelcową lub paskudną rm -fR *
μολὼν.λαβέ
Być może jest to tylko eksperyment myślowy, ale jeśli tak naprawdę zamierzałeś to zrobić, aby przekazać mu wiele argumentów -n, możesz to zrobić za pomocą niecytowanej zmiennej, takiej jak echo $argumentslub jeśli $argumentsjest tablicą echo "${arguments[@]}". Korzystanie eval echojest bezcelowe, nawet jeśli były bezpieczne.
JoL,
Odpowiedzi:
40
Przeciwprzykład:
DANGEROUS=">foo"eval echo $DANGEROUS
Arbitralne argumenty echomogłyby zrobić coś bardziej nikczemnego niż utworzenie pliku o nazwie „foo”.
Także DANGEROUS="hello;ls":, dla dowolnych poleceń zamiast ls.
Kusalananda
2
Ponadto: DANGEROUS='$(ls)'(może być konieczne użycie większej liczby znaków ucieczki).
wizzwizz4
Czy eval echo '"'"$DANGEROUS"'"'zadziała? Wygląda na to, że na goo.gl/L2pPQP
Ismael Miguel
@ IsmaelMiguel To nie działa dla przykładów wizzwizz, Cyker lub sorontar, ani dla czegokolwiek z podwójnymi cudzysłowami w łańcuchu (np DANGEROUS='">foo"'.).
Gordon Davisson
Cerować. Wydawało mi się, że znalazłem coś, co trochę pomogło
Ismael Miguel,
26
@Celada zapewniła doskonałą odpowiedź. Aby zademonstrować, evalże jest naprawdę zły, oto coś bardziej nikczemnego niż tworzenie pliku o nazwie „foo” :
DANGEROUS='$(rm foo)'eval echo "$DANGEROUS"
I oczywiście może istnieć coś bardziej nikczemnego niż coś bardziej nikczemnego niż tworzenie pliku o nazwie „foo” .
+1 za wykazanie, że cytowanie zmiennej jak "$THIS"zamiast zwykłego jej $THISużywania nie pomaga!
Celada,
Pomocne wydaje się przesłanie dodatkowej pary cytatów. Coś jak eval echo '"'"$DANGEROUS"'"'. Wypróbuj na goo.gl/L2pPQP
Ismael Miguel
W rzeczywistości twój przykład nie jest bardziej nikczemny >foo, ponieważ „tworzenie pliku o nazwie„ foo ”niekoniecznie jest tym wszystkim >foo. Jedyną prawdziwą różnicą w twoim przykładzie jest to, że nie pozostawia po sobie pustego pliku. Treści wciąż nie ma.
flarn2006
12
Nie, nie zawsze jest bezpiecznie. Ewaluacja może wykonać dowolne polecenie.
Bezpieczne polecenie, takie jak to (data nie jest wykonywana, ponieważ znajduje się w pojedynczych cudzysłowach):
$ echo '$(date)'
$(date)
Staje się niebezpieczny, jeśli jest używany z eval:
$ eval echo '$(date)'SatDec2422:55:55 UTC 2016
Oczywiście data może być dowolną komendą.
Jednym ze sposobów, aby to poprawić, jest dodatkowo zacytowanie argumentów do oceny:
$ eval echo '\$(date)'
$(date)
Ale zwykle trudno jest poprawnie podać dwa razy wyrażenie.
I niemożliwe jest kontrolowanie poprawnego cytowania, jeśli wyrażenie może zostać ustawione przez zewnętrznego atakującego, na przykład:
$ var='$(date);echo Hello!'
$ eval echo "$var"SatDec2423:01:48 UTC 2016Hello!
Chociaż prawdą jest, że evalzawsze należy podchodzić ostrożnie, eval echokonstrukcja nie zawsze jest bezcelowa i można z niej bezpiecznie korzystać. Ostatnio potrzebowałem go, aby uzyskać ocenę wielu rozszerzeń nawiasów w kolejności, w jakiej ich potrzebowałem.
bash wykonuje wiele rozszerzeń nawiasów od lewej do prawej, więc
Działa to, ponieważ pojedyncze cudzysłowy chronią pierwszy zestaw nawiasów klamrowych przed rozwinięciem podczas analizowania evalwiersza poleceń, pozostawiając je do rozszerzenia przez wywołaną podpowłokę eval.
Może być jakiś sprytny schemat obejmujący zagnieżdżone rozszerzenia nawiasów klamrowych, który pozwala to zrobić w jednym kroku, ale jeśli jest, jestem za stary i głupi, aby to zobaczyć. Istnieją również inne powłoki, bashktóre pozwalają na bardziej uporządkowane sposoby osiągnięcia tego rodzaju rzeczy. Ale w każdym razie takie użycie evaljest bezpieczne, ponieważ wszystkie jego argumenty są stałymi ciągami znaków, które nie zawierają rozszerzeń parametrów.
Nie potrzebujesz tutaj echa i podstawiania poleceń (które również zależą od $ IFS). Mógłbyś zrobićeval xargs -I_ cat _/'{11..15}'/{8..5}.jpg
Stéphane Chazelas
To też działa, ale powoduje, że proces podpowłoki jest odradzany przez eval, dopóki nie zostanie zakończony proces xargs; wersja eval echo sprawia, że podpowłoka znika zanim jeszcze uruchomi się xargs. Jest to prawdopodobnie ważne tylko dla innych, którzy są tak analityczni jak ja w kwestii tego, co pojawia się w widokach drzewa htop i ustawia dzienniki -x :-)
-n
, możesz to zrobić za pomocą niecytowanej zmiennej, takiej jakecho $arguments
lub jeśli$arguments
jest tablicąecho "${arguments[@]}"
. Korzystanieeval echo
jest bezcelowe, nawet jeśli były bezpieczne.Odpowiedzi:
Przeciwprzykład:
Arbitralne argumenty
echo
mogłyby zrobić coś bardziej nikczemnego niż utworzenie pliku o nazwie „foo”.źródło
DANGEROUS="hello;ls"
:, dla dowolnych poleceń zamiastls
.DANGEROUS='$(ls)'
(może być konieczne użycie większej liczby znaków ucieczki).eval echo '"'"$DANGEROUS"'"'
zadziała? Wygląda na to, że na goo.gl/L2pPQPDANGEROUS='">foo"'
.).@Celada zapewniła doskonałą odpowiedź. Aby zademonstrować,
eval
że jest naprawdę zły, oto coś bardziej nikczemnego niż tworzenie pliku o nazwie „foo” :I oczywiście może istnieć coś bardziej nikczemnego niż coś bardziej nikczemnego niż tworzenie pliku o nazwie „foo” .
źródło
"$THIS"
zamiast zwykłego jej$THIS
używania nie pomaga!eval echo '"'"$DANGEROUS"'"'
. Wypróbuj na goo.gl/L2pPQP>foo
, ponieważ „tworzenie pliku o nazwie„ foo ”niekoniecznie jest tym wszystkim>foo
. Jedyną prawdziwą różnicą w twoim przykładzie jest to, że nie pozostawia po sobie pustego pliku. Treści wciąż nie ma.Nie, nie zawsze jest bezpiecznie. Ewaluacja może wykonać dowolne polecenie.
Bezpieczne polecenie, takie jak to (data nie jest wykonywana, ponieważ znajduje się w pojedynczych cudzysłowach):
Staje się niebezpieczny, jeśli jest używany z eval:
Oczywiście data może być dowolną komendą.
Jednym ze sposobów, aby to poprawić, jest dodatkowo zacytowanie argumentów do oceny:
Ale zwykle trudno jest poprawnie podać dwa razy wyrażenie.
I niemożliwe jest kontrolowanie poprawnego cytowania, jeśli wyrażenie może zostać ustawione przez zewnętrznego atakującego, na przykład:
źródło
Chociaż prawdą jest, że
eval
zawsze należy podchodzić ostrożnie,eval echo
konstrukcja nie zawsze jest bezcelowa i można z niej bezpiecznie korzystać. Ostatnio potrzebowałem go, aby uzyskać ocenę wielu rozszerzeń nawiasów w kolejności, w jakiej ich potrzebowałem.bash
wykonuje wiele rozszerzeń nawiasów od lewej do prawej, więcrozwija się do
ale najpierw potrzebowałem drugiego rozszerzenia nawiasu klamrowego, ustępując
Najlepsze, co mogłem wymyślić, żeby to zrobić
Działa to, ponieważ pojedyncze cudzysłowy chronią pierwszy zestaw nawiasów klamrowych przed rozwinięciem podczas analizowania
eval
wiersza poleceń, pozostawiając je do rozszerzenia przez wywołaną podpowłokęeval
.Może być jakiś sprytny schemat obejmujący zagnieżdżone rozszerzenia nawiasów klamrowych, który pozwala to zrobić w jednym kroku, ale jeśli jest, jestem za stary i głupi, aby to zobaczyć. Istnieją również inne powłoki,
bash
które pozwalają na bardziej uporządkowane sposoby osiągnięcia tego rodzaju rzeczy. Ale w każdym razie takie użycieeval
jest bezpieczne, ponieważ wszystkie jego argumenty są stałymi ciągami znaków, które nie zawierają rozszerzeń parametrów.źródło
eval xargs -I_ cat _/'{11..15}'/{8..5}.jpg