2015-11-06 2 views
15

ли System.Security.Principal.WindowsIdentityразумно защищены от взлома, например, что экземпляр я получаю от Thread.CurrentPrincipal «s Identity или WindowsIdentity.GetCurrent() которого true для IsAuthenticated дает свою сборочную ложную идентификационную информацию? Ничто, конечно, не является полностью защищенным от несанкционированного доступа, но, учитывая приверженность Microsoft и зависимость от .Net, я ожидал бы, что критические API, подобные этому, будут Locked Down Hard и с трудом подделать. Является ли это обоснованным предположением с моей стороны?Является ли это использование System.Security.Principal.WindowsIdentity разумно безопасным?

Моей целью здесь является предоставление разумного опыта SSO в моей сборке. Если сама Windows подверглась риску, это не входит в мой контроль, но если (например) это простое дело для приложения, связанного с моей сборкой, чтобы подавать мне ложную информацию, это было бы для меня неспособным выполнить должную осмотрительность. Это большая область невежества для меня.

Чтобы быть ясным, я ищу твердую информацию, а не мнения о манжете. Таким образом, опубликованные эксплойты или продемонстрировали использование конструктора WindowsIdentity таким образом, чтобы обмануть мой код и т. Д. Или на стороне «это допустимое предположение», надежные статьи, поддерживающие его, известные применения, полагающиеся на него, и т. Д. Я «Было много удачи в их поиске, но я включил то, что я нашел до сих пор ниже под разделителем.

Вот как я намерен использовать WindowsIdentity:

using System.Security.Principal; 
using System.Threading; 
// ... 

// I only want Windows-authenticated users 
WindowsIdentity identity = Thread.CurrentPrincipal == null 
    ? null 
    : Thread.CurrentPrincipal.Identity as WindowsIdentity; 
SecurityIdentifier sid; 

// I can't imagine how an authenticated account would be anonymous, but... 
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) { 
    // SSO success from thread identity 
    sid = identity.User; 
    // ...check that that SID is allowed to use our system... 
} else { 
    identity = WindowsIdentity.GetCurrent(); 
    if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) { 
     // SSO success from current Windows user 
     sid = identity.User; 
     // ...check that that SID is allowed to use our system... 
    } else { 
     // SSO fail 
    } 
} 

Это в сборке DLL   —, к сожалению, мы застряли на .Net 3.5   — что обеспечивает публичный API к ресурсам, может быть ограничено права пользователя. Он может использоваться в настольных приложениях или в приложении ASP.Net IIS с проверкой подлинности Windows (ASP.Net устанавливает WindowsIdentity экземпляр на Thread.CurrentPrincipal.Identity при использовании Windows auth, мы не поддерживаем другие виды IIS-аутентификации в настоящее время).

Могу ли я обоснованно доверять SID из экземпляра WindowsIdentity из тех источников, которые утверждают, что они прошли аутентификацию?

не приходило мне интересно, если это было в порядке (Doh!), пока в this question пользователь lc. поднял обеспокоенность тем, что сборка будет восприимчив к обманули злонамеренным приложением, которое связано с ним и " подделанной "этой информацией. У него не было никаких конкретных доказательств, указывающих на то, почему это может быть серьезной проблемой, хотя, следовательно, этот вопрос.


Что (мало) я нашел до сих пор:

  • This answer делает заявление

    Вы можете доверять, что нынешний WindowsIdentity, кто это говорит, что это, поскольку так как вы можете доверять любой данной части данных в своем приложении.

  • Книга Hacking the Code утверждает, что ASP.Net требует WindowsIdentity ассоциироваться с просьбой при выполнении проверки файла authorizaton, что если это правда кажется довольно прочной основой для Microsoft говоря, по крайней мере, считает его достаточно хорошо ,

  • Я могу найти множество примеров счастливых людей, используя информацию в своем коде, но большинство из них не задают вопрос о том, являются ли они безопасными. Там в Подразумевается, но ...

+0

В каком контексте вы спрашиваете об этом? Вы говорите о приложениях ASP.NET и Desktop. Это может быть очевидно, но [при запуске на «pwned» системе все ставки отключены - вредоносный пользователь может вводить и изменять в вашем процессе любым способом] (http://stackoverflow.com/questions/8357469/ как-могу-я-защита-мой-частный-funcs-противы-отражений-исполнитель). – CodeCaster

+0

@CodeCaster: если сама Windows правильно взломана, это не в моих силах. Но если (например) приложение может просто создать экземпляр «WindowsIdentity», назначьте его текущему потоку, а затем вызовите мою сборку и обманите меня, полагая, что они такие, кем они не являются, это было бы для меня неудачным трудолюбие. В принципе, я пытаюсь достичь разумной передовой практики SSO. Я не сомневался, могу ли я доверять API выше, пока этот пользователь не пометил его по моему другому вопросу (он может быть просто параноиком), а затем я беспокоился о том, чего не знаю, что в этой области много. :-) –

ответ

10

Вы не можете доверять одному из Thread.CurrentPrincipal, нет. Нет ничего, что могло бы остановить выполнение кода, полностью зависящего от подделки.

я был в состоянии подменить его в своей среде, как это:

var admin = new WindowsIdentity(@"Administrator"); 
var princ = new WindowsPrincipal(admin); 
System.Threading.Thread.CurrentPrincipal = princ; 

... перед вызовом кода. На моей машине созданный объект WindowsIdentity имеет IsAuthenticated как true и IsAnonymous false, и поэтому, конечно, ваш код извлекает SID моего администратора домена.

Это не работает во всех средах, но это должно, при условии, что работает код имеет достаточно прав для использования отражения: (. Опять же, сделано перед вызовом кода)

var ident = WindowsIdentity.GetCurrent(); 
Thread.CurrentPrincipal = new WindowsPrincipal(ident); 
var userSid = ident.User; 

var fakeSid = new SecurityIdentifier("S-1-3-0"); 

typeof (WindowsIdentity).GetField("m_user", 
    BindingFlags.Instance | BindingFlags.NonPublic).SetValue(ident, fakeSid); 


В принципе, нет ничего, чтобы остановить две части кода, работающие под полным доверием в рамках одного процесса, от лжи друг к другу.

+0

@Damien_The_Unbeliever: Это отражается в моей не-доменной среде и моей надлежащей среде AD. ** Ого, это страшно. ** После установки этого поля 'm_user' не только возвращает .User' пользователь, который мы установили, но' .Name' возвращает свое имя пользователя домена; поэтому 'WindowsIdentifier', кажется, был правильно взломан, тривиально. Спасибо за ваше время и помощь. –

+0

@Damien_The_Unbeliever: ** Однако **, 'new WindowsIdentity (identityFromThread.Token)' ** раскрывает обман ** (и работает корректно в двух моих неназванных случаях использования, по крайней мере, при первоначальном тестировании). Я думаю, что этот ответ правильный для моего фактического вопроса (вопросы не могут быть движущимися целями!), Потому что я включил код, который вы успешно обманули. Я, конечно, прочь выяснить, можно ли это обмануть ... –

+0

... и поэтому у нас есть [этот вопрос] (http://stackoverflow.com/questions/33573773/is-it- возможно, к-трик-это-WindowsIdentity-кода в-с использованием самым неправильно пользователя). :-) –

Смежные вопросы