Ist es möglich, diesen WindowsIdentity-Code dazu zu bringen, den falschen Benutzer zu verwenden?

TL; DR Kann das Benutzertoken in einem @ enthalten seiWindowsIdentity 'sToken Eigenschaft (sagen wir,someIdentity.Token) so gefälscht werden, dass:

var validated = new WindowsIdentity(someIdentity.Token);

... gibt eine Instanz zurück, die behauptet, einen Benutzer zu repräsentieren, der tatsächlich nicht authentifiziert wurde und doch @ haIsAuthenticated einstellentrue, gültiges.Name und.User Eigenschaften usw.

Below habe ich ein paar Grenzen gesetzt; es ist vermutlich unmöglich,vollständi fälschungssicher.

Die ganze Geschichte:

Imdiese Antwort, Damien_The_Unbeliever hat geschickt demonstriert, dass ein Code von mir ausgetrickst werden kann, dass er einen gültigen authentifizierten Benutzer in einem @ haWindowsIdentity Instanz, als es nicht tat. Kurz gesagt, mein Code ging davon aus, dass, wennThread.CurrentPrincipal.Identity war eine Instanz vonWindowsIdentity undIsAuthorized wartrue, dass es sich um einen authentifizierten Benutzer handelt und ich mich auf die SID in @ verlassen ka.User:

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....
}

(Es gibt einen Grund, warum dieser Code den Thread anstelle von @ verwendeWindowsIdentity.GetCurrent().)

Ihr Code, um das zu täuschen (leicht modifiziert):

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);

Und wenn Sie das tun, rufen Sie meinen obigen Code auf, mein Code wird getäuscht. Kudos Damien.

Also auf echte Wettrüsten-Mode, hier ist mein überarbeiteter Code, der die Parodie auffängt und sie leugnet:

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....
    }
}

ie Sie sehen können, dauert dasToken aus der angegebenen Identität und erstellt einNe WindowsIdentity Instanz mit diesem Token. Wenn die SIDs der Identitäten übereinstimmen, vertrauen wir weiterhin auf die validierte. (DasDokumentation fürWindowsIdentity(IntPtr token) sagt, dass der Anfangswert vonIsAuthenticated wird seinfalse, aber das ist in meinen Tests einfach falsch, vorausgesetzt, ich habe es mit einem gültigen Benutzertoken erstellt.)

Der einzige Weg, wie ich sehen kann, dass dies ausgetrickst werden könnte, ist ein gefälschter Benutzer-Token, der dennoch die von Windows durchgeführten Überprüfungen besteht. Das scheint mir unwahrscheinlich. Aber dann ist dies ein Bereich der Ignoranz für mich.

Grenze:

Ich sollte beachten, dass ich nur für ein @ schieangemesse Grad der Single-Sign-On-Sicherheit hier, nach meiner gebotenen Sorgfalt. Wenn eine böswillige App erfolgreich damit begonnen hat, Systemaufrufe abzufangen oder Windows selbst zu gefährden, kann ich nicht viel dagegen tun. Wie Damien in Kommentaren zu dieser anderen Frage ausführte, könnte er wahrscheinlich einen Host-Container erstellen, der starke Benennungen völlig ignoriert (und mir so ein völlig falsches @ geben könntWindowsIdentity Art). Meinetwegen. Perfektion tötet. Ich möchte einfach keine Türen offen lassen, wie es Damien freundlich demonstriert hat. Wenn ich ein System herausbringen würde und es so leicht auf dem Feld gehackt würde, wäre ich verdammt verlegen darüber. : -)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage