exponenta event banner

Формат запятнанной строки

Аргумент входного формата получен из небезопасного источника

Описание

Этот дефект возникает, когда printfФункции -style используют спецификатор формата, созданный из небезопасных источников. Чтобы считать все входные данные вне текущего периметра анализа небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

При использовании элементов внешнего управления для форматирования строки могут возникнуть проблемы переполнения буфера или представления данных. Злоумышленник может использовать эти элементы форматирования строк для просмотра содержимого стека с помощью %x или запись в стек с помощью %n.

Зафиксировать

Передача статической строки для форматирования строковых функций. Это исправление гарантирует, что внешний исполнитель не сможет управлять строкой.

Другое возможное исправление - разрешить только ожидаемое количество аргументов. По возможности используйте функции, которые не поддерживают уязвимых %n оператор в строках формата.

Примеры

развернуть все

#include <stdio.h>
#include <unistd.h>
#define MAX 40
void taintedstringformat(void) {
	char userstr[MAX];
	read(0,userstr,MAX);
	printf(userstr);   
}

В этом примере выполняется печать входного аргумента userstr. Строка неизвестна. Если он содержит такие элементы, как %, printf может интерпретировать userstr в виде строкового формата, а не строки, что приводит к аварийному завершению программы.

Исправление - Печать в виде строки

Одной из возможных корректировок является печать userstr явно в виде строки, чтобы не было неоднозначности.

#include "stdio.h"
#include <unistd.h>
#define MAX 40

void taintedstringformat(void) {
	char userstr[MAX];
	read(0,userstr,MAX);
	printf("%.20s", userstr); 
}

Информация о результатах

Группа: Запятнанные данные
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_STRING_FORMAT
Воздействие: Низкий
CWE ID: 134
Представлен в R2015b