| name | sc-lang-csharp |
| description | C#/.NET-specific security deep scan |
| license | MIT |
| metadata | {"author":"ersinkoc","category":"security","version":"1.0.0"} |
SC: C#/.NET Security Deep Scan
Purpose
Detects C#/.NET-specific security anti-patterns including BinaryFormatter deserialization, ASP.NET Core misconfigurations, Entity Framework raw SQL injection, Blazor/SignalR vulnerabilities, and unsafe code risks. Covers the .NET ecosystem's unique attack surface.
Activation
Activates when C# or .NET is detected in security-report/architecture.md.
Checklist Reference
References references/csharp-security-checklist.md.
C#/.NET-Specific Vulnerability Patterns
Category 1: BinaryFormatter Deserialization RCE
BinaryFormatter bf = new BinaryFormatter();
var obj = bf.Deserialize(stream);
var obj = JsonSerializer.Deserialize<MyType>(jsonString);
Category 2: ASP.NET Model Binding Mass Assignment
[HttpPost]
public IActionResult Create(User user) {
_context.Users.Add(user);
}
[HttpPost]
public IActionResult Create([Bind("Name,Email")] User user) { }
public IActionResult Create(CreateUserDto dto) {
var user = new User { Name = dto.Name, Email = dto.Email };
}
Category 3: ViewState Tampering (Legacy WebForms)
Category 4: Entity Framework Raw SQL Injection
var users = context.Users
.FromSqlRaw($"SELECT * FROM Users WHERE Name = '{name}'")
.ToList();
var users = context.Users
.FromSqlRaw("SELECT * FROM Users WHERE Name = {0}", name)
.ToList();
var users = context.Users
.FromSqlInterpolated($"SELECT * FROM Users WHERE Name = {name}")
.ToList();
Category 5: Process.Start Command Injection
Process.Start("cmd.exe", $"/c dir {userInput}");
var psi = new ProcessStartInfo("dir") {
ArgumentList = { userInput },
UseShellExecute = false
};
Category 6: Path.Combine Traversal
Path.Combine(@"C:\uploads", @"C:\windows\system32\cmd.exe");
var basePath = Path.GetFullPath(@"C:\uploads");
var fullPath = Path.GetFullPath(Path.Combine(basePath, userInput));
if (!fullPath.StartsWith(basePath + Path.DirectorySeparatorChar))
throw new UnauthorizedAccessException();
Category 7: Blazor JS Interop Injection
await JSRuntime.InvokeVoidAsync("eval", userInput);
await JSRuntime.InvokeVoidAsync("dangerousFunction", $"alert('{userInput}')");
await JSRuntime.InvokeVoidAsync("safeFunction", userInput);
Category 8: WASM Data Exposure (Blazor WebAssembly)
{
"ApiSecret": "sk_live_abc123"
}
Category 9: Regex DoS (System.Text.RegularExpressions)
var regex = new Regex(@"^(a+)+$");
regex.IsMatch("aaaaaaaaaaaaaaaaaaaaaaaaa!");
var regex = new Regex(@"^(a+)+$", RegexOptions.None, TimeSpan.FromSeconds(1));
Category 10: SignalR Hub Authorization
public class AdminHub : Hub {
public async Task DeleteUser(string userId) {
await _userService.Delete(userId);
}
}
[Authorize(Roles = "Admin")]
public class AdminHub : Hub { }
Category 11: HttpClient SSRF
var response = await _httpClient.GetAsync(userUrl);
var handler = new HttpClientHandler {
ServerCertificateCustomValidationCallback = (_, _, _, _) => true
};
var uri = new Uri(userUrl);
if (!_allowedHosts.Contains(uri.Host)) throw new InvalidOperationException();
Category 12: XmlSerializer XXE
var doc = new XmlDocument();
doc.XmlResolver = new XmlUrlResolver();
doc.LoadXml(userInput);
var doc = new XmlDocument();
doc.XmlResolver = null;
doc.LoadXml(userInput);
var settings = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Prohibit,
XmlResolver = null
};
Category 13: .NET MAUI Local Storage
Preferences.Set("auth_token", token);
await SecureStorage.SetAsync("auth_token", token);
Category 14: NuGet Supply Chain
- Check for package substitution attacks (internal→public registry)
- Review
nuget.config for untrusted package sources
- Verify package signatures when available
- Check for build script execution in package install
Category 15: Unsafe Code / Span
unsafe {
int* ptr = (int*)Marshal.AllocHGlobal(sizeof(int) * count);
for (int i = 0; i <= count; i++)
ptr[i] = 0;
}
Span<int> span = stackalloc int[count];
span.Fill(0);
Category 16: Razor Page Injection
<!-- VULNERABLE: Raw HTML output -->
@Html.Raw(Model.UserInput) <!-- XSS! -->
<!-- SAFE: Razor auto-escapes @ expressions -->
@Model.UserInput <!-- Auto-encoded -->
Category 17: IConfiguration Secrets Exposure
{
"ConnectionStrings": {
"Default": "Server=db;Password=secret123;"
}
}
Category 18: Middleware Ordering
app.MapControllers();
app.UseAuthentication();
app.UseAuthorization();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
Category 19: Kestrel Configuration
builder.WebHost.ConfigureKestrel(options => {
options.Limits.MaxRequestBodySize = null;
});
options.Limits.MaxRequestBodySize = 10 * 1024 * 1024;
options.Limits.MaxRequestHeadersTotalSize = 32768;
options.Limits.RequestHeadersTimeout = TimeSpan.FromSeconds(30);
Category 20: Newtonsoft.Json TypeNameHandling
var settings = new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.All
};
var obj = JsonConvert.DeserializeObject(json, settings);
var settings = new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.None
};
Output Format
Finding: CS-{NNN}
- Title: C#/.NET-specific vulnerability
- Severity: Critical | High | Medium | Low
- Confidence: 0-100
- File: file/path:line
- Vulnerability Type: CWE-XXX
- Description: What was found
- Remediation: .NET-idiomatic fix
- References: CWE link, Microsoft documentation