当前位置:WooYun(白帽子技术社区) >> python >> Python 安全 -代码审计

Python 安全 -代码审计

杀戮 (有事请 at 大号园长) | 2014-12-02 12:23

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

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

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

比如

代码
if (a == 10) {
    printf("hoge\n");
} else {
    printf("piyo\n");
}


转换成语法树后

12.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"]


输出

QQ截图20141202121821.jpg

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

分享到:
  1. 1#
    回复此人 感谢
    xfkxfk | 2014-12-02 12:55

    牛逼

  2. 2#
    回复此人 感谢
    sco4x0 (-.-) | 2014-12-02 13:09

    mark

  3. 3#
    回复此人 感谢
    疯狗 (阅尽天下漏洞,心中自然无码。) | 2014-12-02 13:14

    语义分析啊,实战靠谱不。

  4. 4#
    回复此人 感谢
    saber (终极屌丝之路~) | 2014-12-02 13:17

    感觉不错。

  5. 5#
    回复此人 感谢
    杀戮 (有事请 at 大号园长) | 2014-12-02 13:44

    @疯狗 看Openstack团队的实力,应该是有了成效

  6. 6#
    回复此人 感谢
    erevus | 2014-12-02 14:56

    小戳!

  7. 7#
    回复此人 感谢
    小胖子 (z7y首席代言人,园长的表哥...) | 2014-12-02 15:47

    屌!

  8. 8#
    回复此人 感谢
    Fireweed | 2014-12-02 16:49

    牛逼,关注

  9. 9#
    回复此人 感谢
    asdf (import pdb;pdb.set_trace(); name="signature" type="text" maxlength="25") | 2014-12-02 16:59

    同样的C语言的也有一个 https://github.com/eliben/pycparser

  10. 10#
    回复此人 感谢
    asdf (import pdb;pdb.set_trace(); name="signature" type="text" maxlength="25") | 2014-12-02 17:03

    @疯狗 实战看写test case的人对这了解的程度的。 还是很靠谱的。

  11. 11#
    回复此人 感谢
    疯狗 (阅尽天下漏洞,心中自然无码。) | 2014-12-02 17:27

    @asdf 能产生一些价值漏洞不 :)

  12. 12#
    回复此人 感谢
    TellYouThat | 2015-03-30 13:24

    MARK

  13. 13#
    回复此人 感谢
    _Evil (科普是一种公益行为) | 2015-03-30 16:38

    @asdf 大牛我想和你做朋友

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录