【软件与系统安全】八、软件自我保护
这是《【软件与系统安全】笔记与期末复习》系列中的一篇
- Man-At-The-End 攻击模型
- 主要软件自我保护技术:代码混淆
- 主要软件自我保护技术:软件防篡改
- 主要软件自我保护技术:软件水印
- 主要软件自我保护技术:软件胎记
Man-At-The-End 攻击 (MATE)
攻击者: 位于终端,对终端计算资源有最高控制权限
攻击对象:安装在受控终端上的软件程序
攻击目的: 获悉、篡改软件的内部逻辑
代码混淆
目标:阻止对软件实施非授权的逆向分析
核心方法: 语义保留的程序变换
代码混淆的可能性
借鉴密码学算法的安全模型。目标:可证明安全性
然而,“虚拟黑盒”式的混淆器真的可以实现吗?
研究结论: 不可能
核心因素: 程序执行与Oracle访问有着本质区别
- 程序是对函数的简明描述
- Oracle访问只给出函数的输入-输出映射关系
- 函数的功能往往无法通过Oracle访问的方式予以精确学习
代码混淆的实际能力
- 做不到: 让程序的执行逻辑变得不可知
- 做得到: 使程序的执行逻辑变得难以理
代码混淆的方法
不透明谓词( opaque predicate)
较强的构造方法:基于3SAT问题 通过3SAT证明支配集是NPC问题 | 骑士的个人主页 (samjjx.github.io)
- 问题:证明显示不透明谓词在计算上是不安全的
条件分支混淆
方法:
-
单向函数
-
利用分析技术弱点
-
利用神经网络
软件混淆
软件胎记
胎记”的实际含义
- 一类对象的本质特征
- 与生俱来
- 独一无二
软件胎记的广义安全价值
- 反代码剽窃(未经授权使用共享库,或违反协议使用开源代码)
- 检测恶意代码(特别是经过各种伪装保护的)
- 检测移动app的重包装
构造形式分类
- 静态/动态(取决于胎记所依赖的特征类型)
静态构造举例:基于JAVA的栈行为模式
动态构造1:基于执行路
动态构造2:基于程序内的系统调用
不懂呀
软件水印
目标:在软件中嵌入用于标识其版权归属的秘密信息
软件水印的应用形式
- 反盗版 – 通过声明版权
- 反盗版 – 通过追溯盗版母盘的来源
软件水印的形式分类
- 静态/动态(取决于水印的构造方式)
静态构造举例:基本块重排序
静态构造举例:寄存器占用重分配
传统动态构造1:基于动态生成的图对象
传统动态构造2:基于执行路径上的分支行为
传统动态构造3:基于多线程的同步
传统动态构造的问题1:
- 与主程序的关联性很弱
- 往往具有显著的模式/特征
- 很难予以隐藏或伪装
一个特别的设计:基于抽象解释的水印
- 在正常维度上,水印组件服务于载体软件的原本功能
- 在预设的秘密维度上,水印组件展示出隐藏的信息
改进动态构造1:利用返回导向编程
改进动态构造2:利用代码混淆
传统动态构造的问题2:
改进动态构造3:利用神经网络
软件水印仍然存在的不足之处
- 没有在真正意义上实现隐蔽性
- 缺乏有效的定性/定量评估标准(特别是隐蔽性这一安全度量)
- 数据嵌入率很差
- 没有解决工业化、自动化实施的问题
软件防篡改
目标:
- 使得软件的内部逻辑无法被篡改
- 当篡改发生时,完成自我诊断/修复
意义: 阻止对软件的破解
方法:
-
内省自检(introspection)
-
Oblivious Hashing 未察觉的哈希
新场景:对抗app重打包