Один тип уязвимостей Питон программ.
Авторы: prusle и djp.
Неустойчивость к ошибкам библиотечных функций языка Си (таких как stscpy,
sprintf, strcat и многих других) позволяет получать полный контроль над ОС,
написанными на Си. Изобретательность хакеров проявилась в изобретении методов
эксплуатации таких ошибок - использовании их в своих интересах: для получения
несанкционированного доступа к ОС. Статья Aleph One "Smashing stack for fun
and profit" определила историю компьютерного подполья на десятилетия.
Во многих языках программирования существуют изъяны. Задачей хакера является
эксплуатация таких изъянов в своих целях - несанкционированном доступе
к информации. В этой статье мы расскажем об эксплуатации одного типа уязвимостей
Питон - программ. Этим изъяном Питона есть добавление в списочный тип
ссылки на другой списочный тип вместо копирования элементов этого списочного
типа при вызове метода .append()
Простейший пример с изъяном:
Код:
#------------------------EXAMPLE 1: test1.py--------------
array1 = ****
array2 = [1,2,3,4,5]
array1.append(array2)
print array1
array2[0]=9
print array1
#---------------------END OF EXAMPLE 1--------------------
Запускаем: python test1.py
Фактический вывод на экран:
Код:
****1, 2, 3, 4, 5****
****9, 2, 3, 4, 5****
Ожидаемый вывод на экран:
Код:
****1, 2, 3, 4, 5****
****1, 2, 3, 4, 5****
Модификация нулевого элемента второго массива, добавленного в первый массив,
модифицирует первый массив. Это происходит из-за того, что при добавлении
в список другого списка добавляется ссылка на список, а не элементы списка.
Модификация элементов приводит к изменению значения по ссылке. Этого программист
может не ожидать и допустить такую ошибку в программе.
Можно ли эксплуатировать такого типа изъяны? Конечно можно. Докажем это
гипотетическим примером уязвимого FTP сервера на питоне.
Для простоты опустим сетевой код и приведём лишь ключевые фрагменты
уязвимой программы:
Код:
#------------------EXAMPLE 2:vulnerable FTP daemon fragments-------
#initialization
#...
LogedInUsers = ****
UserInfo = ["","",0]
#...
#authentication
def aythenticate(socket):
#read Login
#read Password
#determine Time of login
#...
UserInfo[0] = Login
UserInfo[1] = Password
UserInfo[2] = Time
if PasswordGood(Login, Password):
LogedInUsers.append(UserInfo)
else:
#send "Bad password" message
#next login attempt
#...
#----------------------------END OF EXAMPLE 2----------------------
Рассмотрим работу такого гипотетического кода. Допустим пользователь root
залогинился с паролем root123. К серверу, вычислив что рут на сервере методами
социальной инженерии, подключается хакер с Login=l1th4k3 и Password="".
Login и Password модифицируют переменную UserInfo, ссылка на которую сохранена
в переменной LogedInUsers. Хакер попадает в список залогиненых пользователей
на позицию записи для рута! Он залогинен без пароля. При хорошем стечении обстоятельств
ещё и с привилегиями рута! FTP сервер на питоне уязвим.
Вывод: Язык Питон уязвим к ошибкам с указателями как и язык Си.
Критерием потенциально-уязвимого кода на питоне есть объединение двух
условий: в список добавляется переменная список, эта переменная-список
после модифицируется. Этот критерий позволяет полуавтоматический аудит
питон-программ.
Звёздочками **** редактор заменил пустые квадратные скобки и двойные квадратные скобки.
Удачи в аудите кода, бэкдорьте *всё*