アカウント名:
パスワード:
pledge は流行ると思いますか?
まず pledge がどういうものかを説明します。プログラムって、最初は設定ファイルを読んだり一時ファイルを開いたりするけど、その後メインループに入ったら権限を殆ど必要としないことが多いですよね。だから、 コマンドラインオプション等に応じて [openbsd.org] メインループ直前で権限を落とすという仕組みなんです。
だから最初は tame (調教する [openbsd.org]) という名前の関数でした。獰猛な野獣 (いったん任意のコマンド実行を許す脆弱性があると何でもできちゃう) を手なずける (脆弱性があっても殆どのシステムコールが実行不可能) という感じですね。
現在では主語が変
(完全に余談です)
従来どおりのアクセス制限の範疇になりますが、Windowsでも「落とす」方向の作りは珍しくありません。Windowsサービスで可能です。
具体的にはこういう風にします。サービスの実行ユーザーをLocalSystemアカウント(これは例えるならroot、強い権限を持っている)にします。このプロセスから、弱い権限のアカウントを実引数としてImpersonate系関数(seteuid/setegidで一時的に落とす感じ)やCreateProcessAsUser関数(forkしてsetuid/setgidしてexecする感じ)を呼び出します。
Impersonateはseteuid/setegid同様に戻り値で成功したことの確認が必須です。一方、CreateProcessAsUserは失敗したらプロセスの作成が行われないので、最悪エラーチェックなしでも幾分安全と言えると思います(もちろん、しなくていいとは言っていない)。
#seteuid/setegidやsetuid/setgidでの例えが正しいのか不安。
IISがやっているのがまさにそれですね。
そういえば、もしかしたら特殊ながらWindowsで「プログラムの途中で権限を落としていく」のようなことはできるかもしれません。すなわち「前例がある」と言えるかもしれません。
「自プロセスをOpenProcessTokenして、AdjustTokenPrivilegesでSE_PRIVILEGE_REMOVEDする」が可能なら、できると言えます。ドキュメントにはそう書いていないけど、自プロセスに対してSE_PRIVILEGE_REMOVEDはできないという制限がもしあったら、できないということになります。
これで落とせるのは「特権」と呼ばれるものになります。「物理メモリのロック」とか「時刻変更」とか「シャットダウン」とか、ファイルや各種オブジェクトに対するアクセス権限とは別の種類のアクセス制限です。特権の一覧:特権 [microsoft.com](これはちょっと古いので、Vista世代で増えたものが載っていない)
Chromiumのサンドボックスプロセスが普通にやってますよ。初期化時にだけ権限が必要な操作をやって以後権限を落としたり。
あれ、そうでしたか。あれは、低い権限のアクセストークンで新しいプロセスを作っているだけだと思っていました。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
pledge (スコア:5, 興味深い)
pledge は流行ると思いますか?
まず pledge がどういうものかを説明します。
プログラムって、最初は設定ファイルを読んだり一時ファイルを開いたりするけど、
その後メインループに入ったら権限を殆ど必要としないことが多いですよね。
だから、 コマンドラインオプション等に応じて [openbsd.org]
メインループ直前で権限を落とすという仕組みなんです。
だから最初は tame (調教する [openbsd.org]) という名前の関数でした。
獰猛な野獣 (いったん任意のコマンド実行を許す脆弱性があると何でもできちゃう) を
手なずける (脆弱性があっても殆どのシステムコールが実行不可能) という感じですね。
現在では主語が変
Re:pledge (スコア:0)
> プログラムの途中で権限を落としていくというのは、前例があるんでしょうか。
「落とす」ではなくて、プログラム上の必要な箇所だけ「上げる」というのは、Winodws NTがそうなってますね。
基本ポリシーとして Unix (TrustedUnix系を除く) は、全権限を持つものを根にして、子供が権限を落としていくという方法ですけど Windows は、全く権限の無い状態から、必要な箇所だけ認証して権限を上げるという方向です。
旧Unix 的な方式では、子供の不具合で親にロールバックした場合に権限が上がってしまうというアーキテクチャとしての欠陥があるので Windows 型の方式になった TrustedUnix というのが出てきたわけです。
Re:pledge (スコア:1)
(完全に余談です)
従来どおりのアクセス制限の範疇になりますが、Windowsでも「落とす」方向の作りは珍しくありません。Windowsサービスで可能です。
具体的にはこういう風にします。サービスの実行ユーザーをLocalSystemアカウント(これは例えるならroot、強い権限を持っている)にします。このプロセスから、弱い権限のアカウントを実引数としてImpersonate系関数(seteuid/setegidで一時的に落とす感じ)やCreateProcessAsUser関数(forkしてsetuid/setgidしてexecする感じ)を呼び出します。
Impersonateはseteuid/setegid同様に戻り値で成功したことの確認が必須です。一方、CreateProcessAsUserは失敗したらプロセスの作成が行われないので、最悪エラーチェックなしでも幾分安全と言えると思います(もちろん、しなくていいとは言っていない)。
#seteuid/setegidやsetuid/setgidでの例えが正しいのか不安。
Re: (スコア:0)
IISがやっているのがまさにそれですね。
Re:pledge (スコア:1)
そういえば、もしかしたら特殊ながらWindowsで「プログラムの途中で権限を落としていく」のようなことはできるかもしれません。すなわち「前例がある」と言えるかもしれません。
「自プロセスをOpenProcessTokenして、AdjustTokenPrivilegesでSE_PRIVILEGE_REMOVEDする」が可能なら、できると言えます。ドキュメントにはそう書いていないけど、自プロセスに対してSE_PRIVILEGE_REMOVEDはできないという制限がもしあったら、できないということになります。
これで落とせるのは「特権」と呼ばれるものになります。「物理メモリのロック」とか「時刻変更」とか「シャットダウン」とか、ファイルや各種オブジェクトに対するアクセス権限とは別の種類のアクセス制限です。特権の一覧:特権 [microsoft.com](これはちょっと古いので、Vista世代で増えたものが載っていない)
Re: (スコア:0)
Chromiumのサンドボックスプロセスが普通にやってますよ。初期化時にだけ権限が必要な操作をやって以後権限を落としたり。
Re:pledge (スコア:1)
あれ、そうでしたか。あれは、低い権限のアクセストークンで新しいプロセスを作っているだけだと思っていました。