AppEngine安全测试思路
安全测试内容主要是检查是否可以未授权进行资源访问、不同应用间的相互影响、应用本身对云平台的安全影响。
1、系统架构
第一步了解appengine的自身架构,了解其各个请求处理流、数据流的过程,尤其关注其中的每个逻辑判断点和实现方式,根据这些特点,了解分析其基础架构和系统模型上的固有弱点。(例如路由用户请求是根据HOST,而HOST本身依赖于用户提交,这里如果使用太过强大的语义分析做解析,就可能存在问题。例如引入lua、yaml等的语言注射)
第二步是了解其用户代码执行环境的沙盒实现方式,是否做到了隔离(fastcgi就是一个理论上没有做到不同用户代码运行在不同进程空间的好例子。可大部分appengine都是这么实现的)?控制点在哪里做的(语言编译器级别?虚拟机级别?语言库级别?控制点方位的不同,就可以结合下文中的语言特性进行绕过)?
2、资源访问
资源访问根据appengine提供的服务不同而不同,通常有以下几类:
文件(一般情况下,本程序目录可读、tmp可读写、其他目录不允许读写)
命令操作(一般不允许)
数据库(一般只允许本应用访问本应用的,不可跨应用访问)
网络资源(一般需要通过代理访问外界,不允许访问内部网络)
API接口(要求强认证,通常OAuth方式)
CPU、内存(这些计算资源主要是用来做统计,并不是做限制,但要有预防措施可以及时防止某应用突发高占用影响其他应用。)
针对这几类资源访问,需要根据策略结合下文所说的语言特性一一复查其是否能够真正做到统一的隔离和最靠近底层原子级别的限制。有可能还检查一下是否有独占资源或抢占资源的问题。
3、语言特性
AppEngine通常支持的不只是一种语言。每种语言根据其本身原理,有着不同的语言特性。我们这里主要关注的语言特性主要是包括一些动态代码执行或加载(eval、imp.load_source)、是否能通过一些特殊操作加载未经授权的代码(内存直接注入)、一些隐性的资源流访问(php的协议支持、部分第三方模块的资源访问、fdopen、xml中的资源文件读取)、隐性的进程线程创建(命令执行、调用外界程序)、隐性的cpu、内存消耗等。很多appengine对一些资源访问的控制手段也是根据语言自身提供的一些特性做出的,因此需要对这每一个特性的可靠性进行检查。(例如PHP disable_function,Java的Security Manager)
4、初始环境
appengine本身是一个沙盒环境,因此会在这个环境中设置一些初始化和为了方便提供的环境设置。而沙盒本身很可能对这些环境就无条件信任并带入关键逻辑了。因此就需要对这一块的检查和可修改性进行检查处理。
另外需要关注一点就是这些关键信息是否可以轻易的被泄露给除开发人员之外的第三方或者最终用户。如果泄露,可能对开发者本身造成影响。
公共库(是否可读写?读可能泄露一些敏感信息和内部实现,写可能导致恶意代码写入到其他应用中执行。)
环境变量(是否可读写?如果可覆盖,是否能够通过覆盖某些关键变量突破沙河限制?)
关键变量传递方式(是否可修改可偷取?)
5、业务相关
对于建立在其中的站点,是否有内容上涉及黄、赌、毒的地方,是否页面中存在挂马、黑链、钓鱼网站等等。这些不在本文的考虑范围内,暂略。