Tainted string format

Входной формат аргумента из небезопасного источника

Описание

Этот дефект возникает при 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++
По умолчанию: Off
Синтаксис командной строки: TAINTED_STRING_FORMAT
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 134
Введенный в R2015b