Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
| Property | Value |
|---|---|
| Rule ID | CA2101 |
| Title | Specify marshalling for P/Invoke string arguments |
| Category | Globalization |
| Fix is breaking or non-breaking | Non-breaking |
| Enabled by default in .NET 9 | As suggestion |
Cause
A platform invoke member allows for partially trusted callers, has a string parameter, and does not explicitly marshal the string.
Rule description
When you convert from Unicode to ANSI, it is possible that not all Unicode characters can be represented in a specific ANSI code page. Best-fit mapping tries to solve this problem by substituting a character for the character that cannot be represented. The use of this feature can cause a potential security vulnerability because you cannot control the character that is chosen. For example, malicious code could intentionally create a Unicode string that contains characters that are not found in a particular code page, which are converted to file system special characters such as '..' or '/'. Note also that security checks for special characters frequently occur before the string is converted to ANSI.
Best-fit mapping is the default for the unmanaged conversion, WChar to MByte. Unless you explicitly disable best-fit mapping, your code might contain an exploitable security vulnerability because of this issue.
Caution
Code Access Security (CAS) should not be considered a security boundary.
How to fix violations
To fix a violation of this rule, explicitly marshal string data types.
When to suppress warnings
Do not suppress a warning from this rule.
Example
The following example shows a method that violates this rule, and then shows how to fix the violation.
class NativeMethods { // Violates rule: SpecifyMarshalingForPInvokeStringArguments. [DllImport("advapi32.dll", CharSet = CharSet.Auto)] internal static extern int RegCreateKey(IntPtr key, String subKey, out IntPtr result); // Satisfies rule: SpecifyMarshalingForPInvokeStringArguments. [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] internal static extern int RegCreateKey2(IntPtr key, String subKey, out IntPtr result); } Friend Class NativeMethods ' Violates rule: SpecifyMarshalingForPInvokeStringArguments. <DllImport("advapi32.dll", CharSet:=CharSet.Auto)> Friend Shared Function RegCreateKey(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer End Function ' Satisfies rule: SpecifyMarshalingForPInvokeStringArguments. <DllImport("advapi32.dll", CharSet:=CharSet.Unicode)> Friend Shared Function RegCreateKey2(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer End Function End Class