Python 是现代大数据/机器学习的重要基础,但是 Python 包含超过 30 万行 C 代码,含有很多安全漏洞和隐患,在高安全高可靠性场景下面临着严重的安全威胁。MesaPy 是一个内存安全的 Python 实现,基于 PyPy 并继承了 PyPy 显著的特点:卓越的运行速度(得益于 JIT 编译器)、高效的内存使用率、良好的兼容性、以及强大的并发处理(支持stackless 协程)。除此之外,MesaPy 专注于安全,通过 1. 使用内存安全语言重写外部库、2. 加强 RPython 类型系统保障内存安全、3. 形式化验证保障内部 C 代码的内存安全等方法,全面提升 Python 解释器的安全性,避免内存问题引发的高危安全漏洞。基于这些安全特性,MesaPy 也支持运行在 Intel SGX 中,开发者可以使用 Python 轻松地开发 SGX 应用,运行于可信运行环境中。
MesaPy 四大安全特性
MesaPy 拥有内存安全、安全增强、形式化验证、SGX 支持四大安全特性,以下是详细介绍:
• 内存安全: 因为 MesaPy 基于由 RPython 实现的 PyPy,相比CPython,多数内置的 Python 库都具有相对安全的运行时。但是 PyPy 仍然依赖由非内存安全的 C 编写的外部库,这些外部库会引入潜在的内存安全问题。为了解决这些外部依赖中隐藏的内存安全问题,我们使用内存安全语言 Rust 重写了外部依赖库。同时,我们努力兼容原有的 API,确保开发者无需修改或少量修改,就可以无缝的享受 Rust 带来的内存安全保证。
• 安全增强:MesaPy 解释器由 RPython 语言实现,RPython 与 Python 语法类似,但是为强类型语言(通过 RPython 翻译器翻译为后端中间代码后编译执行)。其中 RPython 的 list 类型没有运行时数组越界的检查,这会导致使用中出现内存问题。我们通过修改 RPython 的 list 类型,使其可以运行时动态检查数组访问越界,保证数组访问的内存安全。
• 形式化验证:MesaPy 项目中的 Python 解释器不可避免的使用了 C 代码,为了保证这些代码的安全性,我们使用多款形式化验证工具对其进行内存安全属性的验证。其中包括缓冲区溢出(buffer overflow, buffer over-read),空指针解引用(nullpointer dereference)以及内存泄漏(memory leakage) 问题。现阶段,我们通过使用形式化验证的方法,验证 RPython 的翻译器本身,JIT 编译器后端,以及 RPython library 中部分的 C 代码。现在验证还在进行中,感兴趣的朋友可以根据文档尝试验证相关函数,帮助我们完善 MesaPy 的形式化验证。验证所需的 mock 函数,验证脚本,以及验证初步结果都已在开源代码中。
• SGX 支持:在以上三点安全保证的基础之上,MesaPy 也同样支持 Intel SGX(一个可信的执行环境)。我们通过对 MesaPy 的精简和对 Python 内置库的改造,使开发者能够使用 Python 写出运行在 SGX 里的应用。MesaPy 对于SGX 的支持不仅加速了 SGX 应用的开发效率,同时也能保证运行在可信执行环境中应用的内存安全。针对 SGX 的支持还在开发当中,我们已经拥有一个可在 SGX 里执行的 Python 解释器,对于常用库的移植工作仍在进行,敬请期待后续更新。
MesaPy 项目仍在进行中,以上安全特性正在不断优化,代码都已开源在 GiHub,我们希望与开源社区共同构建 MesaPy 的未来。对于 MesaPy 更多的介绍,包括功能、路线图、安全特性的详细介绍等相见:
• GitHub 开源项目地址:
https://github.com/mesalock-linux/mesapy
• 官方文档:
https://docs.mesapy.org
系统架构
MesaPy 增强了 PyPy 的安全性,相比 CPython(也就是我们经常提到的 Python),整体安全性有了本质的提升,MesaPy 的系统架构可以通过下面这张图概括。图中描述了如何构建一个面向内存安全的 Python 实现,红色部分表示非内存安全模块,蓝色部分表示内存安全模块。MesaPy通过多种方式完善 Python 中非内存安全的部分。
首先,CPython 的主要模块 Python 解释器和 Python Modules 都是由非内存安全代码 C 编写(大约有 30 万行代码),如此庞大的代码量非常容易引入内存安全漏洞。可以查看 CPython 相关的安全漏洞,大部分都是由缓冲区溢出这类内存安全问题造成的(参考链接:https://www.cvedetails.com/vulnerability-list/vendorid-10210/productid-18230/Python-Python.html)。
其次,PyPy 使用 RPython 重写了 Python 解释器和库,这大大缓解了 CPython 带来的内存安全问题。但是,PyPy 仍存在三个存在内存安全问题的薄弱点:1. 部分的 RPython 翻译器,JIT编译器库是由 C 编写(大约一千行);2. RPython 的 list 类型没有运行时数组越界检查(参考链接:https://rpython.readthedocs.io/en/latest/rpython.html#exception-rules);3. 部分 RPython 提供给PyPy 使用的第三方库是有 C 编写的。
MesaPy 通过形式化验证、RPython 类型安全增强、使用内存安全语言重写非安全库等方式弥补了 PyPy 潜在的安全问题,努力提供完整的内存安全保证。
性能测试
我们选取了 19 个 Python 的性能测试点针对 MesaPy、PyPy 和 Python 2.7 分别进行测试,其性能测试结果如图。横轴表示 19 个性能测试点的测试脚本名称,纵轴表示测试点运行时间相比 baseline(Python 2.7.12) 性能的 speedup(取运行10 次的平均值,对数坐标系,测试机器为 Intel Core i7-8086K CPU, 32G RAM),蓝色为 MesaPy 的测试结果,黑色为 PyPy 的测试结果。
如上图展示,MesaPy 与 PyPy 的性能相当,相比 Python 2.7 有大幅度的提升。多数测试结果都有 10x 左右的性能提升,在某些测试点中(比如 gcbench.py和 spectral_norm)会有 30x 的性能提升。如此显著的性能提升得益于 JIT 编译器以及高效的内存垃圾回收机制。
用于性能测试的测试脚本已经开源在 GitHub:https://github.com/mesalock-linux/mesapy-benchmarks,更多更详细的性能对比数据也可以参考 PyPy Speed Center: http://speed.pypy.org/
如何使用 MesaPy
MesaPy 可以在多种场景下使用,如运行大数据计算、训练机器学习模型等。我们提供多种渠道下载使用 MesaPy:
1. 下载预编译的MesaPy 包使用 MesaPy
2. 使用 Docker体验 MesaPy
3. 从源代码编译MesaPy
MesaPy 在 GitHub 的 README 上提供了详细编译步骤,详见:https://github.com/mesalock-linux/mesapy
加入 MesaPy 项目
MesaPy 项目及其子项目选择使用 BSD 开源协议下开源。BSD 开源协议是一个给于使用者很大自由的协议,我们希望有更多的人来使用 MesaPy,提升 Python 语言生态的安全。同时,安全生态的可持续发展也离不开开源社区、工业界、学术界的共同参与,我们非常欢迎大家的贡献和支持。支持 MesaPy 的途径有很多,例如:
• 尝试使用MesaPy,给我们反馈使用感受和改进的建议等
• 参与贡献MesaPy 的开发流程、完善文档、帮助解答常见问题等
• MesaPy 对于第三方库的支持的工作还在进行中,我们希望社区的支持,尝试把内存安全语言编写的第三方库移植到 MesaPy 中
• MesaPy 的形式化验证工作仍在进行中,我们开源了验证手段和现阶段结果,希望社区可以参与进来,与我们一起使用形式化验证方法和工具验证 MesaPy 中的“非安全”组件
• 帮助提高MesaPy 对于 SGX 的支持,比如把 normalworld 中常用库移植到 SGX 中
如果你对于 MesaPy 感兴趣,我们提供了详细的文档帮助你了解 MesaPy 的设计和代码结构。同时也可以参与社区讨论,通过提交 issue,pull request 等方式和我们交流。
参考链接:
• MesaPy: https://github.com/mesalock-linux/mesapy
• PyPy Speed Center: http://speed.pypy.org/
• RPython Language (Exception rules): https://rpython.readthedocs.io/en/latest/rpython.html#exception-rules
*点击阅读原文进入MesaPy项目主页