Как правильно вычислять хэши в Google Safebrowsing? - PullRequest
0 голосов
/ 22 мая 2019

Я настраиваю клиент Google Safebrowsing.Кажется, я не могу получить совпадения для префиксов хэша в конечной точке fullHashes.find или сопоставления с доменами из черного списка, и мне интересно, правильно ли я все вычисляю.

Я использую модуль googleapiclient.discovery, чтобы получить доступ к API обновлений, и у меня есть в основном две конечные точки для сортировки: safebrowsing_api.threatListUpdates.fetch (который выбирает список префиксов хэшей, с которым сравниваются хэши домена)и safebrowsing_api.fullHashes.find (который возвращает полные хэши для префикса хэша)

Создание списков и поиск полных хешей

Получив ответ на выборку, я анализирую поле ['additions']['rawHashes']['rawHashes'] в следующемпуть:

1.base64 декодирует всю строку, чтобы получить список байтов

prefixesRawList = base64.b64decode(rawHashes)

2.разбить список на куски размером ['rawHashes']['prefixSize'] (обычно 4 байта) и получить шестнадцатеричное представление для каждого

hash_prefixes = [binascii.hexlify(prefixesRawList[i:i+prefix]) for i in range(0,len(prefixesRawList),prefix)]

Это даст мне список типа [b'00000860', b'00000bdd', b'000013b1', b'00002d92', b'000046ca', b'0000481f',...;порядок заставляет меня думать, что я делаю это правильно ...

(исправлено следующее: см. редактирование в конце) НО , приведенное, например, b'00000860 'вСписок SOCIAL_ENGINEERING, Я не получаю хэши от конечной точки fullHashes.find ;действуя следующим образом:

1.base64 кодирует хеш-префикс

threatEntries = [{'hash' : base64.b64encode(prefix).decode('utf8') }]

2.получить клиентские состояния и отправить запрос;таким образом, что я в конечном итоге отправляю что-то вроде:

{'client': {'clientVersion': '1.0.0', 'clientId': 'myid'}, 'apiClient': {'clientVersion': '1.0.0', 'clientId': 'myid'}, 'clientStates': ['Cg0IARAGGAEiAzAwMTABENf8BRoCGAlcqHaY', 'Cg0IAhAGGAEiAzAwMTABEKTIBhoCGAkJEi5s', 'Cg0IAxAGGAEiAzAwMTABEKKKBhoCGAkWMQzZ'], 'threatInfo': {'threatTypes': ['SOCIAL_ENGINEERING'], 'platformTypes': ['ANY_PLATFORM'], 'threatEntryTypes': ['URL'], 'threatEntries': [{'hash': 'MDAwMDA4NjA='}]}}

('MDAwMDA4NjA=' being the base64 encoding for b'00000860')

Но я всегда возвращаюсь

{'negativeCacheDuration': '300s'}

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

Сопоставление доменов со списками

С другой стороны, при сопоставлении:

1.Я канонизирую доменное имя (мой сервис получает только домены), добавив http:// в начале и / в конце

2.Получите дайджест sha256 d = sha256(dom.encode('utf8')).digest()

3.Возьмите 4-байтовый префикс hex prefix = binascii.hexlify(d[:4])

4.Ищите , что в списках

(согласно https://developers.google.com/safe-browsing/v4/urls-hashing)

Но я не могу найти совпадений на странице статуса безопасного сайта (@ * 1074)* таким образом. Например, 4anfm.com указан там как полный небезопасный. http://4anfm.com/ 4b префикс b'30d716ad ', но этот хеш (который выглядит как , что я получаю в списках(как показано выше) не отображается ни в одном из списков, которые у меня есть в памяти (их три: MALWARE, UNWANTED_SOFTWARE и SOCIAL_ENGINEERING threatTypes, для ANY_PLATFORM platformTypes и URL entryType)

Я видел сообщения людейжаловаться на несоответствия между интерфейсом Google и результатами API, поэтому я не могу быть уверен, что это ошибка кода, поэтому я и прошу помощи. Две проблемы (нет полных хешей для префиксов моих списков и нет совпадений для доменов, совпадающих в интерфейсе Google) предложить где-то есть что-то странное, но в Google docs (@ https://developers.google.com/safe-browsing/v4/update-api) не приводится много примеров или тестовых данных для проверки.

-

Чтобы найти совпадения, я пробовал домены черного списка MalwareDomain (@ http://mirror1.malwaredomains.com/files/domains.txt) против отчета о прозрачности Google, пока не найду полное совпадение, а затем используйте его в консоли для тестирования своего кода.Вот как я нашел 4anfm.com.

Я бы, конечно, 1 - ожидал, что любой префикс из моих списков выдаст хотя бы один полный хеш, 2 - ожидал, что любое совпадение домена в прозрачном отчете также приведет к совпадению для некоторых измои списки.

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

Спасибо

-

РЕДАКТИРОВАТЬ : Я только что заметил одну проблему.Хеши, которые я сохраняю в своих списках, должны быть необъяснены до того, как они будут закодированы в base64 и отправлены в конечную точку fullHashes.find.Это исправило ошибку и теперь возвращает результаты при каждом вызове:

{'client': ..., 'apiClient': ..., 'clientStates': ..., 'threatInfo': {'threatTypes': ['SOCIAL_ENGINEERING'], 'platformTypes': ['ANY_PLATFORM'], 'threatEntryTypes': ['URL'], 'threatEntries': [{'hash': 'AAAIYA=='}]}}'

'AAAIYA==' being the base64 encoding for binascii.unhexlify(b'00000860') (not just b'00000860')

{'matches': [{'threatType': 'SOCIAL_ENGINEERING', 'platformType': 'ANY_PLATFORM', 'threat': {'hash': 'AAAIYEk5l7eYhhlW4G09Ngb4I4Qlm5cbuSL5T4hqS1U='}, 'threatEntryMetadata': {}, 'cacheDuration': '300s', 'threatEntryType': 'URL'}], 'negativeCacheDuration': '300s'}

Остается проблема тестирования и сопоставления с прозрачным отчетом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...