Pointers should not be publicly visible
Detects public or protected fields of type System.IntPtr or System.UIntPtr. Pointers access unmanaged memory; exposing them publicly lets malicious code read and write the application's unmanaged data — worse if the field is not read-only, since it can be changed to force the application onto arbitrary data.
Flagged Code
Flagged Code
public class NativeBuffer {
public IntPtr Handle; // flagged: public, writable pointer
protected UIntPtr Length; // flagged: protected pointer
}
Fixed Codepublic class NativeBuffer {
private readonly SafeHandle _handle; // pointer wrapped in a SafeHandle
private IntPtr _buffer; // private pointer
public int Length { get; }
}How to fix
Make pointers private or internal.
Estimated Debt: 15 minutes plus 10 minutes per method using the field outside its assembly. Severity: Medium, High if non read-only.
Estimated Debt: 15 minutes plus 10 minutes per method using the field outside its assembly. Severity: Medium, High if non read-only.
CQLinq source
This rule is written in CQLinq, C# LINQ over the NDepend code model. It ships with every new NDepend project: you can read it, adapt it, or use it as a starting point for your own custom rules.
// <Name>Pointers should not be publicly visible</Name>
// <Id>ND3105:PointersShouldNotBePubliclyVisible</Id>
warnif count > 0
from f in Application.Fields
where
f.FieldType != null &&
f.FieldType.FullNameEqualsAny("System.IntPtr","System.UIntPtr") &&
(f.IsPubliclyVisible || f.IsProtected)
let methodsUserOutsideMyAssembly = f.MethodsUsingMe.Where(m => m.ParentAssembly != m.ParentAssembly)
select new {
f,
f.FieldType,
methodsUserOutsideMyAssembly,
Debt = (15 + 10*methodsUserOutsideMyAssembly.Count()).ToMinutes().ToDebt(),
Severity = f.IsInitOnly ? Severity.Medium : Severity.High
}
//<Expl>
// The *{0}* shouldn't be public because it exposes a pointer of type *{1}*.
// Publicly exposing a pointer can facilitate malicious access
// to unmanaged data.
//</Expl>
//<Desc>
// Detects public or protected fields of type *System.IntPtr* or
// *System.UIntPtr*. Pointers access unmanaged memory; exposing them publicly
// lets malicious code read and write the application's unmanaged data —
// worse if the field is not read-only, since it can be changed to force the
// application onto arbitrary data.
//
// **Flagged Code**
// ```csharp
// public class NativeBuffer {
// public IntPtr Handle; // flagged: public, writable pointer
// protected UIntPtr Length; // flagged: protected pointer
// }
// ```
//
// **Fixed Code**
// ```csharp
// public class NativeBuffer {
// private readonly SafeHandle _handle; // pointer wrapped in a SafeHandle
// private IntPtr _buffer; // private pointer
// public int Length { get; }
// }
// ```
//</Desc>
//<HowToFix>
// Make pointers private or internal.
//
// Estimated Debt: 15 minutes plus 10 minutes per method using the field
// outside its assembly. Severity: *Medium*, *High* if non read-only.
//</HowToFix>
Open in the interactive Rules Explorer · All default rules
Security: all 39 items
- Software Composition Analysis (SCA) ND3120
- Transitive Software Composition Analysis (SCA) ND3121
- Don't hard-code secrets in constants ND3114
- Review credentials built from hard-coded values ND3115
- Don't use insecure deserializers ND3110
- Don't use weak hash algorithms (MD5, SHA1) ND3109
- Don't use DES/3DES/RC2 weak cipher algorithms ND3102
- Don't use weak password-based key derivation ND3123
- Don't use the ECB encryption mode ND3132
- Don't disable certificate validation ND3103
- Don't hard-code TLS/SSL protocol versions ND3122
- Review commands vulnerable to SQL injection ND3107
- Review data adapters vulnerable to SQL injection ND3108
- Review raw SQL built from composed strings ND3128
- Review LDAP filters composed from strings ND3137
- Don't enable external XML entity resolution (XXE) ND3111
- Review processes started with a composed arguments string ND3124
- Review web endpoints building file paths from their parameters ND3129
- Review custom archive extraction (Zip Slip) ND3135
- Review assemblies and types loaded from runtime-provided names ND3125
- Review web endpoints without [Authorize] nor [AllowAnonymous] ND3118
- Review state-changing endpoints opened to anonymous callers ND3130
- Review state-changing MVC actions without anti-forgery validation ND3119
- Review HTML-encoding bypasses ND3133
- Review explicitly disabled request validation ND3134
- Review redirects to a URL that is not validated as local ND3126
- Review request-influenced outbound HTTP calls (SSRF) ND3136
- Review insecure ASP.NET Core CORS policies and unguarded developer exception page ND3116
- Review cookies created without HttpOnly and Secure flags ND3117
- Review regular expressions without a match timeout (ReDoS) ND3112
- Review secrets compared with non-constant-time equality ND3113
- Review secrets passed to logging methods ND3127
- Review security operations that log nothing ND3131
- Don't use System.Random for security purposes ND3101
- Don't use CoSetProxyBlanket and CoInitializeSecurity ND3100
- Review publicly visible event handlers ND3104
- Pointers should not be publicly visible ND3105
- Seal methods that satisfy non-public interfaces ND3106
- Restrict sensitive APIs to reviewed components ND3138