12

私は誰かのために汚いLinuxハックをしなければならなかったので、彼らはcupsenable printername非rootユーザーである間にshellコマンドでプリンターを起動することができました。構文全体をrootとして使用できるようにしたくなかったcupsenableので、入力をサニタイズしてargv[1]を呼び出すCラッパーを作成しましたsystem("cupsenable sanitizedprintername")

プログラムをsetuidrootにしましたが、それでもcupsenable「permissiondenied」で失敗しました。それから私setuid(0)は前に電話を入れました、そしてsystem()、見よ、それはうまくいきました。

ユーザーがプリンターを制御できるようにするためのより良い方法があるという問題は無視してください。おそらくもっと良い方法があります。私が興味を持っているのは、vs。vs chmod u+s.の複雑さsetuid(0)ですsystem()。なぜそのように振る舞ったのですか?

4

1 に答える 1

19

差出人man system

system()一部の環境変数の奇妙な値がシステムの整合性を損なうために使用される可能性があるため、set-user-IDまたはset-group-ID特権を持つプログラムから使用しないでください。exec(3)代わりに関数ファミリーを使用してください。ただし、またはは使用しないでexeclp(3)くださいexecvp(3)system()実際、/bin/shbash 2は起動時に特権をドロップするため、bashバージョン2であるシステムでset-user-IDまたはset-group-ID特権を持つプログラムからは正しく機能しません。

そしてからman bash

有効なユーザー(グループ)IDが実際のユーザー(グループ)IDと等しくない状態でシェルが開始され、-pオプションが指定されていない場合、起動ファイルは読み取られず、シェル関数は環境から継承されませんSHELLOPTS。これは環境に表示され、無視され、実効ユーザーIDは実際のユーザーIDに設定されます。

あなたのsetuid(0)電話はその保護を回避したようです。

于 2009-06-26T21:40:50.853 に答える