Data - zestaw niedozwolony dla użytkownika danych www

0

Używam serwera lighttpd na Debian GNU / Linux 7.5 (wheezy) i chcę użyć strony php do zmiany czasu systemowego (wiem, że mogę po prostu zmienić czas strony, ale nie tego potrzebuję w tym projekcie). W tej chwili używam exec()polecenia, aby wydawać polecenia bezpośrednio i po prostu uruchomić skrypt powłoki. Więc albo:

exec('date --set [HH:MM:SS]')

lub

exec("sh /full/file/path/updateTime.sh") //contains command 'date --set [HH:MM:SS]'

Jeśli przełączę użytkownika w wierszu polecenia na www-data i spróbuję uruchomić polecenie date, otrzymam odpowiedź „data: nie można ustawić daty: operacja niedozwolona”.

Skrypt powłoki działa poprawnie, jeśli uruchomię go jako root.

Jeśli podam drugi argument, aby exec()zatrzymać odpowiedź, zawiera on datę / godzinę, którą próbuję ustawić.

Próbowałem również edytować sudoers, aby dodać

www-data        ALL=(ALL:ALL) ALL

pod user privilege specificationi includedir /etc/sudoers.dbez zmian. Próbowałem również utworzyć specyfikację aliasu Cmnd /bin/datei dodać ją do użytkownika danych www bez żadnych zmian.

Jestem prawie niedoświadczony we wszystkim, co się z tym wiąże, więc doceniam każdą pomoc.

Witryna nie będzie aktywna, ale zdaję sobie sprawę z niebezpieczeństw związanych z przyjmowaniem poleceń powłoki od użytkowników. Sprawdziłem php.iniplik, aby upewnić się, że exec()polecenie nie jest wyłączone. Próbowałem przekazać własność skryptu powłoki /var/www/do danych www bez zmian. Uprawnienia są na razie ustawione na 777.

Nacięcie
źródło

Odpowiedzi:

2

Jeśli dane www znajdują się w pliku sudoers, należy stwierdzić, że sudopolecenie nie potrzebuje hasła, ponieważ dane www nie mogą go wprowadzić.

Wpis sudoers powinien być www-data ALL=(ALL:ALL) NOPASSWD: ALL

Wtedy musiałbyś biec sudo date --set [HH:MM:SS]zamiast po prostu date --set [HH:MM:SS].

www-data nigdy nie powinna mieć sudopraw, chyba że używasz go tylko do własnego rozwoju, na serwerze testowym. To duża luka bezpieczeństwa.

Edycja: Spójrz na to pytanie, które jest simalar sudo w php exec ()

mt025
źródło
Byłoby bardziej bezpieczne (choć nadal zbyt niebezpieczne dla „prawdziwego” użytkowania), aby ograniczyć to, co dane www mogą zrobić tak samo date --setjak root. Nie jestem pewien, czy dobrze rozumiem składnię sudoers, ale myślę, że będzie to „www-data ALL = (root) NOPASSWD: / bin / date --set” (a potem użyj exec('/usr/bin/suro /bin/date --set [HH:MM:SS]'), chociaż twoje ścieżki mogą być nieco inne ).
Gordon Davisson
@GordonDavisson, dlaczego potrzebuję /usr/bin/sudododać część do argumentu w exec()poleceniu? Czy to dlatego, że to jest lokalizacja polecenia sudo (Znowu dużo się uczę, przepraszam, jeśli to brzmi jak głupie pytanie)?
Nick
Ponadto dodanie „--set” w sudoerach uniemożliwiło sudo cokolwiek, ale po prostu skończyło się to na „/ bin / date”. Dzięki!
Nick
@Nick: Nie sądzę, że naprawdę konieczne jest podanie pełnej ścieżki do sudo(lub datejednego z nich), po prostu wolę je dołączyć, na wypadek gdyby skrypt działał z dziwnym PATH, który nie zawiera odpowiednich katalogów. Jeśli chodzi o opcję „--set” powodującą problemy: być może trzeba określić, że dozwolony jest inny argument, na przykład „/ bin / date --set *”, ale jeśli po prostu go wyłączę, nie sądzę to znacznie mniej bezpieczne.
Gordon Davisson,
@GordonDavisson, okazuje się, że mój błąd polegał na umieszczaniu cudzysłowów wokół „/ bin / date --set *” w sudoers. Nie jestem pewien, dlaczego myślałem, że powinni tam być.
Nick
0

Oto inne podejście:

  • Utwórz FIFO (nazwaną potok) w dość bezpiecznym miejscu - każde miejsce, w którym nie można pisać na całym świecie, powinno być w porządku. 
  • Ustaw go jako www-datatryb 600. Lub 200 powinno działać.
  • Za każdym razem, gdy aplikacja PHP chce zmienić czas systemowy, niech zapisze nowy czas w FIFO.
  • Mieć proces demona, działający jako root, odczytywany z FIFO. Kiedy odczytuje poprawnie sformatowany czas, ustaw zegar systemowy.

Nie musisz się z tym bawić sudo. Najgorsze, co może się zdarzyć, jeśli ktoś włamie się do twojego systemu, ponieważ www-data może on zapisać zmiany czasu w FIFO i spowodować, że demon zmieni czas. Wydaje się prawie niemożliwe, aby atakujący mógł podnieść swoje uprawnienia do root (chyba że stworzysz lukę w demonie).

G-Man
źródło