Regras Gendarme: Segurança - CAS

As regras do Gendarme para o Code Access Security (CAS) estão localizados na assembly Gendarme.Rules.Security.Cas.dll. Os fontes correntes estão disponíveis no git.

Sumário

Regras

AddMissingTypeInheritanceDemandRule

Essa regra verifica se há tipos que não são selados (sealed) mas tem um LinkDemand. Neste caso, o tipo também deve ter um InheritanceDemand para as mesmas permissões. Uma alternativa é selar o tipo.

Exemplo Errado:

[SecurityPermission (SecurityAction.LinkDemand, ControlThread = true)]
public class Errado{
}

Exemplo Correto usando (InheritanceDemand):

[SecurityPermission (SecurityAction.LinkDemand, ControlThread = true)]
[SecurityPermission (SecurityAction.InheritanceDemand, ControlThread = true)]
public class Correto {
}

Exemplo Correto usando (sealed):

[SecurityPermission (SecurityAction.LinkDemand, ControlThread = true)]
public sealed class Correto {
}

Notas

  • Antes do Gendarme 2.2 essa regra era parte de Gendarme.Rules.Security com o nome de TypeLinkDemandRule.

DoNotExposeFieldsInSecuredTypeRule

Essa regra verifica os tipos que são protegidos por Demand ou LinkDemand mas também expõe campos visíveis. O acesso a estes campos não são cobertos pelas exigências declarativas, abrindo brechas de segurança em potencial.

Exemplo Errado:

[SecurityPermission (SecurityAction.LinkDemand, ControlThread = true)]
public class Errado {
}

Exemplo Correto usando (InheritanceDemand):

[SecurityPermission (SecurityAction.LinkDemand, ControlThread = true)]
[SecurityPermission (SecurityAction.InheritanceDemand, ControlThread = true)]
public class Correto {
}

Exemplo Correto usando (sealed):

[SecurityPermission (SecurityAction.LinkDemand, ControlThread = true)]
public sealed class Correto {
}

Notas

  • Antes do Gendarme 2.2 essa regra era parte da Gendarme.Rules.Security e da nomenclatura TypeExposeFieldsRule.

DoNotExposeMethodsProtectedByLinkDemandRule

Esta regra verifica métodos visíveis que são menos protegidos (ou seja, os requisitos de segurança são mais baixas) do que o método que eles chamam. Se os métodos chamados são protegidos por um LinkDemand em seguida, o chamador pode ser utilizado para verificações de segurança de bypass.

Exemplo Errado:

public class BaseClass {
    [SecurityPermission (SecurityAction.LinkDemand, Unrestricted = true)]
    public virtual void VirtualMethod ()
    {
    }
}
 
public class Class : BaseClass  {
    // Errado, já que um chamador com apenas ControlAppDomain será capaz de chamar o método base
    [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
    public override void VirtualMethod ()
    {
        base.VirtualMethod ();
    }
}

Exemplo Correto usando (InheritanceDemand):

public class BaseClass {
    [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
    public virtual void VirtualMethod ()
    {
    }
}
 
public class Class : BaseClass  {
    // Correto desde essa permissão cubra a permissão da classe base
    [SecurityPermission (SecurityAction.LinkDemand, Unrestricted = true)]
    public override void VirtualMethod ()
    {
        base.VirtualMethod ();
    }
}

Notas

  • Antes do Gendarme 2.2 essa regra era parte do Gendarme.Rules.Security com o nome de MethodCallWithSubsetLinkDemandRule.

DoNotReduceTypeSecurityOnMethodsRule

Esta regra verifica os tipos que têm permissão de segurança declarativa, que não são um subconjunto da permissão de alguns de seus métodos de segurança.

Exemplo Errado

[SecurityPermission (SecurityAction.Assert, ControlThread = true)]
public class NotSubset {
    [EnvironmentPermission (SecurityAction.Assert, Unrestricted = true)]
    public void Method ()
    {
    }
}

Exemplo Correto

[SecurityPermission (SecurityAction.Assert, ControlThread = true)]
public class Subset {
    [SecurityPermission (SecurityAction.Assert, Unrestricted = true)]
    public void Method ()
    {
    }
}

Notas

  • Antes do Gendarme 2.2 essa regra era parte do Gendarme.Rules.Security a da nomenclatura TypeIsNotSubsetOfMethodSecurityRule.

ReviewSealedTypeWithInheritanceDemandRule

Esta regra verifica os tipos fechados que têm InheritanceDemand segurança declarativa aplicada a eles. Desde que esses tipos não possam ser herdadas do InheritanceDemand nunca serão executado pelo tempo de execução. Verifique se a permissão é necessária e, em caso afirmativo, altere o SecurityAction para a correta. Caso contrário, remover a permissão.

Exemplo Errado:

[SecurityPermission (SecurityAction.InheritanceDemand, Unrestricted = true)]
public sealed class Errado {
}

Exemplo Correto usando (sem sealed):

[SecurityPermission (SecurityAction.InheritanceDemand, Unrestricted = true)]
public class Correto {
}

Exemplo Correto usando (LinkDemand):

[SecurityPermission (SecurityAction.LinkDemand, Unrestricted = true)]
public sealed class Correto {
}

Notas

  • Antes do Gendarme 2.2 essa regra era parte do Gendarme.Rules.Security com o nome de SealedTypeWithInheritanceDemandRule.

ReviewSuppressUnmanagedCodeSecurityUsageRule

Essa regra dispara, se um tipo ou método é marcado com o atributo [SuppressUnmanagedCodeSecurity]. Esse atributo reduz as verificações de segurança feitas durante a execução de código não gerenciado, e seu uso deve ser revisto para confirmar que não há falhas de segurança exploráveis presentes na implementação.

Exemplo:

[SuppressUnmanagedCodeSecurity]
public class Seguro {
    [DllImport ("User32.dll")]
    static extern Boolean MessageBeep (UInt32 beepType);
}

Notas

  • Essa é uma regra de auditoria. Como tal, ela não verifica padrões válidos ou inválidos, mas adverte sobre um problema específico que precisa ser revisado por alguém.

SecureGetObjectDataOverridesRule

Esta regra é acionado quando se implementa um tipo System.Runtime.Serialization.ISerializable mas o método GetObjectData não está protegido com uma Demand ou um LinkDemand para SerializationFormatter.

Exemplo Errado:

public class Errodo : ISerializable {
    public override void GetObjectData (SerializationInfo info, StreamingContext context)
    {
    }
}

Exemplo Correto:

public class Correto : ISerializable {
    [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
    public override void GetObjectData (SerializationInfo info, StreamingContext context)
    {
    }
}

Notas

  • Antes do Gendarme 2.2 essa regra era parte do Gendarme.Rules.Security.

Comentários

Por favor, reporte qualquer erro na documentação, erros de digitação ou sugestões para o Grupo de Discussão do Gendarme no Google. Obrigado!