2018年 KCon 议题解读 | python动态代码审计
字数 1425 2025-08-27 12:33:22

Python动态代码审计技术详解

一、动态代码审计概述

动态代码审计是一种通过运行时监控和分析来发现安全漏洞的技术,特别适用于大型复杂项目。主要优势包括:

  1. 处理复杂代码结构:能够发现隐藏较深的安全问题
  2. 发现特定类型漏洞:如危险的定时计划任务、SQLite数据库任意创建导致的文件覆盖等
  3. 提高审计效率:通过黑盒方法快速定位漏洞

二、常见漏洞分类

动态代码审计主要针对以下几类安全漏洞:

  1. 数据库操作漏洞:SQL注入、不安全的数据库配置等
  2. 敏感函数调用:命令执行、反序列化、SSTI等
  3. 文件操作漏洞:任意文件读写、上传、删除等
  4. 网络访问漏洞:SSRF、XXE等

三、核心审计技术

1. 数据库日志审计

MySQL通用日志(general log)

-- 开启通用日志
SET GLOBAL general_log_file='/path/to/logfile.log';
SET GLOBAL general_log=ON;

PostgreSQL日志配置

编辑postgresql.conf文件:

log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

审计方法

  • 使用Burp发送包含SQL注入测试用例的请求
  • 使用grep过滤日志中的ERROR关键字快速定位SQL注入漏洞

2. Python函数Hook技术

通过劫持Python模块函数来监控敏感操作:

基本Hook实现

import imp
import sys

class _InstallFcnHook(object):
    def __init__(self, fcn):
        self._fcn = fcn
    
    def _pre_hook(self, *args, **kwargs):
        print("hook:" + str(args))
        return (args, kwargs)
    
    def __call__(self, *args, **kwargs):
        (_hook_args, _hook_kwargs) = self._pre_hook(*args, **kwargs)
        retval = self._fcn(*_hook_args, **_hook_kwargs)
        return retval

# 劫持系统函数示例
fd, pathname, desc = imp.find_module(__name__, sys.path[::-1])
mod = imp.load_module(__name__, fd, pathname, desc)
system = _InstallFcnHook(system)

实施步骤

  1. 复制目标模块文件(如os.py
  2. 修改副本文件,注释原函数并添加Hook逻辑
  3. 设置PYTHONPATH环境变量使Python优先加载修改后的模块

可检测漏洞类型

  • SSTI(模板注入)
  • Pickle反序列化
  • 命令执行
  • 危险函数调用

注意事项

  • 需要从Shell启动Python Web应用(而非WSGI)
  • 动态加载模块后需删除已加载模块:del sys.modules['module_name']
  • 关闭调试选项(如Flask的debug模式)
  • 部分内置函数(如open)无法通过此方式Hook

3. Auditd系统审计

Linux审计系统可监控文件操作:

基本配置

# 安装(Ubuntu)
apt-get install auditd

# 配置规则
# 记录文件操作
sudo auditctl -a exclude,always -F msgtype!=PATH -F msgtype!=SYSCALL

# 记录shell命令执行
sudo auditctl -a always,exit -F arch=b64 -S execve -k rule01_exec_command

# 记录指定进程文件操作
sudo auditctl -a always,exit -F pid=$mypid

# 查看当前规则
sudo auditctl -l

日志分析

  • 使用grep过滤PATH类型日志
  • 使用高亮工具(如hhighlighter)突出关键信息

可检测漏洞

  • 任意文件上传
  • 任意文件创建/读取/删除
  • 危险文件操作

4. HTTP盲攻击检测

通过DNS日志检测网络相关漏洞:

测试用例示例

命令执行检测

# 常见形式
os.system("ping -c 1 xxx.pw")

SSRF检测

# 常见形式
url = "http://xxx.pw"
requests.get(url)

XXE检测

<!DOCTYPE xdsec [
  <!ELEMENT methodname ANY >
  <!ENTITY xxe SYSTEM "http://xxxx.pw/text.txt" >
]>
<methodcall>
  <methodname>&xxe;</methodname>
</methodcall>

检测方法

  • 监控DNS查询日志
  • 查找异常域名解析请求

四、Fuzzing技术集成

结合多种技术进行综合测试:

  1. 测试数据

    • 正常数据
    • 畸形数据
    • 已知POC数据
    • 自定义测试用例
  2. 工具使用

    • 使用Burp Intruder进行自动化测试
    • 参考Wooyun等平台的Fuzzing测试用例
  3. 日志分析

    • 数据库日志
    • 危险函数调用日志
    • Auditd系统日志
    • DNS查询日志
    • Web错误日志

五、实施注意事项

  1. 业务适配

    • 根据具体业务类型定制测试用例
    • 考虑业务逻辑特殊性
  2. 日志处理

    • 设计高效的日志处理方案
    • 处理大量日志产生的存储和分析问题
  3. 性能影响

    • 监控审计对系统性能的影响
    • 在测试环境进行充分评估

六、未来发展方向

  1. 自动化部署

    • 开发自动化客户端部署工具
    • 实现一键式审计环境搭建
  2. 日志分析平台

    • 开发集中式日志处理平台
    • 实现自动化漏洞识别和告警
  3. 漏洞覆盖扩展

    • 增加对新漏洞类型的检测能力
    • 持续丰富测试用例库
  4. 技术整合

    • 结合静态分析与动态分析
    • 集成机器学习进行智能分析

通过以上技术的综合应用,可以构建一套高效的Python应用动态审计系统,显著提高安全审计的效率和覆盖率。

Python动态代码审计技术详解 一、动态代码审计概述 动态代码审计是一种通过运行时监控和分析来发现安全漏洞的技术,特别适用于大型复杂项目。主要优势包括: 处理复杂代码结构:能够发现隐藏较深的安全问题 发现特定类型漏洞:如危险的定时计划任务、SQLite数据库任意创建导致的文件覆盖等 提高审计效率:通过黑盒方法快速定位漏洞 二、常见漏洞分类 动态代码审计主要针对以下几类安全漏洞: 数据库操作漏洞 :SQL注入、不安全的数据库配置等 敏感函数调用 :命令执行、反序列化、SSTI等 文件操作漏洞 :任意文件读写、上传、删除等 网络访问漏洞 :SSRF、XXE等 三、核心审计技术 1. 数据库日志审计 MySQL通用日志(general log) PostgreSQL日志配置 编辑 postgresql.conf 文件: 审计方法 : 使用Burp发送包含SQL注入测试用例的请求 使用grep过滤日志中的 ERROR 关键字快速定位SQL注入漏洞 2. Python函数Hook技术 通过劫持Python模块函数来监控敏感操作: 基本Hook实现 实施步骤 复制目标模块文件(如 os.py ) 修改副本文件,注释原函数并添加Hook逻辑 设置 PYTHONPATH 环境变量使Python优先加载修改后的模块 可检测漏洞类型 : SSTI(模板注入) Pickle反序列化 命令执行 危险函数调用 注意事项 : 需要从Shell启动Python Web应用(而非WSGI) 动态加载模块后需删除已加载模块: del sys.modules['module_name'] 关闭调试选项(如Flask的debug模式) 部分内置函数(如 open )无法通过此方式Hook 3. Auditd系统审计 Linux审计系统可监控文件操作: 基本配置 日志分析 : 使用grep过滤 PATH 类型日志 使用高亮工具(如 hhighlighter )突出关键信息 可检测漏洞 : 任意文件上传 任意文件创建/读取/删除 危险文件操作 4. HTTP盲攻击检测 通过DNS日志检测网络相关漏洞: 测试用例示例 命令执行检测 : SSRF检测 : XXE检测 : 检测方法 : 监控DNS查询日志 查找异常域名解析请求 四、Fuzzing技术集成 结合多种技术进行综合测试: 测试数据 : 正常数据 畸形数据 已知POC数据 自定义测试用例 工具使用 : 使用Burp Intruder进行自动化测试 参考Wooyun等平台的Fuzzing测试用例 日志分析 : 数据库日志 危险函数调用日志 Auditd系统日志 DNS查询日志 Web错误日志 五、实施注意事项 业务适配 : 根据具体业务类型定制测试用例 考虑业务逻辑特殊性 日志处理 : 设计高效的日志处理方案 处理大量日志产生的存储和分析问题 性能影响 : 监控审计对系统性能的影响 在测试环境进行充分评估 六、未来发展方向 自动化部署 : 开发自动化客户端部署工具 实现一键式审计环境搭建 日志分析平台 : 开发集中式日志处理平台 实现自动化漏洞识别和告警 漏洞覆盖扩展 : 增加对新漏洞类型的检测能力 持续丰富测试用例库 技术整合 : 结合静态分析与动态分析 集成机器学习进行智能分析 通过以上技术的综合应用,可以构建一套高效的Python应用动态审计系统,显著提高安全审计的效率和覆盖率。