Tainted string format

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

Описание

Этот дефект происходит когда printf- разработайте использование функций спецификатор формата, созданный из небезопасных источников. Чтобы рассмотреть весь вход снаружи текущего аналитического периметра как небезопасный, используйте -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++
Значение по умолчанию: Off
Синтаксис командной строки: TAINTED_STRING_FORMAT
Удар: низко
ID CWE: 134
Введенный в R2015b