Google Safebrowsing

时间:2019-05-22 15:37:10

标签: python hash google-api

我正在设置一个Google Safebrowsing客户端。看来我无法在fullHashes.find端点上获得哈希前缀的匹配,也无法与列入黑名单的域匹配,而且我想知道我是否在正确地计算所有内容。

我正在使用googleapiclient.discovery模块来访问Update API,主要有两个端点可供选择: safebrowsing_api.threatListUpdates.fetch(获取与域哈希进行比较的哈希前缀列表)和safebrowsing_api.fullHashes.find(返回哈希前缀的完整哈希)

建立列表并查找fullHashes

一旦获得抓取响应,我将以以下方式解析['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',...类型的列表;订单使我觉得我做得正确...

(以下问题已得到修复:请参见最后的编辑),例如在SOCIAL_ENGINEERING列表中给出的b'00000860',我没有从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字节前缀十六进制prefix = binascii.hexlify(d[:4])

4。在列表中查找那个

(根据https://developers.google.com/safe-browsing/v4/urls-hashing

但是我无法通过这种方式与安全浏览站点状态页面(@ https://transparencyreport.google.com/safe-browsing/search)匹配。例如,4anfm.com被列为完全不安全。 http://4anfm.com/ 4b前缀是b'30d716ad',但是该哈希值(看起来像我在列表中看到的一样,如前所示)不会显示在我拥有的任何列表中内存中(对于ANY_PLATFORM平台类型和URL entryType,这三种是MALWARE,UNWANTED_SOFTWARE和SOCIAL_ENGINEERING威胁类型)

我确实看到有人抱怨google的界面和API结果之间存在差异,因此我无法确定这是一个代码错误,这就是为什么我寻求帮助。这两个问题(我的列表的前缀没有完整的散列,并且在Google的界面中没有匹配域的匹配项)建议某处有些奇怪,但是google docs(@ https://developers.google.com/safe-browsing/v4/update-api)没有提供大量示例或测试数据可供对照。

-

要找到匹配项,我一直在尝试针对Google透明度报告尝试MalwareDomain的黑名单域(@ http://mirror1.malwaredomains.com/files/domains.txt),直到找到完全匹配项,然后在控制台中使用它来测试我的代码。这就是我发现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'}

问题测试以及与透明度报告的匹配仍然存在

0 个答案:

没有答案