V5631. OWASP. Use of externally-controlled format string. Potentially tainted data is used as a format string.
Анализатор обнаружил использование полученной из внешнего источника строки в качестве формата без предварительной проверки. В случае, если количество ячеек в строке формата и количество аргументов не совпадёт, это приведёт либо к выбросу исключения, либо к потере информации.
Рассмотрим пример:
static void Foo(string hostName, int port, params string[] args)
{
using (TcpClient tcpConn = new TcpClient(hostName, port))
{
using (StreamReader sr = new StreamReader(tcpConn.GetStream()))
{
var format = sr.ReadLine();
var data = ApplyFormat(format, args);
....
}
}
}
static string ApplyFormat(string format, string[] args)
{
return string.Format(...., format, args);
}
В данном примере значение format получается по сети, после чего передаётся в 'ApplyFormat', где сразу же используется в качестве формата в методе string.Format. Так как перед этим не было выполнено никаких проверок на количество элементов формата {....} в строке, существует вероятность, что оно не совпадёт с количеством аргументов в args. Если количество элементов формата окажется меньше, то некоторые аргументы просто не будут вставлены в результат, а если больше — будет выброшено исключение.
Чтобы избежать потенциальных проблем, перед использованием строки формата следует выполнить её валидацию, например, с помощью регулярного выражения:
static bool TryApplyFormat(string format, string[] args, out string data)
{
if (Regex.Matches(format, ....).Count == args.Length)
{
data = string.Format(format, args);
return true;
}
data = null;
return false;
}
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.). |
Данная диагностика классифицируется как:
|