Vulnerability-wiki

动态代码加载漏洞(Dynamic Code Loading Vulnerability)

1. 漏洞概述

动态代码加载漏洞 是指应用程序在运行过程中,通过网络、文件系统或其他外部来源加载并执行代码(如脚本、类文件、二进制模块),但未对代码的来源、完整性、合法性进行充分校验,从而导致攻击者可以注入恶意代码,执行任意指令。

该漏洞常见于:


2. 漏洞成因

  1. 不安全的外部输入
    从不可信来源(网络、用户上传、外部设备等)获取代码并直接执行。

  2. 缺乏签名或完整性验证
    未校验代码文件的数字签名、哈希值,攻击者可篡改内容。

  3. 动态路径或文件名拼接
    使用用户输入拼接模块路径/URL,再直接加载。

  4. 对运行环境的信任过高
    假设执行环境是安全的,没有考虑本地被篡改或中间人攻击。


3. 攻击方式

攻击方式 描述
远程代码注入 攻击者通过网络返回恶意代码文件,应用直接加载执行。
本地文件替换 替换本地动态加载的库文件或脚本,执行恶意逻辑。
中间人攻击(MITM) 在下载动态代码时篡改传输内容,注入恶意脚本。
恶意插件 利用应用的插件机制,提交含有后门的扩展模块。

4. 典型案例

  1. Android 应用 DexClassLoader 漏洞
    • 加载外部 dex/jar 文件时,未校验签名或来源,攻击者可替换文件实现任意代码执行。
  2. Node.js require 动态路径
    • require(userInput) 导致加载任意本地或远程模块。
  3. Python exec/eval 动态脚本执行
    • 从网络下载脚本并直接用 exec() 执行。
  4. Web 前端动态 script 注入
    • 通过 DOM 操作添加 <script src="..."> 从非可信域加载恶意 JS。

5. 危害


6. 防御与缓解措施

  1. 限制动态加载来源
    • 仅允许从可信域名、受控存储库加载。
  2. 数字签名校验
    • 使用代码签名(如 JAR 签名、APK 签名)并在运行时验证。
  3. 完整性校验
    • 下载代码后验证哈希(SHA-256 等)。
  4. 禁用高风险 API
    • 避免直接使用 eval()exec()system() 等执行外部代码的函数。
  5. 最小权限原则
    • 加载的模块运行在受限沙箱环境中。
  6. 安全传输
    • 使用 HTTPS 并开启证书固定(Certificate Pinning)。

7. 检测方法


8. 总结

动态代码加载本质上是一种灵活但高风险的功能,如果缺乏严格的校验和限制,将直接暴露出任意代码执行的入口。安全设计中应尽可能减少动态加载的使用,或在加载前严格验证来源和完整性,并结合沙箱和最小权限原则降低风险。