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汲取了很多经验,它通过数据流的追踪来检查代码的问题,判断数据是从哪里来,经过了哪些函数的处理,返回到哪个接收参数,来诊断是否有异常。

python静态分析apk python静态代码分析工具_编程语言

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

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

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

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

# views/user.py
asyncdef get_profile(request: HttpRequest) -> HttpResponse:
   profile = load_profile(request.GET['user_id'])
   ...
 
# controller/user.py
asyncdef 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
asyncdef load_pictures(user_id: str):
   query = f"""
      SELECT *
      FROM pictures
      WHERE user_id = {user_id}
   """
   result = run_query(query)
   ...
 
# model/shared.py
asyncdef run_query(query: str):
   connection = create_sql_connection()
   result = await connection.execute(query)
   ...

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

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

# controller/user.py
asyncdef 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是为了安全性问题而开发的一款静态检查工具,但是,并非所有的安全问题都可以被建模,所以,不能期望一款工具能够检测所有的安全性问题。

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