Дата и время публикации:
Синопсис
Угроза перезаписи смежных участков при её реализации злоумышленником c возможными нарушениями безопасности
Целостность конфеденциальности доступа (Integrity Confidentiality Availability)
путем перезаписи указателя с перенаправлением на указатель функции с своим собственным вредоносном кода или перезаписи как минимум одного байта, которое могло бы помочь повысить привилегии атакующему в виде обновления соответствующих флагов доступа .
Конфиденциальность доступности (Availability Confidentiality)
При доступе вне границ буфера вероятно будет иметь место результат в виде повреждения соответствующего участка памяти, возможно инструкций, которые приводут к краху программы с неизбежным перезапуском или аварийным остановом . Так же возможны другие варианты атаки, связанные с отсутствием доступности, включая перевод программы в бесконечный цикл.
Конфеденциальность (Confidentiality)
Данный вид подразумевает доступ к конфиденциальной информации, например знания о размещении буферов в памяти, представляющей возможность нарушителю планировать и создавать новые атаки в дальнейшем.
Описание
Листинг 1.Фрагмент файла исходного кода ядра scripts/kconfig/confdata.c
... 739 int conf_write(const char *name) 740 { ... 744 const char *basename; ... 746 char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1]; ... 771 sprintf(newname, "%s%s", dirname, basename); ... 774 sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid()); ...
Известно, что любая перезапись буфера с данными является опасным событием в жизни программы, особенно при перезаписи данных в смежных участках памяти, что в большинстве подобных случаев приводит лишь к неадекватному поведению программы. До тех пор, пока это не касается перезаписи адреса в исполняемом сегменте программ, который уже является проблемой в безопасности. Именно, такая уязвимость относит нас к CWE-119
Как показано в листинге 1, такая ситуация может возникнуть в основном, когда размер записываемых данных не является статичным и фактически определяется в момент чтения или записи, как происходит с форматной строкой PRINTF(3).
Поэтому CWE-119 получила следующее определение: когда программное обеспечение выполняет операции над буфером, предполагается, что оно читает или пишет из участка памяти, находящегося вне предполагаемой границы буфера. Начиная с GCC-8 такая ошибка переполнения форматной строки индицируется критическим предупреждением -Wformat-overflow=, как показано в дамп 2
Дапм 2
scripts/kconfig/confdata.c:771:22: warning: ‘%s’ directive writing likely 7 or more bytes into a region of size between 1 and 4097 [-Wformat-overflow=] ... scripts/kconfig/confdata.c:774:23: warning: ‘.tmpconfig.’ directive writing 11 bytes into a region of size between 1 and 4097 [-Wformat-overflow=]
Так в случае с примером, как показано для фрагмента ядра файла исходного кода scripts/kconfig/confdata.c, в котором может произойти перезапись данных в смежных участках памяти, потому что директива ‘%s’ может записать не менее 7-ми и более байт в диапазоне, имеющий размер между 1 и 4097 байт, как показано в строке 771 листинга 1
Соответственно, для устранения такой возможности, как показано в листинге 3, необходимо увеличить на 8-мь байт выделяемый участок памяти newname в строке 746 листинга 771, граница которого может быть нарушена при записи участка памяти dirname, имеющий размер переменный от 1...4097. Тоже самое может и произойти с участком памяти tmpname, используемый в строке 774 листинга 1, также нужно увеличить на 64 байт, например для архитектуры ЦПУ x86-64.
Листинг 3
... 746 char dirname[PATH_MAX+1], tmpname[PATH_MAX+64], newname[PATH_MAX+8]; ...
Библиография
1 kconfig: Avoid format overflow warning from GCC 8.1
2 CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer