Я думаю, что я спрашиваю, какие возможные дыры в безопасности я должен искать?
Позвольте мне дать вам пятиминутный обзор «традиционной» безопасности доступа к коду .NET. (У нас есть более новая, упрощенная модель безопасности, которая должна использоваться для нового кода, но полезно понимание базовой модели безопасности.)
Идея состоит в том, что сборки предоставляют доказательства - такие вещи, как, где они находятся, кто их написал и так далее. Политика использует свидетельство и создает набор грантов из разрешений , связанных с этой сборкой.
При попытке выполнить действие, для которого требуется определенное разрешение, например, создание диалогового окна, доступ к принтеру или запись в файл, среда выполнения выдает требование для этого разрешения. В требовании проверяется код, находящийся в данный момент «в стеке», чтобы определить весь код, который назвал настоящим кодом, прямо или косвенно. (*)
В требовании говорится, что каждому вызывающему в стеке должно быть предоставлено необходимое разрешение. Это предотвращает атаку luring , в результате чего враждебный код с низким уровнем доверия вызывает доброкачественный код с высоким уровнем доверия. и «заманивает» его к выполнению какой-либо опасной операции от его имени, чтобы причинить вред пользователю. Поскольку полный запрос проверяет прямых и косвенных абонентов , атака приманки, таким образом, побеждена.
assert позволяет коду с высоким уровнем доверия изменять семантику запроса. Утверждающий говорит: «Я добросовестный код с высоким уровнем доверия, и я утверждаю, что враждебный абонент с низким уровнем доверия не может заманить меня в выполнение опасной операции от его имени». Утверждение обычно сопряжено с более слабым спросом; то есть код с высоким уровнем доверия утверждает, что «я могу безопасно вызывать неуправляемый код, даже если вызывающий не может», а затем требует «но вызывающему лучше иметь разрешение на доступ к принтеру, потому что это то, что я собираюсь делать с моим неуправляемым Код разрешения ".
Проблема с требованиями заключается в том, что они дорогие . Вы должны сделать полный обход стека и посмотреть на набор разрешений каждого. Если операция дешевая - скажем, с настройкой пикселя в растровом изображении - вы не хотите каждый раз выполнять полное требование, потому что вы тратите все свое время на избыточные проверки безопасности.
Таким образом, ссылка требует . Требование ссылки выполняется один раз для каждого вызывающего защищенного метода , в первый раз, когда код, который вызывает защищенный метод, используется , и он только проверяет непосредственного вызывающего защищенный метод , а не полный обход стека. После этого выполняются операции кода с требованием к соединению без проверок безопасности для этого вызывающего . (Это действительно должно называться «требованием к JIT», а не «требованием к соединению», потому что используемый механизм заключается в том, что требование проверяется при подключении вызывающего абонента. )
Очевидно, что это намного дешевле - одна проверка на вызывающего абонента, который просматривает только одну сборку, дешевле, чем одна проверка на вызов , которая просматривает каждой сборки в стеке - намного опаснее .
Спрос на ссылку в основном обходной. Требование ссылки говорит: «Вызывающий, пройдя мою проверку спроса на ссылку, вы теперь можете звонить мне по дешевке. Но Я отключаю систему безопасности сейчас , и, следовательно, you теперь мы несем ответственность за то, чтобы ваш абонент не мог успешно атаковать пользователя, воспользовавшись тем, что я предоставляю вам право звонить мне без проверки безопасности в будущем. "
Вы вызываете метод с требованием ссылки. Таким образом, перед вами встает вопрос: готовы ли вы взять на себя эту ответственность? Вы можете вызвать этот метод дешево. Готовы ли вы гарантировать , что ни один злоумышленник с низким уровнем доверия не может использовать тот факт, что вы вызываете этот метод без проверок безопасности, чтобы причинить вред пользователю?
Если вы не хотите или не можете предоставить такую гарантию, выдаст ваше собственное требование на разрешение по ссылке;это потребует от всех ваших абонентов соответствия требованиям.Или передайте вашему абоненту: запросите ссылку на вашего абонента и заставьте них выполнить работу.
(*) Как я хотел бы отметить, стек вызовов на самом деле не говорит вам , кто вам звонил , он говорит вам , куда пойдет управление .Так как это обычно одно и то же, все работает отлично.Возможно оказаться в ситуации, когда "кто тебя звал?"развелась с "куда ты идешь дальше?";в этих средах вы должны быть очень осторожны, используя безопасность доступа к коду в традиционном стиле.Более новая модель безопасности в «песочнице» лучше подходит для таких сценариев.