3

特に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年以上にわたって開発されましたが、とにかく無視されることが多かった)であるとすると、どのような手法を使用して修正しますか?問題?

既知のオプションは次のとおりです。

  1. すべてのフォーマット呼び出しを変更して、実際の引数をフォーマット文字列と照合する関数を使用します。追加の引数は、関数に渡される実際の型を示します。(これはトリッキーであり、変更するフォーマット操作の数が非常に多いため、エラーが発生しやすい可能性がありますが、チェック機能自体が適切であれば、うまく機能します。)
  2. PQRHOMEへの直接パスを確立し、セキュリティについて検証し(詳細は以下を参照)、セキュリティが確保されていない場合は開始を拒否し、その後、$ PQRHOMEの値ではなく直接パスを使用します(異なる場合)。(これには、getenv()からの値ではなく、マップされたパスを使用するために$ PQRHOMEを使用するすべてのファイル操作が必要です。たとえば、これには、/ home / Attacker/pqrが/opt/pqrへのシンボリックリンクであることをソフトウェアが確立する必要があります。 / opt / pqrへのパスが安全であり、その後、ファイルが$ PQRHOME / some / thingsとして参照される場合は常に、使用される名前は/ home / Attacker / pqr/someではなく/opt/ pqr / some/thingになります。 /thing。これは大きなコードベースです。修正するのは簡単ではありません。)
  3. $ PQRHOME上のすべてのディレクトリが、シンボリックリンクを介して追跡している場合でも安全であることを確認し(詳細は以下を参照)、安全でないものがあるとソフトウェアは起動を拒否します。
  4. ソフトウェアのインストール場所へのパスをハードコーディングします。(これは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ルートプログラムが(非特権の)ユーザーが選択したフォーマット文字列を使用するように作成でき、少なくともプログラムをクラッシュさせる可能性があるため、おそらく取得できることを意味しますルートシェル。幸い、ローカルシェルアクセスが必要です。リモート攻撃ではありません。そこにたどり着くには無視できない量の知識が必要ですが、専門知識が「そこにある」わけではないと仮定するのは賢明ではないと思います。

したがって、私が説明しているのは「フォーマット文字列の脆弱性」であり、既知の攻撃パスには、プログラムを偽造して、安全なメッセージファイルにアクセスしていると思われるものの、実際にはメッセージファイル(フォーマット文字列を含む)を使用することが含まれます。これらは、ソフトウェアの制御下ではなく、ユーザーの制御下にあります。

4

2 に答える 2

2

$PQRHOMEオプション2は、実際のパスを解決してセキュリティを確認した後にに新しい値を書き込む場合に機能します。そうすれば、その後コードを変更する必要はほとんどありません。

setuid特権を保持する限り、ある種の特権分離を実行できれば、実際のユーザーからの入力を含むすべての操作が実際のuidで実行されるようになります。次に、特権プロセスと実際のuidプロセスは、socketpairまたはそれに類似したものを使用して通信します。

于 2008-10-12T23:24:00.270 に答える
1

まあ、それはパラノイアに聞こえますが、それがどのシステムで実行されているか、そして攻撃者がどのような損害を与える可能性があるかによって異なります。

したがって、ユーザーベースが敵対的である可能性があり、被害が非常に大きい可能性がある場合は、オプション4を選択しますが、その欠点を取り除くために次のように変更します。

2つの関連することを引用させてください。

1)

プログラムは現在、$ PQRHOMEとその下のキーディレクトリが「安全」であることを確認しています(pqrusrが所有し、pqrgrpに属し、パブリック書き込みアクセス権がありません)。

2)

その後、プログラムは環境変数の完全な値を介して$PQRHOMEの下のファイルにアクセスします。

フルパスを実際にハードコーディングする必要はありません。1)で説明した「プログラム」から2)でファイルが存在するパスまでの相対パスだけをハードコーディングできます。

制御する問題:

a)実行可能ファイルのパスとファイルのパスの間に「攻撃者がアクセスできる」もの(シンボリックリンクなど)がないことを確認する必要があります

b)実行可能ファイルが信頼できる方法で自身のパスをチェックすることを確認する必要がありますが、これは私が知っているすべてのUnixで問題になることはありません(しかし、私はすべてを知りませんし、ウィンドウも知りません)まったく)。


3番目のコメントの後に編集:

OSが/procをサポートしている場合、syslink / proc / $ {pid} / exeが解決する最良の方法ですb)


その上で寝た後に編集:

インストールは「安全な」プロセスですか?その場合は、(インストール時に)ラッパースクリプトを作成できます。このスクリプトは実行可能である必要がありますが、書き込み可能ではありません(場合によっては読み取り可能でもありません)。$ PQRHOME env varを「安全な」値に設定してから、実際のプログラムを呼び出します(最終的には他の便利なことも実行する可能性があります)。UNIXでは、実行中のプロセスのenv varsは、実行中のプロセス以外では変更できないため、安全です(もちろん、プロセスが開始する前に、親がenv varsを変更できます)。ただし、このアプローチがWindowsで機能するかどうかはわかりません。

于 2008-10-13T19:29:21.180 に答える