Читаем Защита от хакеров корпоративных сетей полностью

Использование средств безопасности языков программирования для обработки непредвиденных данных

Противостояние непредусмотренным данным или данным неверного формата не является новым видом борьбы с угрозами безопасности. Во многие современные языки программирования и приложения включены средства безопасности, исключающие или снижающие печальные последствия поврежденных данных. Большинство из них используют концепцию «песочницы» (sandbox concept), которая предусматривает карантин для поврежденных данных до тех пор, пока они не будут проанализированы и исправлены. Рассмотрим отдельные средства безопасности некоторых популярных языков программирования.

Язык Perl

Интерпретатор Perl запускается в режиме проверки «дыр» в защите при помощи задания в командной строке команды – T. В этом режиме Perl предупреждает программиста о непосредственной передаче данных пользователя одной из следующих команд: bind, chdir, chmod, chown, chroot, connect, eval, exec, fcntl, glob, ioctl, kill, link, mkdir, require, rmdir, setpgrp, setpriority, socket, socketpair, symlink, syscall, system, truncate, umask, unlink, а также о команде – s и обратных галочек. (Обратные галочки – жаргонное обобщенное название символов «левые кавычки», «левая одиночная кавычка», «открывающиеся кавычки», «обратный апостроф»).

При попытке передать поврежденные данные системной функции Perl откажется выполнить сценарий и выдаст сообщение: Insecure dependency in system while running with – T switch at (script) line xx (Небезопасная зависимость в системе при работе с командой —T в сценарии yyyy в строчке xx).

Для проверки введенных пользователем данных следует использовать оператор сравнения (m///) регулярного выражения regex языка Perl для проверки соответствия данных заданным условиям. В следующем примере показано, как выполнить проверку того, что символы входных данных представлены в нижнем регистре:

#!/usr/bin/perl -T

# must setup a secure environment (system/OS dependant)

$ENV{PATH}=“/bin”;

delete $ENV{ENV};

delete $ENV{BASH_ENV};

# this is tainted

$echo=$ARGV[0];

# check to see if it’s only lower-case letters

if ($echo =~/^([a-z]+)$/) {

# we resave the command...

$echo=$1;

# ...and use it in a system function

system(“/bin/echo $echo”);

} else {

print “Sorry, you gave unexpected data\n”;

}

Самая важная часть этого фрагмента кода – проверка входных данных:

If ($echo =~ /^([a-z]+)$/) { $echo = $1;

При разборе входных данных проверяется, чтобы вся строка входных данных (символы ^ и $ подчеркивают это) состояли только из букв нижнего регистра ([a-z]) и строка состояла хотя бы из одной буквы (символ + после [a-z]). При восстановлении данных следует быть осторожными связи с тем, что в действительности на данные накладываются дополнительные ограничения. Рассмотрим следующий фрагмент кода восстановления данных:

if ($data =~ /^(.*)$/) { $data = $1;

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже