锁机程序“定时密码锁”的Bug处理(1):“授权密码”防穷举措施

B站影视 2024-12-04 21:50 2

摘要:尾款锁机程序已经投入真实现场运行了一段时间了,解决方案采用的是第二套方案——“定时密码锁”。目前,发现了以下行为,导致执行机构的动作可以绕开“定时密码锁”的逻辑控制,以致锁机逻辑失效。

尾款锁机程序已经投入真实现场运行了一段时间了,解决方案采用的是第二套方案——“定时密码锁”。目前,发现了以下行为,导致执行机构的动作可以绕开“定时密码锁”的逻辑控制,以致锁机逻辑失效。

Bug1:“密码”输入次数未加限定,用户可无限次数的输入“猜测密码”,密码有通过穷举被猜到的可能。Bug2:“定时密码锁”的核心逻辑是通过比较“截止时间”与PLC系统本地时间,来决定是否锁机的。用户可能在组态上“向前”修改系统时间,从而使“截止时间”永远不能到达,间接的绕开锁机逻辑。Bug3:修改“定时密码锁”的授权时间,即“AuthorizedMonths”参数,比如由6个月改为12个月。从而延长“锁机”的截止时间。

本文即将来解决Bug1,完善程序的逻辑,防止通过“穷举”的方式破解密码。

“授权密码”防穷举思维导图如下图所示。

图1 “授权密码”防穷举措施思维导图

新增以下接口:

LastPassword:用于记录上一扫描周期是的iPassword;NewPasswordIn:有“密码输入动作”时,标识该值为1,否则为0。PasswordInNum:记录输入错误密码的次数。StatusWord:状态字。反馈当前块的状态。

代码如下:

初始化阶段,有一个默认的初始输入密码(一般为空字符串)。为了记录未输入解锁密码的状态,将初始输入密码写入LastPassword,从而可标识状态为“未输入解锁密码”状态,即状态字StatusWord=16#1000。

代码如下:

iPassword为本次扫描周期的“输入密码”;LastPassword为上一个扫描周期的“输入密码”。如果二者不同,则认为有“输入密码”的动作。则作以下判断:

如果输入的密码正确,则解锁程序,即sUnlocked=1。同时,令状态字StatusWord=16#0。如果输入的密码错误,则“密码输入次数”计数+1。

代码如下:

“错误密码输入次数”与状态字的关系如下:

(1)“错误密码输入次数”在1~3之间时,状态字StatusWord=16#1001,标识为一般状态;

(2)“错误密码输入次数”在3~5之间时,状态字StatusWord=16#1002,标识为Alarm,并可在HMI或SCADA上做报警显示,提醒用户;

(3)“错误密码输入次数”超过5次时,状态字StatusWord=16#1004,标识为Fault,并可在HMI或SCADA上做报警显示,提醒用户;

测试Trace曲线如下:

图1.3 Trace曲线

图1.3.1 Trace曲线:状态1,NewPasswordInNum=0

Trace曲线:状态1,代表的是初始化后,未输入密码时的状态,StatusWord=16#1000。

图1.3.2 Trace曲线:状态2,NewPasswordInNum=1,2

Trace曲线:状态2,代表的是输入错误密码的次数在3以内的状态,StatusWord=16#1001。

图1.3.3 Trace曲线:状态3,NewPasswordInNum=3,4

Trace曲线:状态3,代表的是输入错误密码的次数在3~5次之间的状态,StatusWord=16#1002。标识为Alarm,并可在HMI或SCADA上做报警显示,提醒用户错误密码输入次数较多,应多加注意。

图1.3.2 Trace曲线:状态4,NewPasswordInNum=5及以上

Trace曲线:状态4,代表的是输入错误密码的次数在5次以上的状态,StatusWord=16#1004。标识为Fault,并可在HMI或SCADA上做报警显示,提醒用户错误密码输入次数超限(这种情形可视同暴力破解密码),且授权截止时间被强制设定为当天的23:59:59.999。用户需输入正式密码才能解锁逻辑。

图1.3.2 Trace曲线:状态5,解锁状态

Trace曲线:状态5,代表的输入正确密码后,逻辑解锁的状态。任何状态下,输入正确密码,都可以将程序解锁。

来源:福德宫哼哼

相关推荐