避免简单逻辑
详细描述
代码中的简单逻辑测试更容易受到攻击。 例如:
if sessionIsTrusted == 1
这是一个简单的逻辑测试,如果攻击者可以改变这个值,他们可以绕过安全控制。 苹果iOS被攻击使用这种类型的弱点和Android应用程序已经他们的Dalvik二进制补丁绕过各种保护机制。 这些逻辑测试很容易在许多级别上回避。 在组装级别上,攻击者可以仅使用调试器来攻击iOS应用程序,以找到正确的CBZ(零比较和分支)或CBNZ(比较和非零分支)指令并将其反转。 这可以在运行时执行,只需遍历对象的内存地址,并在应用程序运行时更改其实例变量。 在Android上,应用程序可以反编译为SMALI,并在重新编译之前修补分支条件。
建议
考虑一个更好的编程范例,当会话不受信任时,由服务器强制执行权限,或者通过防止某些数据被解密或以其他方式可用,直到应用程序可以使用质询/响应,OTP或其他 形式的认证。 此外,建议将所有健全检查功能声明为静态内联。 使用这种方法,它们被内联编译,使得更难以修补(即攻击者不能简单地重写一个函数或修补一个函数)。 这种技术将需要攻击者从应用程序中寻找并修补检查的每个实例,增加了攻击所需的复杂性。 对于高度敏感的应用程序,建立在安全编码原则中的更复杂的方法可能值得进一步调查。 集成技术(如加密,定时回调和基于流的编程)可能增加攻击者的复杂性。
同样,存储在对象中的简单逻辑变量可以容易地被攻击者操纵。 例如:
session.trusted = TRUE
这样的值可以由应用程序当前使用的类的实例内的攻击者读取和写入。 在iOS上,通过操作Objective-C运行时,可以操纵这些变量,以便下次应用程序引用这些变量时,将读取任何操作的值。