Pysa:Facebook最新开源Python静态分析工具

南笙酒味 提交于 2021-01-14 03:31:50

Python代码静态分析是一个标准化工程必不可少的一个环节,工程在上线之前需要对代码规范、语法问题进行详细的检查,防止问题随着代码发布到生产环境,避免酿成更大的故障。

这一点,在很多大型公司是非常重视的。因此,Python方面的静态检查工具层出不穷,处理经常使用的pylint,还有除此知名公司的一些工具:

  • Google的pytype
  • Microsoft的pyright
  • Facebook的Pyre

虽然这些静态检查工具出自不同公司,但是核心功能如出一辙。都是基于PEP规范,去检查Python代码中的语言风格,判断是否符合编程规范,是否满足Python语法的要求,而对于更深层次的安全问题却从未涉足。

而Facebook最新开源的Pysa则是一款专注于检测和预防Python代码中安全性问题的静态检查工具,本文就来介绍一下这款出自Facebook的Python静态检查工具。

Pysa

Pysa是一个专注于安全性的工具,它是在Facebook之前开源的静态检查工具Pyre的基础上进行开发的。

它主要用于检查代码中的数据流问题,这一点至关重要,因为,许多安全和隐私问题都可以归结为数据流入和流出过程中产生的。

Pysa使用了一些Facebook内部框架进行开发而成,这些框架主要基于隐私策略相关技术来防止用户数据的访问和泄露,这对于一家以社交为主的公司,可以说是非常擅长。

除此之外,Pysa还可以检查常见的web应用安全问题,例如,XSS和SQL注入

Pysa从另外一款静态检查Zoncolan汲取了很多经验,它通过数据流的追踪来检查代码的问题,判断数据是从哪里来,经过了哪些函数的处理,返回到哪个接收参数,来诊断是否有异常。

捕获问题固然重要,但是如果过度的话,就会形成误报,这当然也不是一件好事。毕竟,误报带来的成本和损失也是非常巨大的。

因此,Pysa在避免误报方面也做了很多工具。

Pysa为了避免问题的误报,通过限定追踪数据流的程度、范围已经数据源的量来避免误报。

举个例子,通过如下代码,来加载用户的资料,

# views/user.py
async def get_profile(request: HttpRequest) -> HttpResponse:
profile = load_profile(request.GET['user_id'])
...

# controller/user.py
async def load_profile(user_id: str):
user = load_user(user_id) # Loads a user safely; no SQL injection
pictures = load_pictures(user.id)
...

# model/media.py
async def load_pictures(user_id: str):
query = f"""
SELECT *
FROM pictures
WHERE user_id = {user_id}
"""

result = run_query(query)
...

# model/shared.py
async def run_query(query: str):
connection = create_sql_connection()
result = await connection.execute(query)
...

就上述代码而言,潜在的SQL注入load_pictures是无法利用的,因为该函数只收到调用load_profile函数而产生的user_id有效值。如果配置正确,Pysa可能不会在此处误报问题。

现在,想象一下一个在应用程序控制器层工作的工程师,意识到使用异步,同时获取用户和图片数据会更快地返回结果:

# controller/user.py
async def load_profile(user_id: str):
user, pictures = await asyncio.gather(
load_user(user_id),
load_pictures(user_id) # no longer 'user.id'!
)
...

此更改可能看起来并无大碍,但实际上最终导致将用户控制的user_id字符串直接连接到中的SQL注入问题load_pictures。在入口点和数据库查询之间有很多层的大型应用程序中,这位工程师可能永远不会意识到数据是完全由用户控制的,或者SQL注入问题隐藏在所调用的功能之一中。

但是,这正是Pysa所要做的事情。Pysa可以检测到从用户控制的输入到SQL查询的数据一直在流动,并标记问题。

结语

Pysa是为了安全性问题而开发的一款静态检查工具,但是,并非所有的安全问题都可以被建模,所以,不能期望一款工具能够检测所有的安全性问题。

我个人认为,在开发过程中还是要不断培养自己的责任心和意识,提升自己对客户的敬畏之心,这样在开发过程中才能防止更多形式安全问题的出现。


推荐阅读

微软再出神器,Notebook正在改头换面!

从zero到hero,一款Python自然语言处理效率利器!

AI开发效率倍增!让JupyterLab成为无所不能的开发神器

个人微信

欢迎各位一起讨论、一起学习,共同促进,感兴趣的可以加我个人微信。


本文分享自微信公众号 - 七步编程(CodeSteps)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!