問題タブ [setuid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - iPhone アプリをルートとして実行できますか?
作りたいiPhoneアプリのデザインを考えています。考えられる問題の 1 つは、(特定のネットワーク ポートにアクセスするために) このアプリケーションを root として実行する必要があることです。典型的な UNIX アプリでは、setuid を使用してアプリを実行するだけですが、iPhone アプリでそれが可能かどうか疑問に思っています。
Appleのフォーラムでこの質問を読みましたが、落胆しています:
http://discussions.apple.com/thread.jspa?threadID=1664575
Apple がプログラムでできることを制限したいと考えていることは理解していますが、ユーザーが昇格された特権でプログラムを実行する正当な理由はたくさんあります。ここでハッカー ツールを作成しようとしているわけではありません。
脱獄したiPhoneでこれを回避できると確信していますが、それは私が求めているものではありません. 壊れていない iPhone で昇格された権限でアプリを実行する方法はありますか?
(ところで、NDA について私に警告する必要はありません。)
security - 環境変数によって識別されるディレクトリ内のファイルへの安全なアクセス?
特にUnixとそのバリアントの場合、環境変数によって(部分的に)指定されたパスを介したファイルアクセスのセキュリティを処理するコードを誰かが指摘できますが、Windowsソリューションも興味深いですか?
これは非常に長い質問です。SOパラダイムにどれだけ適合するかはわかりません。
このシナリオを考えてみましょう。
バックグラウンド:
- ソフトウェアパッケージPQRは、ユーザーが選択した場所にインストールできます。
- 環境変数$PQRHOMEは、インストールディレクトリを識別するために使用されます。
- デフォルトでは、$ PQRHOMEの下にあるすべてのプログラムとファイルは、特別なグループpqrgrpに属しています。
- 同様に、$ PQRHOMEの下にあるすべてのプログラムとファイルは、特別なユーザーpqrusrまたはユーザーrootに属します(これらはSUIDルートプログラムです)。
- いくつかのプログラムはSUIDpqrusrです。さらにいくつかのプログラムはSGIDpqrgrpです。
- ほとんどのディレクトリはpqrusrによって所有され、pqrgrpに属しています。一部は他のグループに属することができ、それらのグループのメンバーはソフトウェアで追加の特権を取得します。
- 特権実行可能ファイルの多くは、pqrgrpのメンバーではない人が実行する必要があります。プログラムは、ユーザーがこの質問に直接関係しない難解なルールによって実行を許可されていることを検証する必要があります。
- 起動後、一部の特権プログラムは、存続期間にわたって多くのユーザーに代わって動作する可能性のある長時間実行デーモンであるため、昇格された特権を保持する必要があります。
- さまざまな不可解な理由により、プログラムはディレクトリを$PQRHOMEに変更することを許可されていません。
現在のチェック:
- プログラムは現在、$ PQRHOMEとその下のキーディレクトリが「安全」であることを確認しています(pqrusrが所有し、pqrgrpに属し、パブリック書き込みアクセス権がありません)。
- その後、プログラムは環境変数の完全な値を介して$PQRHOMEの下のファイルにアクセスします。
- 特に、G11NおよびL10Nは、「safe」ディレクトリ内のファイルにアクセスし、$ PQRHOMEから派生したフルパス名と既知のサブ構造(たとえば、$ PQRHOME / g11n / en_us / messages.l10n)。
$PQRHOMEの「インストール済み」の値が/opt/pqrであると想定します。
既知の攻撃:
- 攻撃者はPQRHOME=/ home / Attacker/pqrを設定します。
- これは実際には/opt/ pqrへのシンボリックリンクであるため、PQRプログラムの1つをpqr-victimと呼び、ディレクトリをチェックすると、正しい権限が与えられます。
- セキュリティチェックが正常に完了した直後に、攻撃者はシンボリックリンクを変更して、明らかに攻撃者の制御下にある/ home / Attacker/bogus-pqrを指すようにします。
- pqr-victimが、おそらく安全なディレクトリの下にあるファイルにアクセスすると、悲惨なことが起こります。
PQRは現在説明どおりに動作し、大規模なパッケージ(数百万行のコード、さまざまなコーディング標準に合わせて10年以上にわたって開発されましたが、とにかく無視されることが多かった)であるとすると、どのような手法を使用して修正しますか?問題?
既知のオプションは次のとおりです。
- すべてのフォーマット呼び出しを変更して、実際の引数をフォーマット文字列と照合する関数を使用します。追加の引数は、関数に渡される実際の型を示します。(これはトリッキーであり、変更するフォーマット操作の数が非常に多いため、エラーが発生しやすい可能性がありますが、チェック機能自体が適切であれば、うまく機能します。)
- PQRHOMEへの直接パスを確立し、セキュリティについて検証し(詳細は以下を参照)、セキュリティが確保されていない場合は開始を拒否し、その後、$ PQRHOMEの値ではなく直接パスを使用します(異なる場合)。(これには、getenv()からの値ではなく、マップされたパスを使用するために$ PQRHOMEを使用するすべてのファイル操作が必要です。たとえば、これには、/ home / Attacker/pqrが/opt/pqrへのシンボリックリンクであることをソフトウェアが確立する必要があります。 / opt / pqrへのパスが安全であり、その後、ファイルが$ PQRHOME / some / thingsとして参照される場合は常に、使用される名前は/ home / Attacker / pqr/someではなく/opt/ pqr / some/thingになります。 /thing。これは大きなコードベースです。修正するのは簡単ではありません。)
- $ PQRHOME上のすべてのディレクトリが、シンボリックリンクを介して追跡している場合でも安全であることを確認し(詳細は以下を参照)、安全でないものがあるとソフトウェアは起動を拒否します。
- ソフトウェアのインストール場所へのパスをハードコーディングします。(これはPQRでは機能しません。他に何もないとしても、テストは地獄になります。ユーザーにとっては、1つのバージョンしかインストールできず、アップグレードなどには並列実行が必要です。これはPQRでは機能しません。)
安全なパスのために提案された基準:
- ディレクトリごとに、所有者が信頼されている必要があります。(理論的根拠:所有者はいつでも権限を変更できるため、ソフトウェアのセキュリティを損なうようなランダムな変更を行わないように所有者を信頼する必要があります。)
- ディレクトリごとに、グループに書き込み権限がないか(グループのメンバーがディレクトリの内容を変更できないようにする)、またはグループが信頼されている必要があります。(理論的根拠:グループメンバーがディレクトリを変更できる場合、ソフトウェアのセキュリティを破ることができるため、ディレクトリを変更できないか、変更しないように信頼されている必要があります。)
- ディレクトリごとに、「others」はディレクトリに対する書き込み権限を持ってはなりません。
- デフォルトでは、ユーザーroot、bin、sys、およびpqrusrを信頼できます(binおよびsysが存在する場合)。
- デフォルトでは、GID = 0(ルート、ホイール、またはシステムとも呼ばれます)、bin、sys、およびpqrgrpのグループを信頼できます。さらに、ルートディレクトリ(MacOS Xではadminと呼ばれます)を所有するグループを信頼できます。
POSIX関数realpath()
は、/ home / Attacker/pqrを/opt/pqrにマップするマッピングサービスを提供します。セキュリティチェックは行いませんが、解決されたパスでのみ行う必要があります。
それで、それらすべてを背景として、セキュリティを確保するために漠然と関連した旋回を通過する既知のソフトウェアはありますか?これは過度に妄想的ですか?(もしそうなら、なぜ-そしてあなたは本当に確信していますか?)
編集:
いろいろなコメントありがとうございます。
@ S.Lott :(質問で概説されている)攻撃は、少なくとも1つのsetuidルートプログラムが(非特権の)ユーザーが選択したフォーマット文字列を使用するように作成でき、少なくともプログラムをクラッシュさせる可能性があるため、おそらく取得できることを意味しますルートシェル。幸い、ローカルシェルアクセスが必要です。リモート攻撃ではありません。そこにたどり着くには無視できない量の知識が必要ですが、専門知識が「そこにある」わけではないと仮定するのは賢明ではないと思います。
したがって、私が説明しているのは「フォーマット文字列の脆弱性」であり、既知の攻撃パスには、プログラムを偽造して、安全なメッセージファイルにアクセスしていると思われるものの、実際にはメッセージファイル(フォーマット文字列を含む)を使用することが含まれます。これらは、ソフトウェアの制御下ではなく、ユーザーの制御下にあります。
ruby-on-rails - Ruby on Railsからシステムタスクを実行するための最良の方法は何ですか?
私は小さなシステム管理Webアプリケーション(Web-Minと思いますが、RoRで)を構築しており、Rubyコードからシステムパラメーターにアクセスできる必要があります。たとえば、ユーザーがサーバーのホスト名、タイムゾーン、またはネットワーク構成を変更できるようにしたい。
私の現在の考えは、RoRコードから呼び出すことができ、アクションを実行できるように、別のsetuidスクリプト(Perl、Ruby、??)を用意することです。それは非常に面倒で、あまりエレガントではありません。私はRubyの初心者であり、この種のことを達成するためのより良い方法があるかどうか知りたいです。
ありがとう!
perl - Perl の Archive::Tar で tar アーカイブの setuid ビットを保存するにはどうすればよいですか?
Perl のArchive::Tarモジュールを使用しています。ファイルのアクセス許可は保持されますが、スティッキー ビットは保持されません。アーカイブを抽出するもう一方の端では、すべてのスティッキー ビットがなくなっています。UNIX/LINUX オペレーティング システムは、これらのスティッキー ビットを別の場所に格納していると思います。アーカイブにスティッキー ビットも保持させるにはどうすればよいですか?
tar に -p スイッチを使用すると保存されますが、 Archive::Tarを使用して保存するにはどうすればよいですか? 両側で Perl のモジュールを使用しています。
linux - ディレクトリの SUID ビットに意味を与える Unix ライクなシステムはありますか?
タイトルが示すように、Unix ライクなシステムはディレクトリの SUID ビットに意味を与えますか? もしそうなら、それはどういう意味ですか?
SVTX (保存されたテキスト、またはスティッキー) ビットには意味があります。ファイルに書き込むことができない限り、このディレクトリからファイルを削除してはなりません。たとえば、/tmp で使用されます。
SGID (set GID) ビットには意味があります。このディレクトリに作成されたファイルは、そのディレクトリを所有するグループに属します (ただし、後で chown(2) を明示的に呼び出すことで割り当てを変更できます)。
SUIDビットはどうですか?
c - BetterAuthorizationSample を使用している人はいますか?
OS X では、Apple が 2 つの推奨事項を公開した AuthorizationExecuteWithPrivileges() を介して特権操作が行われます。
setuid ヘルパー ツールを使用する古い MoreAuth。
システムに launchd ファイルを散らかしている現在の BetterAuthorizationSample。
後者を使用するアプリケーションは知りません...
c - system()で管理プログラムを呼び出すsetuid-root Cプログラム内にsetuid(0)が必要なのはなぜですか?
私は誰かのために汚い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()
。なぜそのように振る舞ったのですか?
linux - Linux で 1 つのスレッドの UID/GID のみを変更する
マルチスレッド プロセスで 1 つのスレッドのみの UID/GID を変更する方法はありますか?
この理由は、ファイル サービス アプリケーションを作成するためです。呼び出し元の uid/gid が正しいユーザーに設定されていない限り、ACL とクォータは適用されず、新しいファイル/ディレクトリは正しい uid/gid で作成されません。
通常、ネットワーク アプリケーションは最初に自分自身を fork() し、各ユーザー リクエストを個別のプロセスで処理します。共有データが必要な場合は、何らかの共有メモリを経由する必要があります。ただし、たとえば、FUSE (Linux ユーザー ファイルシステム) はデフォルトでマルチスレッドを使用し、Python バインディングと組み合わせてフォーク モデルを使用するのは現実的ではありません。
プロセス全体の「一貫した」UID は POSIX 標準に従っているようですが、古い Linux は POSIX に従っておらず、スレッドごとに異なる uid を許可していました。新しいカーネルは POSIX に従っているようですが、古い「壊れた」動作を許可する方法はありますか?
c - setuid ビットをオンに設定した後、プログラムをロードできません
実行可能ファイル A.bin が libY.so と libZ.so を使用するシナリオを考えてみましょう。Ac、Yc、Zc はすべて CZc で記述され、Yc はそれぞれの .so ファイルにコンパイルされます。
これはファイルのディレクトリ構造です
$home/bin/A.bin $home/lib/libY.so $home/lib/libZ.so
A.bin を通常のユーザーとして実行すると、A.bin は期待どおりに正常に実行されます。注: $LD_LIBRARY_PATH には $home/lib が含まれています
Ac の一部のコードを変更して、管理者権限が必要な機能を追加しました (1000 未満のポートへのバインドなど)。A.bin、libY.so、および libZ.so の setuid ビットを rwsrwsrws に設定し、ファイルの所有権を root に変更します。A.bin を実行しようとすると、次のエラーが表示されます
ld.so.1: A.bin: 致命的: libY.so: オープンに失敗しました: そのようなファイルまたはディレクトリはありません Killed
これらすべてのファイルから setuid 権限を削除すると、ルート権限が必要な機能が失敗することを除いて、バイナリが実行されます。
この問題を克服するには?
編集:OSはSolaris 5.10です