2018年 KCon 议题解读 | python动态代码审计
字数 1425 2025-08-27 12:33:22
Python动态代码审计技术详解
一、动态代码审计概述
动态代码审计是一种通过运行时监控和分析来发现安全漏洞的技术,特别适用于大型复杂项目。主要优势包括:
- 处理复杂代码结构:能够发现隐藏较深的安全问题
- 发现特定类型漏洞:如危险的定时计划任务、SQLite数据库任意创建导致的文件覆盖等
- 提高审计效率:通过黑盒方法快速定位漏洞
二、常见漏洞分类
动态代码审计主要针对以下几类安全漏洞:
- 数据库操作漏洞:SQL注入、不安全的数据库配置等
- 敏感函数调用:命令执行、反序列化、SSTI等
- 文件操作漏洞:任意文件读写、上传、删除等
- 网络访问漏洞: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)
实施步骤
- 复制目标模块文件(如
os.py) - 修改副本文件,注释原函数并添加Hook逻辑
- 设置
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技术集成
结合多种技术进行综合测试:
-
测试数据:
- 正常数据
- 畸形数据
- 已知POC数据
- 自定义测试用例
-
工具使用:
- 使用Burp Intruder进行自动化测试
- 参考Wooyun等平台的Fuzzing测试用例
-
日志分析:
- 数据库日志
- 危险函数调用日志
- Auditd系统日志
- DNS查询日志
- Web错误日志
五、实施注意事项
-
业务适配:
- 根据具体业务类型定制测试用例
- 考虑业务逻辑特殊性
-
日志处理:
- 设计高效的日志处理方案
- 处理大量日志产生的存储和分析问题
-
性能影响:
- 监控审计对系统性能的影响
- 在测试环境进行充分评估
六、未来发展方向
-
自动化部署:
- 开发自动化客户端部署工具
- 实现一键式审计环境搭建
-
日志分析平台:
- 开发集中式日志处理平台
- 实现自动化漏洞识别和告警
-
漏洞覆盖扩展:
- 增加对新漏洞类型的检测能力
- 持续丰富测试用例库
-
技术整合:
- 结合静态分析与动态分析
- 集成机器学习进行智能分析
通过以上技术的综合应用,可以构建一套高效的Python应用动态审计系统,显著提高安全审计的效率和覆盖率。