python项目代码审计_Python 安全 -代码审计

Python 安全 -代码审计

杀戮 (有事请 at 大号园长)

8093 | 2014-12-02 12:23

这次来讲关于自动化审计方面的。

OpenStack 团队出品过一个Python代码审计工具叫bandit,思路很牛逼,通过AST模块将源代码转换为Python语法树,由用户自定义对语法树的节点进行测试。

这就需要大致讲下编译器是如何解析源代码的,编译器会先将源代码通过词法分析进行分割,就是说什么算一个词 if 是一个词 “hello world” 也是一个词,然后进行语法分析,语法分析会将词法分析后的结果解析成一个语法树。

比如

代码

if (a == 10) {

printf("hoge\n");

} else {

printf("piyo\n");

}

转换成语法树后

2014120212081538694.png

2014120212081538694.png

然后会分析语义,比如数据类型啊,逻辑啊,导入的包存不存在之类的,最后会转换成字节码或者别的什么执行。

后面的过程我们就忽略吧,我们的审计过程就是在这个过程进行的。虽然Bandit是基于AST模块的,不过内部应该做了很完善的源码审计实现,我没怎么看源码就是了。

我写个简单的脚本示范,假设我想自动化提取一个变量在一个文件中经过了的操作。

//类checkVal一旦发现变量A就输出其操作类型

class checkVal(ast.NodeVisitor):

def visit_Name(self,node):

info = re.findall("\..+?obj",str(node.ctx))[0][1:-4]

if str(node.id)=="a":

print info

//读取python代码

pyCode = open("F:\\project\\pyproject\\douban\\main.py","r+").read()

//解析

code = ast.parse(pyCode)

//初步遍历代码块

for node in code.body:

checkVal().visit(node)

这是我的main.py

import urllib2

import json

url = "https://api.douban.com/v2/book/user_tags/baalbbb"

def getMessage():

response = urllib2.urlopen(url)

return response

a = json.loads(getMessage().read())

for i in a["tags"]:

print i["title"]

print i["count"]

输出

2014120212193813062.jpg

2014120212193813062.jpg

通过语法树解析,可以做到非常高效,并且误报率极低的代码审计流程,前提是你有耐心写工具,其实并不是只有python,通过语法树是一种编程语言通用的概念,其他语言有没有AST这种方便的模块我不知道,当然你也可以考虑用 bison和 flex写一个通用的框架出来,明年清明我回去看你。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值