CA2122: Nezveřejňujte nepřímo metody s požadavky propojení
TypeName |
DoNotIndirectlyExposeMethodsWithLinkDemands |
CheckId |
CA2122 |
Kategorie |
Microsoft.Security |
Narušující změna |
Nenarušující |
Příčina
Veřejný nebo chráněný člen má požadavek Požadavky na odkaz a je volán členem, který neprovádí žádné bezpečnostní kontroly.
Popis pravidla
Požadavek na odkaz kontroluje pouze oprávnění bezprostředního volajícího.Pokud člen X nevznáší žádné požadavky zabezpečení jeho volajících a volá kód chráněný požadavkem na odkaz, volající bez potřebných oprávnění může použít člen X pro přístup k chráněným členům.
Jak vyřešit porušení
Přidejte do členu požadavek zabezpečení Data a modelování v rozhraní .NET Framework nebo požadavek na odkaz, aby již neposkytoval nezabezpečený přístup ke členům chráněným požadavkem na odkaz.
Kdy potlačit upozornění
Chcete-li bezpečně potlačit upozornění tohoto pravidla, je nezbytné se ujistit, že kód neuděluje svým volajícím přístup k operacím a zdrojům, které mohou být použity škodlivým způsobem.
Příklad
Následující příklad ukazuje knihovnu porušující toto pravidlo a aplikaci, která demonstruje slabou stránku knihovny.Vzorová knihovna poskytuje dvě metody, které dohromady porušují pravidlo.Metoda EnvironmentSetting je zabezpečena požadavkem na odkaz pro neomezený přístup k proměnným prostředí.Metoda DomainInformation nevznáší na své volající před zavoláním metody EnvironmentSetting žádné bezpečnostní požadavky.
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
namespace SecurityRulesLibrary
{
public class DoNotIndirectlyExposeMethodsWithLinkDemands
{
// Violates rule: DoNotIndirectlyExposeMethodsWithLinkDemands.
public static string DomainInformation()
{
return EnvironmentSetting("USERDNSDOMAIN");
}
// Library method with link demand.
// This method holds its immediate callers responsible for securing the information.
// Because a caller must have unrestricted permission, the method asserts read permission
// in case some caller in the stack does not have this permission.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
public static string EnvironmentSetting(string environmentVariable)
{
EnvironmentPermission envPermission = new EnvironmentPermission( EnvironmentPermissionAccess.Read,environmentVariable);
envPermission.Assert();
return Environment.GetEnvironmentVariable(environmentVariable);
}
}
}
Následující aplikace volá nezabezpečený člen knihovny.
using System;
using SecurityRulesLibrary;
using System.Security;
using System.Security.Permissions;
// You have no permission to access the sensitive information,
// but you will get data from the unprotected method.
[assembly:EnvironmentPermissionAttribute(
SecurityAction.RequestRefuse,Unrestricted=true)]
namespace TestUnsecuredMembers
{
class TestUnsecured
{
[STAThread]
static void Main(string[] args)
{
string value = null;
try
{
value = DoNotIndirectlyExposeMethodsWithLinkDemands.DomainInformation();
}
catch (SecurityException e)
{
Console.WriteLine(
"Call to unsecured member was stopped by code access security! {0}",
e.Message);
throw;
}
if (value != null)
{
Console.WriteLine("Value from unsecured member: {0}", value);
}
}
}
}
Tento příklad vytvoří následující výstup.