动态代码加载漏洞 是指应用程序在运行过程中,通过网络、文件系统或其他外部来源加载并执行代码(如脚本、类文件、二进制模块),但未对代码的来源、完整性、合法性进行充分校验,从而导致攻击者可以注入恶意代码,执行任意指令。
该漏洞常见于:
DexClassLoader、PathClassLoader)eval()、exec()、include())不安全的外部输入
从不可信来源(网络、用户上传、外部设备等)获取代码并直接执行。
缺乏签名或完整性验证
未校验代码文件的数字签名、哈希值,攻击者可篡改内容。
动态路径或文件名拼接
使用用户输入拼接模块路径/URL,再直接加载。
对运行环境的信任过高
假设执行环境是安全的,没有考虑本地被篡改或中间人攻击。
| 攻击方式 | 描述 |
|---|---|
| 远程代码注入 | 攻击者通过网络返回恶意代码文件,应用直接加载执行。 |
| 本地文件替换 | 替换本地动态加载的库文件或脚本,执行恶意逻辑。 |
| 中间人攻击(MITM) | 在下载动态代码时篡改传输内容,注入恶意脚本。 |
| 恶意插件 | 利用应用的插件机制,提交含有后门的扩展模块。 |
dex/jar 文件时,未校验签名或来源,攻击者可替换文件实现任意代码执行。require(userInput) 导致加载任意本地或远程模块。exec() 执行。<script src="..."> 从非可信域加载恶意 JS。eval()、exec()、system() 等执行外部代码的函数。代码审计
检查是否存在从不可信输入构造的动态加载。
动态分析
运行时监控代码加载行为(文件路径、网络请求)。
安全测试
模拟注入恶意代码文件,观察是否被执行。
动态代码加载本质上是一种灵活但高风险的功能,如果缺乏严格的校验和限制,将直接暴露出任意代码执行的入口。安全设计中应尽可能减少动态加载的使用,或在加载前严格验证来源和完整性,并结合沙箱和最小权限原则降低风险。