flawopen.com/command-injection/Csharp
Learn how to fix Command Injection (CWE-78) in C# / .NET. Side-by-side vulnerable vs secure code examples for ProcessStartInfo.ArgumentList with UseShellExecute false.
オフィスのアシスタントに「report.pdf」という書類の印刷を頼む場面を想像してください。攻撃者が「report.pdf; whoami」というファイル名を渡すと、アシスタントはそのメモ全体をそのまま端末の窓口に提出してしまい、書類の印刷に加えて管理者バッジの読み取りまで実行してしまいます。
Web Application SecurityCWE-918.CWE-918CWE-918):Standard Common Weakness Enumeration classification for command-injection-csharp.Defense-in-DepthアプリケーションがHTTPリクエストから診断用ホスト名やファイル名などの入力を直接受け取ります。
バックエンドが引数リストを使わず、生文字列の結合によってシェルコマンドを構築します。
攻撃者が ';' や '&&'、'|'、バッククォートなどのメタ文字(例: '127.0.0.1; id')を挿入して構文を脱出します。
OSシェルがWebサーバー権限で追加されたコマンドを実行し、任意のリモートコード実行に至ります。
// Concatenating into Arguments string
var psi = new ProcessStartInfo
{
FileName = "cmd.exe",
// Attacker input: "test.txt & net user /add evil Password123!"
Arguments = $"/c type {userInput}",
RedirectStandardOutput = true
};
Process.Start(psi);
// Using ArgumentList (.NET Core / .NET 5+) without shell
var psi = new ProcessStartInfo
{
FileName = "notepad.exe"
};
// Arguments added individually to ArgumentList are never parsed as shell commands
psi.ArgumentList.Add(userInput);
Process.Start(psi);
ProcessStartInfo.ArgumentList.Add() instead of Arguments を使用してください。