Setuid shell scriptek esetében

Fórumok

Sziasztok!

Szerintetek ez miért nem működik?

Szeretném, ha egy bash script más felhasználó jogaival futna ha bárki elidítja. Ehhez a következőt csinálom:

A kívánt felhasználó jogaival létrehozom a fájlt:
# vi teszt.sh:


#!/bin/bash
whoami
:x!

Majd beállítom a futtathatóságot és a setuidet:
# chmod +x teszt.sh
# chmod +s teszt.sh

Ezekután a fájl így néz ki:


-rwsr-sr-x  1 geri     www             19 aug 17 10:19 teszt.sh*

Más felhasználói névvel bejelentkezve és a programot lefuttatva azonban az eredmény a következő:


# su - tamas
#./teszt.sh
tamas

... vagyis a scriptben található "whoami" parancs szerint a várt output eredménnyel ("geri") ellentétben a user továbbra is "tamas", nem pedig a setuid "geri"... És sajnos ha más parancsot hajtok végre abban a szkriptben, pl. rsync, stb, az is a "tamas" jogaival hajtodik vegre, nem pedig a "geri" jogaival.

Most vagy én használom rosszul ezt a látszólag egyértelmű dolgot, vagy ezt ilyen formában meg sem lehet oldani? :(

Hozzászólások

shell szkripten nem lehet setuidot használni

Tenni éppenséggel lehet, csak figyelmen kívül hagyja a rendszer biztonsági okokból (race condition: az interpreter (például bash) indítása után, de még mielőtt maga a bash megnyitná a végrehajtandó fájlt, rosszindulatú támadó ki tudja cserélni az adott fájlt (például inket átirányít a rendszergazda setuidosáról egy másik fájlra)), ekkor a bash root jogokkal hajtana végre egy szkriptet, de nem azt, amelyiken a setuid bit van.

suid perl is megoldas lehet helyette.

No.. köszi mindenkinek. Végülis úgy oldottam meg, hogy a sudoers fájlt módosítottam (úgy, hogy ne kérjen jelszót, mivel ez egy remote automata szkript volna, amit több szerveren hív meg egyszerre egy második és harmadik szkript...), és a szkriptben pedig: "sudo rsync -a ...."

Így már működik :)

Ja, amúgy érdekesség:

Úgy is próbáltam ügyetlenkedni, hogy csináltam egy másolatot az 'rsync' binárisból 'rsync_suid' néven. Aztán beraktam ugyanabba a könyvtárba, mint a szkript, és chmod +s ... . A szkriptben pedig átírtam, hogy az így SUID-é tett rsycet hívja meg.

Persze, nem működött. A SUID-es rsync a scriptből meghívva sem futott más felhasználó jogaival (míg szkripten kívül, shellből elindítva úgy működött, ahogy várni lehetett). Tehát, ezek szerint nem csak a szkriptet magát, de az abból meghívott programokat is hiába SUID-eled... Hm. :)

szerintem azt kell irni az elejere, hogy

#! /bin/bash -p

lehet, hogy van mas megoldas is, ilyenkor a bash privileged mode-ban fut, es nem allitja vissza elvileg az effective user id-t a real user id-re.

- Use the Source Luke ! -