Проверка на заражение - Taint checking

Проверка на заражение - это функция некоторых языков программирования , таких как Perl и Ruby , предназначенная для повышения безопасности путем предотвращения выполнения злоумышленниками команд на главном компьютере. Проверки на заражение позволяют выявить определенные риски безопасности, в первую очередь связанные с веб-сайтами, которые подвергаются атакам с использованием таких методов, как внедрение SQL или атаки с переполнением буфера .

Обзор

Концепция проверки на заражение заключается в том, что любая переменная, которая может быть изменена внешним пользователем (например, переменная, установленная полем в веб-форме ), представляет собой потенциальную угрозу безопасности. Если эта переменная используется в выражении, которое устанавливает вторую переменную, эта вторая переменная теперь также подозрительна. Затем инструмент проверки на наличие заражения может переходить от переменной к переменной, формируя список переменных, на которые потенциально может влиять внешний ввод. Если какая-либо из этих переменных используется для выполнения опасных команд (таких как прямые команды для базы данных SQL или операционной системы хост-компьютера ), средство проверки заражения предупреждает, что программа использует потенциально опасную испорченную переменную. Затем компьютерный программист может переработать программу, чтобы возвести безопасную стену вокруг опасного входа.

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

пример

Следующий опасный код Perl открывает большую уязвимость SQL-инъекций , не проверяя значение $name переменной:

#!/usr/bin/perl
my $name = $cgi->param("name");  # Get the name from the browser
...
$dbh->{TaintIn} = 1;
$dbh->execute("SELECT * FROM users WHERE name = '$name';"); # Execute an SQL query

Если проверка на зараженность включена, Perl откажется выполнить команду и выйдет с сообщением об ошибке, поскольку в запросе SQL используется испорченная переменная. Без проверки на заражение пользователь мог войти foo'; DROP TABLE users -- , выполнив команду, удаляющую всю таблицу базы данных. Гораздо безопаснее было бы закодировать испорченное значение $ name в строковый литерал SQL и использовать результат в запросе SQL, гарантируя, что никакая встроенная опасная команда $name не будет оцениваться. Другой способ добиться этого - использовать подготовленный оператор для очистки всех вводимых переменных для запроса.

Следует отметить, что Perl DBI требует, чтобы один установил TaintIn атрибут дескриптора базы данных, а также включил режим taint для проверки своих строк SQL.

История

Perl поддерживал заражение в сценариях setuid по крайней мере с версии 3.0 (выпущенной в 1989 году), хотя только в версии 5.0 (выпущенной в 1994 году) -T был введен переключатель, интегрирующий заражение в единую среду выполнения.

В 1996 году Netscape реализовал заражение данных в серверном JavaScript в Netscape Communications Server , а также на стороне клиента для Netscape Navigator 3. Однако, поскольку поддержка на стороне клиента считалась экспериментальной, она была отключена (для активации требовалось вмешательство пользователя), и требовалось от авторов страниц изменять скрипты, чтобы извлечь из этого пользу. Другие производители браузеров никогда не реализовывали эту функциональность; То же самое и с основным конкурентом Communications Server, новым (тогда) новым Internet Information Server от Microsoft .

Рекомендации

внешние ссылки