Portál AbcLinuxu, 2. května 2025 05:30
Použití suid je nebezpečné. Tvoje řešení přes sudo ale není o moc lepší. Představ si situaci, že si na tvůj počítač někdo přinese svůj TrueCrypt svazek naformátovaný nějakým unixovým filesystémem, na kterém bude mít bash s nastaveným suid bitem vlastněný rootem. Když si takový svazek připojí s parametrem suid
, tak má plný přístup ke tvému počítači.
Já to vyřešil vlastním wrapperem (přiloženo níže), který teprve povoluji spouštět přes sudo bez hesla.
Pokud v tom wrapperu někdo objevíte chybu, budu vděčný za nahlášení.
$ visudo
. . .
%encrypted ALL=(root) NOPASSWD: /usr/local/bin/truecryptmount.sh
. . .
$ ls -l /usr/local/bin/truecryptmount.sh
-rwxr----- 1 root root 7076 2006-07-27 19:56 /usr/local/bin/truecryptmount.sh
$ cat /usr/local/bin/truecryptmount.sh
#!/bin/bash # #Tento skript slouzi ke zpristupneni nekterych funkci programu truecrypt #i beznym uzivatelum. Je urcen ke spousteni za pomoci sudo bez vyzadovani hesla. # # #Vycisteni promennych pouzivanych skriptem. # unset truecryptpath unset usergroupregexp unset options unset user unset group unset dmask unset fmask # #Nastaveni cesty k obsluznemu programu truecrypt. # truecryptpath=/usr/local/bin/truecrypt # #Test, zda byl skriptu predan alespon jeden parametr. # if [ $# -ge 1 ]; then # #Test, zda cesta k obsluznemu programu skutecne ukazuje na spustitelny #soubor. # if [ -x $truecryptpath ]; then # #Analyza predanych parametru. # case "$1" in # #Zadost o vypis vsech pripojenych svazku. Musi byt zdan prave jeden #parametr. # -l) if [ $# -eq 1 ]; then # #Vypis vsech pripojenych svazku. # $truecryptpath --list # #Pokud nebyl zdan prave jeden parametr, konci s chybou. # else exit 4 fi;; # #Zadost o odpojeni vsech pripojenych svazku. Musi byt zdan prave #jeden parametr. # -a) if [ $# -eq 1 ]; then # #Odpojeni vsech pripojenych svazku. # $truecryptpath -d # #Pokud nebyl zdan prave jeden parametr, konci s chybou. # else exit 5 fi;; # #Zadost o odpojeni konkretniho svazku. Musi byt zdany prave dva #parametry. # -u) if [ $# -eq 2 ]; then # #Kontola, zda druhy parametr je cesta k beznemu souboru #nebo adresari. # if [ -f "$2" -o -d "$2" ]; then # #Odpojeni svazku identifikovaneho pripojnym bodem nebo #zdrojovym souborem. # $truecryptpath -d "$2" # #Pokud druhy parametr neni cesta k beznemu souboru nebo #adresari, konci s chybou. # else exit 8 fi # #Pokud nebyly zdany prave dva parametry, konci s chybou. # else exit 6 fi;; # #Zadost o pripojeni svazku. Musi byt zadano prave osm parametru. # -m) if [ $# -eq 8 ]; then # #Nastaveni pomocne promenne s regularnim vyrazem, kteremu #musi odpovidat zadane jmeno uzivatele a skupiny. # usergroupregexp='[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_][ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-]*[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567899_.$-]\?'; # #Nastaveni pomocne promenne se jmenem uzivatele, ktery ma #byt vlastnikem souboru na pripojenem svazku. # user=`echo "$5" | grep -x -m 1 "$usergroupregexp"`; # #Nastaveni pomocne promenne se skupinou uzivatelu, ktere #maji nalezet soubory na pripojenem svazku. # group=`echo "$6" | grep -x -m 1 "$usergroupregexp"`; # #Nastaveni pomocne promenne se maskou prav k adresarum na #pripojenem svazku. # dmask=`echo "$7" | grep -x -m 1 '[0-7]\{3\}'`; # #Nastaveni pomocne promenne se maskou prav k souborum na #pripojenem svazku. # fmask=`echo "$8" | grep -x -m 1 '[0-7]\{3\}'`; # #Kontola, zda treti parametr je cesta k beznemu souboru, #ctvrty parametr je cesta k adresari a pomocne promenne #obsahuji retezec nenulove delky. # if [ -f "$3" -a -d "$4" -a -n "$user" -a -n "$group" -a -n "$dmask" -a -n "$fmask" ]; then # #Nastaveni pomocne promenne s parametry pro pripojeni #svazku. # options="uid=$user,gid=$group,dmask=0$dmask,fmask=0$fmask,utf8,noauto,nodev,noexec,nosuid"; # #Pokud druhy parametr obsahuje retezece '-r'... # if [ "$2" = '-r' ]; then # #...pripoj svazek se zadanymi parametry ze zadaneho #umisteni do zadaneho pripojneho bodu pouze pro #cteni. # $truecryptpath -r --mount-options "$options" "$3" "$4" # #Pokud druhy parametr obsahuje retezece '-w'... # elif [ "$2" = '-w' ]; then # #...pripoj svazek se zadanymi parametry ze zadaneho #umisteni do zadaneho pripojneho bodu pro cteni #i zapis. # $truecryptpath --mount-options "$options" "$3" "$4" # #Pokud druhy parametr nebosahuje reteze '-r' nebo '-w', #konci s chybou. # else exit 9 fi; # #Pokud neni spravne nastaven treti nebo ctvrty parametr #nebo alespon jedna promenna obsahuje retezec nulove delky, #konci s chybou. # else exit 10 fi # #Pokud nebylo zdano prave osm parametru, konci s chybou. # else exit 7 fi;; # #Pokud v prvnim parametru nebyl nalezen spravny prikaz, konci #s chybou. # *) exit 3;; esac # #Pokud cesta k obsluznemu programu neukazuje na spustitelny soubor, konci #s chybou. # else exit 2 fi # #Pokud skriptu nebyl predan ani jeden parametr, konci s chybou. # else exit 1 fi
$ exit
> # Read-only mód.
> sudo /usr/local/bin/truecryptmount.sh -m -r '/home/michalr/enc.tc' '/home/michalr/encmnt/' 'michalr' 'encrypted' '077' '177'
> # Unmount.
> sudo /usr/local/bin/truecryptmount.sh -u '/home/michalr/enc.tc'
> # Read-write mód.
> sudo /usr/local/bin/truecryptmount.sh -m -w '/home/michalr/enc.tc' '/home/michalr/encmnt/' 'michalr' 'encrypted' '077' '177'
> # Unmount all.
> sudo /usr/local/bin/truecryptmount.sh -a
> # List.
> sudo /usr/local/bin/truecryptmount.sh -l
if not něco then exit; dělej
než if něco then dělej else exit
a neporoste ti to tak do šířky
Takže: Brání tenhle skriptík tomu, abych nepřeplácnoul např. /bin něčím vlastním? Ani nechci domejšlet, co by se mohlo stát, jestli ne /bin
?
$PATH
, ne?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.