【发布时间】:2015-09-16 22:54:50
【问题描述】:
我正在使用一个名为scapy-com 的scapy(Python 数据包操作工具)的分支。这实现了 802.15.4 和 Zigbee 解析/操作以及其他协议。
在网络级安全标头中发现了 Zigbee 协议的一个怪癖。最初,安全级别(定义消息完整性代码的加密和长度)设置正确,但在发送之前设置为 0(不加密)。来自规范:
安全控制字段的安全级别子字段应为 被 3 位全零字符串 '000' 覆盖
规范可以是found here。相关章节为“4.3.1.1 出帧的安全处理”。
这意味着数据包捕获表明未使用加密或消息完整性代码。必须在带外传达安全级别。
scapy-com 不处理这个问题。它天真地解析安全级别并将MIC的长度设置为0。执行此操作的代码是:
def util_mic_len(pkt):
''' Calculate the length of the attribute value field '''
# NWK security level 0 seems to implicitly be same as 5
if ( pkt.nwk_seclevel == 0 ): # no encryption, no mic
return 0
elif ( pkt.nwk_seclevel == 1 ): # MIC-32
return 4
elif ( pkt.nwk_seclevel == 2 ): # MIC-64
return 8
elif ( pkt.nwk_seclevel == 3 ): # MIC-128
return 16
elif ( pkt.nwk_seclevel == 4 ): # ENC
return 0
elif ( pkt.nwk_seclevel == 5 ): # ENC-MIC-32
return 4
elif ( pkt.nwk_seclevel == 6 ): # ENC-MIC-64
return 8
elif ( pkt.nwk_seclevel == 7 ): # ENC-MIC-128
return 16
else:
return 0
使用 scapy-com 的项目试图通过将安全级别设置为 5 来处理这个问题:
#TODO: Investigate and issue a different fix:
# https://code.google.com/p/killerbee/issues/detail?id=30
# This function destroys the packet, therefore work on a copy - @cutaway
pkt = pkt.copy() #this is hack to fix the below line
pkt.nwk_seclevel=5 #the issue appears to be when this is set
mic = pkt.mic
但是,这不起作用 - 已设置消息完整性代码。我通过简单地更改 util_mic_len 函数来正确设置麦克风长度来解决这个问题。
问题是,应该如何更改 Zigbee 解析器,以便在初始解剖后更改 nwk_seclevel 导致麦克风长度更新?
我可以看到两种解决方案:
- 更改 scapy-com 代码,以便更改 nwk_seclevel 自动更改麦克风长度。
- 重新剖析来自 scapy-com 外部的数据包,因为它们已更改。
1 的问题是我不知道该怎么做。
2 的问题是我有一些想法,但无法让它工作 - 我不知道如何在数据包加载后调用 dissect。调用 pkt.dissect(pkt) 似乎不起作用并且看起来很奇怪。
这里最好或推荐的解决方案是什么?
【问题讨论】:
标签: python security encryption zigbee