...

среда, 25 марта 2015 г.

Сам себе Руссинович

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

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



А началось все с изучения API не нуждающегося в представлении сервиса VirusTotal, с которым стал интегрировать некоторые из своих утилит Марк Руссинович. Прочтя документацию, мне стало любопытно насколько защищен ключ «вшиваемый» Руссиновичем в свои утилиты. Но к моему удивлению и разочарованию одновременно ключ никак не защищен.



>>> from os import name, path, system
>>> #просто для удобства
>>> def cls(): system('cls' if name == 'nt' else 'clear')
...
>>> #где сидит фазан?
>>> sig = path.abspath('sigcheck.exe')
...
>>> from re import compile, findall
>>> with open(sig, 'rb') as fs:
... buf = fs.read()
...
>>> #длина ключа 64 символа
>>> for i in compile('[\x20-\x7E]{64,}').findall(buf.decode('ascii', 'replace')): print(i)
...




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

>>> key = compile('[\x20-\x7E]{64,}').findall(buf.decode('ascii', 'replace'))[3]




и есть ключ? Просто проверяем подстановкой.

>>> cls()
...
>>> from urllib.parse import urlencode
>>> from urllib.request import urlopen
>>>
>>> par = {'resource':'habrahabr.ru', 'apikey':key}
>>> with urlopen('http://ift.tt/19OIsAw', bytes(urlencode(par), 'utf8')) as req:
... json = req.read()
...
>>> #парсим полученные данные
>>> from json import loads
>>> loads(str(json, 'utf8'))['positives']
1




Да ладно! Глянем результаты сканирования.

>>> res = loads(str(json, 'utf8'))['scans']
>>> for i in sorted(res): print("%-27s%s" % (i, res[i]['result']))
...




Впрочем, я отвлекся от основной темы.

Со всем этим я обратился к самому господину Руссиновичу, но никакой реакции, за исключением деактивации возможности оставлять комментарии к результатам сканирования с данного ключа, не последовало. Что в общем-то логично: какой смысл шифровать уже вскрытый ключ? Впрочем, даже смена ключа ни к чему не обязывает, если вникнуть в то, как именно он генерируется, но это уже тема отдельного разговора.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий