TL; DRはWindowsIdentity
のToken
プロパティに含まれるユーザトークンを(たとえば、someIdentity.Token
)ように偽装することができ:このWindowsIdentityコードを間違ったユーザーに騙すことは可能ですか?
var validated = new WindowsIdentity(someIdentity.Token);
は...そのユーザを表すと主張インスタンスが返され実際には認証されていませんが、IsAuthenticated
がtrue
、有効な.Name
、.User
などと設定されていますか?
以下、私はこれにいくつかの境界を置いています。 完全になりすましを防ぐことはおそらく不可能です。
全文:this answerで
、Damien_The_Unbelieverは巧みに私のいくつかのコードは、それがなかったとき、それはWindowsIdentity
インスタンス内の有効な認証済みのユーザーを持っていたと信じるようにだまさすることができることを実証しました。
WindowsIdentity identity = Thread.CurrentPrincipal == null
? null
: Thread.CurrentPrincipal.Identity as WindowsIdentity;
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
// ...use and trust the SID in identity.User, the
// username in identity.Name, etc....
}
(理由このコードあります:かいつまんでは、私のコードは、それが認証されたユーザを代表して、私は.User
でSIDに頼ることができると、Thread.CurrentPrincipal.Identity
場合WindowsIdentity
のインスタンスだったとIsAuthorized
がtrue
だったと仮定しました。スレッドではなく、WindowsIdentity.GetCurrent()
を使用している)
ていることにだますために彼のコードは(わずかに修正):。
var ident = WindowsIdentity.GetCurrent();
Thread.CurrentPrincipal = new WindowsPrincipal(ident);
var fakeSid = new SecurityIdentifier("S-1-3-0"/* E.g., some SID you want to trick me into believing is the real user */);
typeof(WindowsIdentity).GetField("m_user", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(ident, fakeSid);
かつ確実ENOあなたがそれをして上のコードを呼び出すと、コードがだまされてしまいます。 Kudos Damien。
だから真の軍拡競争方式で、ここでなりすましをキャッチし、それを拒否した私の改訂コードです:あなたが見ることができるように
WindowsIdentity identity = Thread.CurrentPrincipal == null
? null
: Thread.CurrentPrincipal.Identity as WindowsIdentity;
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
var validated = new WindowsIdentity(identity.Token);
if (!validated.User.Equals(identity.User) || !validated.IsAuthenticated || validated.IsAnonymous) {
// Something fishy is going on, don't trust it
} else {
// Good! Use the validated one
identity = validated;
// ...use and trust the SID in identity.User, the
// username in identity.Name, etc....
}
}
、それが提供するアイデンティティからToken
を取り、新しいWindowsIdentity
を作成し、そのトークンを使用するインスタンスIDのSIDが一致する場合、検証されたIDを信頼し続けます。 (documentation for WindowsIdentity(IntPtr token)
はIsAuthenticated
の初期値はfalse
になることを言いますが、それは私が有効なユーザートークンを使用して、それを作成したと仮定すると、私のテストでは、単に間違っている。)
私は考えだまさすることができることを見ることができる唯一の方法は、それにもかかわらず、それがWindowsが行う妥当性検査に合格している偽のユーザートークンである必要があります。それは私にはあり得ないようです。しかし、これは私の無知の領域です。
境界:
私はちょうど私の原因dilienceをやって、シングルサインオンのセキュリティここでの合理度の撮影だということに注意してください。悪意のあるアプリがシステムコール/侵害されたWindows自体を傍受することに成功した場合、私はそれについて多くのことを行うことはできません。ダミアンは他の質問に対するコメントで指摘したように、おそらく強力な命名法を完全に無視したホストコンテナを構築することができます(したがって、完全に偽のWindowsIdentity
タイプを与えることができます)。けっこうだ。完璧な殺し。私はちょうどダミアンが優しく実証したようにドアを開けたままにしたくない。私がシステムをリリースし、それが現場で簡単にハッキングされたならば、私はそれを恥ずかしく思うでしょう。 :-)
私の能力をはるかに超えていますが、大きな問題です!与えられた答えを見ることに興奮しています:) – levelonehuman
@levelonehuman私の考えはまさに! –
"Skeetは今私を失敗させない!" ;-) –