Научная статья на тему 'Анализ уязвимостей по степени их влияния на защищённость и качество структурно-сложных информационных систем'

Анализ уязвимостей по степени их влияния на защищённость и качество структурно-сложных информационных систем Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
841
208
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
УЯЗВИМОСТЬ / ОБЗОР / ИНФОРМАЦИОННАЯ СИСТЕМА / ЗАЩИЩЕННОСТЬ / КАЧЕСТВО / ПОЛЬЗОВАТЕЛЬ / КОД / ПРОГРАММА / ФУНКЦИЯ / ОПАСНЫЙ / VULNERABILITY / REVIEW / INFORMATION SYSTEM / SECURITY / QUALITY / CODE / PROGRAM / FUNCTION / DANGEROUS

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Калиберда Е. А., Рыбкин А. А.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Analysis of the vulnerabilities in order of their influence on safety and quality of structurally complicated informational systems

In this article was made a review of potential vulnerabilities influencing on the quality of information systems. The most dangerous threats are selected, and provides examples with comments demonstrating these types of vulnerabilities. Was made an assessment of risk based on several criteria

Текст научной работы на тему «Анализ уязвимостей по степени их влияния на защищённость и качество структурно-сложных информационных систем»

ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ

Вестн. Ом. ун-та. 2014. № 2. С. 130-135.

УДК 004.056.5

Е.А. Калиберда, А.А. Рыбкин

АНАЛИЗ УЯЗВИМОСТЕЙ ПО СТЕПЕНИ ИХ ВЛИЯНИЯ НА ЗАЩИЩЁННОСТЬ И КАЧЕСТВО СТРУКТУРНО-СЛОЖНЫХ ИНФОРМАЦИОННЫХ СИСТЕМ

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

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

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

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

Защищённость программного продукта - одна из наиболее трудно формализуемых характеристик качества, назначение и функции которой тесно связаны с особенностями функциональной пригодности информационной системы [1].

По оценкам известных специалистов по информационной безопасности, общепринятый перечень из 25-ти самых опасных уязвимостей выглядит следующим образом [2-5]:

1. Неправильная нейтрализация специальных элементов, используемых в SQL-команде (SQL-инъекция) - один из распространенных способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Для примера возьмем SQL-скрипт, отвечающий за отображение новостей, параметр id является идентификатором новости, которую необходимо отобразить [6]:

$res = mysql_query("SELECT id_news, header, body, author FROM news WHERE id_news = " . $_REQUEST['id']);

Если в качестве id передать последовательность «-1 UNIONSELECT

1,username, password, 1 FROMadmin», это приведет к выполнению SQL-запроса:

SELECT id_news, header, body, author FROM news WHERE id_news = -1 UNION SELECT 1,username,password,1 FROM admin .

© Е.А. Калиберда, А.А. Рыбкин, 2014

Так как «-1» является заведомо ложным идентификатором, то из таблицы news не будет отобрано ни одной записи, однако в результат запроса попадут записи, несанкционированно отобранные из таблицы admin в результате SQL-инъекции.

2. Неправильная нейтрализация специальных элементов, используемых в командах операционной системы (инъекция команд ОС), - уязвимость, позволяющая выполнять команды операционной системы посредством манипуляций с входными данными приложения.

Пример исходного кода веб-сервиса (язык Perl), который предоставляет функцию nslookup для указанного пользователем доменного имени [7]:

use CGI qw(:standard);

$name = param('name');

$nslookup = "/path/to/nslookup"; print header;

if (open($fh, "$nslookup $name\")) { while (<$fh>) { printescapeHTML($_); print "<br>\n";

}

close($fh);

}

Если пользователь укажет доменное имя в формате

google.com%20%3B%20/bin/ls%20-l, тогда на сервере выполнится команда «/bin/ls -l», и пользователь получит список работающих на сервере программ.

Последовательность «%20» расшифровывается как «пробел», последовательность «%3В» расшифровывается как «;».

3. Копирование в буфер без проверки размерности ввода (классическое переполнение буфера) - явление, возникающее, когда программа записывает данные за пределами выделенного в памяти буфера.

Пример исходного кода (язык C), который просит ввести пользователя фамилию и пытается сохранить введенное значение в массив last_name [8]: charlast_name[20]; printf ("Enter your last name: "); scanf ("%s", last_name);

Проблема в коде, указанном выше, состоит в том, что никак не ограничено введенное пользователем значение, если указать «очень_очень_большую_фамилию», то произойдет отказ из-за переполнения буфера, поскольку введенное значение превышает 20 символов, которые может сохранить в себе массив last_name.

4. Межсайтовый скриптинг (XSS) - уязвимость, направленная на веб-сайты, отображающие вводимые пользователем данные. Вместо попытки получения контроля

над базой данных, путем ввода вредоносного кода злоумышленник пытается атаковать код самого веб-сайта, внедряя в него вредоносные сегменты.

Следующий пример - сегмент исходного кода (язык ASP.NET) считывает номер сотрудника из HTTP-запроса и выводит его пользователю [9]:

protectedSystem. Web.UI.WebControls. TextBox Login;

protectedSystem. Web.UI.WebControls .LabelEmployeelD;

EmployeeID.Text = Login.Text;

... (HTML follows) ...

<p><asp:label id="EmployeeID" runat="server" /></p>

Этот исходный код работает корректно только со стандартными буквенно-численными значениями, если вместо этого ввести исходный код или метасимволы, то введённое значение будет обработано браузером и выведено в качестве HTTP-ответа сервера.

5. Отсутствие аутентификации для критических функций - программа не производит аутентификацию для функций, которым необходима достоверная идентификация пользователя или которые потребляют значительное количество ресурсов.

Пример, демонстрирующий отсутствие механизма аутентификации, - пользователь, создающий объект банковского счета, имеет право создать новые банковские счета [10]: publicBankA ccoun tcrea teBankAccoun t (String accountNumber, String accountType, String accountName, String accountSSN, double balance) {

BankAccount account = new BankAccount();

account.setAccountNumber(accountNum

ber);

account.setAccountType(accountType);

account.setAccountOwnerName(account

Name);

account. setAccountOwnerSSN(accountSS

N);

account. setBalance(balance); returnaccount;

}

6. Отсутствие авторизации - программное обеспечение не выполняет процесс проверки прав пользователя при попытке получить доступ к ресурсу или выполнить действие.

Эта функция делает произвольные SQL-запросы для базы данных и возвращает результат [11]:

functionrunEmployeeQuery($dbName,

$name){

mysql_select_ db($dbName, $globalDbHa ndle) or die("Could not open Database ". $dbName);

//Use a prepared statement to avoid CWE-89

$preparedStatement = $globalDbHandle->prepare('SELECT * FROM employees WHERE name = :name');

$preparedSta temen t->execute(array(':name' => $name));

return $preparedStatement->fetchAll();

}

/... /

$employeeRecord = runEmployeeQuery('EmployeeDB',$_GET['Em ployeeName']);

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

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

В следующем примере демонстрируется исходный код с жестко заданным паролем администратора [12]:

intVerifyAdmin(char *password) { if (strcmp(password, "Mew!")) {

printf("Incorrect Password!\n"); return(0)

}

printf("Entering Diagnostic Mode...\n"); return(1);

}

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

Пример - код, который сохраняет введенные пользователем учетные данные в файле cookie для удобства авторизации в будущем [13]:

functionpersistLogin($username,

$password){

$data = array("username" => $username, "password"=> $password); setcookie ("userdata", $data);

}

Код сохраняет имя и пароль клиента в открытом виде без шифрования на компью-

тере пользователя, это увеличивает риск кражи регистрационной информации.

9. Неконтролируемая загрузка файлов опасного типа - возможность злоумышленнику загружать и передавать файлы опасного типа, которые могут быть автоматически обработаны программой.

10. Опора механизмов защиты на ненадежные входные данные - приложение использует механизм защиты, который опирается на значения из входных данных, но эти данные могут быть изменены таким образом, чтобы обойти механизм защиты.

Следующий фрагмент кода считывает значение из файла cookie браузера для определения роли пользователя [14]:

Cookie[] cookies = request.getCookies(); for (inti =0; i<cookies.length; i++) { Cookie c = cookies[i]; if (c.getName().equals("role")) { userRole = c.getValue();

}

}

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

В данном примере исходного кода привилегии программы временно повышаются, чтобы обеспечить пользоватею возможность создания новой папки [15]:

defmakeNewUserDir(username): ifinvalidUsername(username):

#avoid CWE-22 and CWE-78 print('Usernames cannot contain invalid characters') return False try:

raisePrivileges() os.mkdir(/home/' + username) lowerPrivileges() exceptOSError:

print('Unable to create new user directory for user:' + username) returnFalse returnTrue

В то время, когда программа повышает уровень привилегий для создания папки и сразу понижает его, если вызов функции os.mkdir() вызовет исключение, вызов lowerPrivileges() не произойдет. В результате программа останется в состоянии повышенных привилегий в течение неограниченного количества времени.

12. Подделка межсайтовых запросов (CSRF, также известно, как XSRF) - вебприложение не производит проверку или не может достаточно точно проверить, являет-

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

13. Неправильный контроль доступа к закрытым директориям (PathTraversal) -програмное обеспечение должным образом не нейтрализует специальные элементы, которые могут открыть доступ к директориям за пределами родительского каталога.

Следующий исходный код пытается проверить значение пути для безопасной папки [16]:

String path = getInputPath(); if (path.startsWith("/safe_dir/"))

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

{

File f = new File(path); f.delete()

}

В данном конкретном случае путь считается действительным, если он начинается со строки «/safe_dir/», по окончании работы с безопасной папкой она очищается. Если указать следующий путь, программа удалит важный файл:

/safe_dir/../important.dat Это произойдет, поскольку проверка пути пройдет корректно, так как он начинается со значения «/safe_dir/», однако следующая последовательность «../» означает переход к папке уровнем выше, в которой расположен файл important.dat который будет удалён функцией программы.

14. Удаленная загрузка исходного кода без встроенной проверки - в программном продукте отсутствует встроенная проверка происхождения и целостности загружаемого из удаленного места исходного кода или исполняемой инструкции.

В этом примере происходит загрузка внешнего класса из локальной поддиректории [17]:

URL[] classURLs= new URL[]{ new URL("file:subdir/")

};

URLClassLoader loader = new URLClassLoader(classURLs);

Class loadedClass = Class.forName("loadMe", true, loader);

Однако это не гарантирует что будет загружен предполагаемый нужный класс, например потому, что отсутствует проверка контрольной суммы файла класса. Это мо-

жет привести к отказу системы, поскольку искомый файл класса может быть изменен.

15. Неправильная реализация процесса авторизации - приложение выполняет проверку авторизации, когда пользователь пытается получить доступ к какому-либо ресурсу или выполнить какое либо действие, но эта проверка проходит неправильно, что может привести к обходу системы безопасности.

16. Зависимость части функционала от сторонних неконтролируемых источников -информационная система импортирует, запрашивает или включает в себя часть функционала из источников, находящихся за пределами сферы контроля разработчиков и под управлением третьих лиц.

17. Неправильное ограничение прав доступа к критически важным ресурсам -программное обеспечение содержит права доступа для критически важных ресурсов, но допускает, что этот ресурс будет читаться и модифицироваться неуполномоченными на это пользователями.

Простой пример - команда, задающая права доступа в *nix системах: chmod -Rugo+rDIRNAME Если эту команду выполняет программа, то запустивший программу пользователь может не ожидать того, что все файлы в каталоге будут доступны для чтения. Если каталог будет содержать личные данные, это может стать проблемой.

18. Использование потенциально опасной функции - при неправильном использовании потенциально опасные функции в программе могут привести к уязвимости.

Следующий код пытается создать локальную копию буфера, чтобы выполнить некоторые манипуляции с этими данными [18]: voidmanipulate_string(char * string){ charbuf[24]; strcpy(buf, string);

.}..

Поскольку функция не проверяет длину строки и размер буфера, она не должна использоваться для работы с внешними данными во избежание переполнения буфера.

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

20. Неправильный расчет размера буфера - программное обеспечение неправильно производит расчет размера буфера,

который будет использоваться, что может привести к его переполнению.

21. Неправильное ограничение для чрезмерных попыток аутентификации -приняты недостаточные меры, чтобы предотвратить несколько неудачных попыток аутентификации в течение короткого промежутка времени, это делает процесс аутентификации восприимчивым к простому перебору различных вариантов.

22. Перенаправление на ненадежный сайт (OpenRedirect) - веб-сайт, который принимает параметр и перенаправляет пользователя на значение этого параметра без всякой проверки. Эта уязвимость используется в фишинг-атаках, чтобы заставить пользователей посетить вредоносные сайты, не осознавая этого.

Следующий код получает ссылку из строки запроса и перенаправляет пользователя по этой ссылке [19]:

$redirect_url = $_GET['url']; header("Location: ". $redirect_url); Проблемой в приведенном выше коде является то, что этот механизм может быть использован в мошеннических целях при перенаправлении пользователей на вредоносные сайты. Например, предположим, что этот код находится в файле «example.php», тогда злоумышленник может предоставить пользователю следующую ссылку:

http://example.com/example.php?url=ht

tp://malicious.example.biz

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

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

24. Переполнение переменной типа integer (IntegerOverflow) - под термином «integeroverflow» понимается ситуация, когда переменной типа integer пытаются присвоить значение большее, чем она может вместить. Согласно стандарту ISO C99 языка C, компилятор вправе делать все что угодно, например, полностью его игнорировать, что часто и происходит, приводя к неожиданным результатам.

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

Для более детального исследования приведенных уязвимостей был выделен набор критериев для их предварительного оценивания, результаты оценивания приведены в таблице.

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

Ранжирование уязвимостей с переводом результирующих показателей в лингвистическую переменную

Название уязвимости Распростра- ненность Сложность исправления Сложность обнаружения Частота отказов

БОЬинъекция Высокая Низкая Низкая Высокая

Инъекция команд ОС Средняя Средняя Низкая Высокая

Переполнение буфера Высокая Низкая Низкая Высокая

Межсайтовый скриптинг Высокая Низкая Низкая Высокая

Отсутствие аутентификации для критических функций Средняя Низкая- высокая Средняя Средняя

Отсутствие авторизации Высокая Низкая- средняя Средняя Высокая

Использование жестко заданной учетной информации Средняя Средняя- высокая Средняя Низкая

Отсутствие шифрования для конфиденциальных данных Высокая Средняя Низкая Средняя

Неконтролируемая загрузка файлов опасного типа Средняя Средняя Средняя Средняя

Опора механизмов защиты на ненадежные входные данные Высокая Средняя Средняя Высокая

Выполнение инструкций без контроля прав доступа Средняя Средняя Средняя Средняя

Подделка межсайтовых запросов Высокая Высокая Средняя Высокая

Неправильный контроль доступа к закрытым директориям Высокая Низкая Низкая Высокая

Окончание табл.

Название уязвимости Распростра- ненность Сложность исправления Сложность обнаружения Частота отказов

Удаленная загрузка исходного кода без встроенной проверки Средняя Средняя- высокая Средняя Низкая

Неправильная реализация процесса авторизации Высокая Низкая- средняя Средняя Высокая

Зависимость части функционала от сторонних неконтролируемых источников Высокая Низкая- средняя Средняя Высокая

Неправильное ограничение прав доступа к критически важным ресурсам Средняя Низкая- высокая Низкая Высокая

Использование потенциально опасной функции Высокая Средняя Низкая Низкая

Использование ненадежного или потенциально опасного алгоритма шифрования Высокая Средняя- высокая Средняя Низкая

Неправильный расчет размера буфера Высокая Низкая Низкая- средняя Высокая

Неправильное ограничение для чрезмерных попыток аутентификации Высокая Низкая Низкая Высокая

Перенаправление на ненадежный сайт Высокая Средняя Низкая Средняя

Неконтролируемый формат строки Средняя Низкая Низкая Средняя

Переполнение переменной типа integer Средняя Низкая Низкая Средняя

Использование хеш-функций без модификатора Средняя Средняя- высокая Средняя Низкая

ЛИТЕРАТУРА

[1] Липаев В. В. Надежность программных средств. М. : СИНТЕГ, 1998. С. 53.

[2] Евтеев Д. И. Статистика уязвимостей Web-приложений за 2008 год // Security Lab. URL: http://www.securitylab.ru/analytics/368513.php.

[3] Уязвимости // Security Lab. URL: http://www. securitylab.ru/vulnerability/page1_1.php.

[4] National Checklist Program Repository // National Vulnerability Database. URL: http://web.nvd.nist. gov/view/ncp/repository.

[5] Martin B., Brown M., Kirby D., Paller A, Christey S. Top 25 Series - Summary and Links // AppSecBlog. URL: http://software-security.sans. org/blog/category/top25.

[6] SQL-инъекция и защита от нее // Интернет-технологии. URL: http://phpmove.ru/sql-injection. html.

[7] Improper Neutralization of Special Elements used in an OS Command // Vulnerapedia. URL: http:// minsky.gsi.dit.upm.es/semanticwiki/index.php/ Category:Improper_Neutralization_of_Special _Elements_used_in_an_OS_Command_('OS_ Command_Injection').

[8] Buffer Copy without Checking Size of Input // Common Weakness Enumeration. URL: http:// cwe.mitre.org/data/definitions/120.html.

[9] Cross-site Scripting // SCAP sync. URL: http:// scapsync.com/cwe/CWE-79.

[10] Missing Authentication for Critical Function // Common Weakness Enumeration. URL: http:// cwe.mitre.org/data/definitions/306.html.

[11] Missing Authorization // Common Weakness

Enumeration. URL: http://cwe.mitre.org/data/

definitions/862.html.

[12] Use of hard-coded password // Vulnerapedia.

URL: http://minsky.gsi.dit.upm.es/semanticwiki/

index.php/Use_of_hard-coded_password.

[13] Missing Encryption of Sensitive Data // Common Weakness Enumeration. URL: http://cwe.mitre. org/data/definitions/311.html.

[14] Crawford W, Hunter J. Java Servlet Programming // Shroff publishers & distibutors PVT. Ltd. 2011. P. 782.

[15] Execution with Unnecessary Privileges // Common Weakness Enumeration. URL: http://cwe. mitre.org/data/definitions/250.html.

[16] Incorrect Behavior Order // Vulnerapedia. URL: http:// minsky.gsi.dit.upm.es/semanticwiki/index.php/ Category:Incorrect_Behavior_Order:_Validate_ Before_Canonicalize.

[17] Invoking untrusted mobile code // The Open Web Application Security Project. URL: http://www. owasp.org/index.php/Invoking_untrusted_mobile_ code.

[18] Classic Buffer Overflow // Vulnerapedia. URL: http://minsky.gsi.dit.upm.es/semanticwiki/index. php/Category:Buffer_Copy_without_Checking_ Size_of_Input_('Classic_Buffer_Overflow').

[19] Unvalidated Redirects and Forwards Cheat Sheet // OWASP. URL: http://www.owasp.org/index.php/ Unvalidated_Redirects_and_Forwards_Cheat_ Sheet.

i Надоели баннеры? Вы всегда можете отключить рекламу.