APISIX 安全评估

news2024/12/24 21:17:52

背景

有大佬已经对 [apisix攻击面](https://ricterz.me/posts/2021-07-05-apache-apisix-attack-
surface-research.txt)做过总结。

本文记录一下自己之前的评估过程。

分析过程

评估哪些模块?

首先我需要知道要评估啥,就像搞渗透时,我得先知道攻击面在哪里。

1655139044-912745-image

根据文档,可以知道apisix项目包括很多系统,包括:* 网关* dashboard* ingress控制器* 各种sdk

sdk即使有漏洞,攻击场景也感觉有限,所以没有评估。

"ingress控制器"需要结合k8s中的网络来做评估,因为时间有限,所以只是粗略看了一下。

我主要看了网关和dashboard两个系统。

1655139086-278505-image

从文档上很容易看出来,网关有三个重要的模块:* 插件* admin api* control api

对于api来说,首先要检查的是"身份认证"和"鉴权"这两个安全措施。

apisix历史漏洞绝大部分都出现在插件中,所以插件属于"漏洞重灾区"。

评估api安全性:身份认证和鉴权

admin api实现如下:* admin api 使用token做认证,token是硬编码的。这个问题已经被提交过漏洞,官方应该不打算修复。* admin api 鉴权上,设计了viewer和非viewer两种角色。viewer角色只允许get方法。

靶场见 [Apache APISIX
默认密钥漏洞(CVE-2020-13945)](https://github.com/vulhub/vulhub/blob/master/apisix/CVE-2020-13945/README.zh-
cn.md)

control api是没有身份认证的,但是有两个点限制了攻击:* 默认它只在本地监听端口* 插件无关的control api只有"读信息"的功能,没有发现啥风险点

插件创建的control api是一个潜在的攻击面,不过我没找到啥漏洞。

评估插件安全性

因为插件默认都是不开启的,所以虽然它是重灾区,但是我并没有投入过多精力去审计。

不过在这里确实发现了一个安全问题,报告给官方后,分配了[CVE-2022-25757](https://www.openwall.com/lists/oss-
security/2022/03/28/2)。

下面来说一下这个安全问题。

CVE-2022-25757

这个安全问题是什么?

request-validation插件可以检查HTTP请求头和BODY内容,当不符合用户配置的规则时,请求就不会转发到上游。

比如用户按照如下规则配置时,body_schema限制请求中必须要有string_payload参数,并且是字符串类型,长度在1到32字节之间。curl http://127.0.0.1:9080/apisix/admin/routes/10 -H ‘X-API-KEY: edd1c9f034335f136f87ad84b625c8f1’ -X PUT -d ‘{“uri”: “/10”,“plugins”: {“request-validation”: {“body_schema”: {“type”: “object”,“required”: [“string_payload”],“properties”: {“string_payload”: {“type”: “string”,“minLength”: 1,“maxLength”: 32}}}}},“upstream”: {“type”: “roundrobin”,“nodes”: {“192.168.2.189:8888”: 1}}}’

但是恶意用户发送如下请求时,有可能绕过限制POST http://127.0.0.1:9080/10…{“string_payload”:“”,“string_payload”:“1111”}

为什么会绕过限制?

request-
validation.lua中使用cjson.safe库解析字符串为json对象,对于带有"重复键值"的json,它会取最后面的值。比如{"string_payload":"","string_payload":"1111"},request-
validation插件会认为string_payload=“1111”。local _M = {version = 0.1,decode = require(“cjson.safe”).decode,}

但是有很多流行的库,对于带有"重复键值"的json,它会取最前面的值,因此{"string_payload":"","string_payload":"1111"}会被认为string_payload=“”。

因此request-validation插件和上游服务在解析json时可能存在差异性,所以会导致限制被绕过

哪些库和request-validation插件在解析"重复键值json"时存在差异?

根据 <https://bishopfox.com/blog/json-interoperability-
vulnerabilities>文章,可以知道最起码以下库和request-validation插件在解析"重复键值json"时存在差异。

154656153-4b9c253b-e1af-47c3-9dfb-1fe40a922c3f

选取其中的gojay库做了验证,程序打印gojay而不是gojay2package mainimport "github.com/francoispqt/gojay"​type user struct {id intname stringemail string}// implement gojay.UnmarshalerJSONObjectfunc (u *user) UnmarshalJSONObject(dec *gojay.Decoder, key string) error {switch key {case “id”:return dec.Int(&u.id)case “name”:return dec.String(&u.name)case “email”:return dec.String(&u.email)}return nil}func (u *user) NKeys() int {return 3}​func main() {u := &user{}d := []byte({"id":1,"name":"gojay","email":"gojay@email.com"},"name":"gojay2")err := gojay.UnmarshalJSONObject(d, u)if err != nil {//log.Fatal(err)}println(u.name);// 取最前面的key的值,也就是gojay,而不是gojay2}

总结

评估思路比较简单:* 识别攻击面* api关注身份认证和鉴权* 插件关注业务逻辑

openresty配置中的api也是攻击面,下一篇再写。

说一个题外话:apisix的插件机制提供了很好的扩展能力,再加上openresty的高性能,或许拿来做waf架构很合适。

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【点下方卡片】免费领取:

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

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

相关文章

【三维重建】【深度学习】Windows10下NeRS官方代码Pytorch实现

【三维重建】【深度学习】Windows10下NeRS官方代码Pytorch实现 提示:最近开始在【三维重建】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【三维重建】【深度学习】Windows10下NeRS官方代码Pytorch实现前言NeRS模型运行下载源码并安装环境安装…

体制内裸辞,她用云端地球实现了自己的乡村梦

追逐田园的“诗与远方” “我最初的梦想&#xff0c;就是有一个亲手打造的、能装进个人喜好的小院子。”为完成自己的梦想&#xff0c;吕春萍毅然放弃了体制内的工作&#xff0c;来到秦岭脚下的桥南镇曹峪村&#xff0c;践行自己的“乡村梦”。 起初&#xff0c;吕春萍做了五…

「开源项目」开源企业级问答系统-Danswer

danswer 基本介绍 开源企业级问答系统&#xff0c;可以对内部文档进行自然语言提问&#xff0c;并返回可靠的答案、引用和参考资料&#xff0c;可以连接到多种常见工具&#xff0c;如Slack、GitHub和Confluence。 在线预览 暂无在线预览地址&#xff0c;不过可以自行部署使用…

【error】svn 清理以下路径失败 原始内容不存在

前言 目前我们这边的内网代码是通过 TortoiseSVN 进行版本管理的&#xff0c;平时用着也挺好的&#xff0c;没碰到什么大问题。 但是&#xff0c;今天碰到了一个比较棘手的问题&#xff0c;在这里做一下记录&#xff0c;以方便自己和有需要的朋友在之后碰到该类问题时有个参考…

[php-cos]ThinkPHP项目集成腾讯云储存对象COS

Cos技术文档 1、安装phpSdk 通过composer的方式安装。 1.1 在composer.json中添加 qcloud/cos-sdk-v5: >2.0 "require": {"php": ">7.2.5","topthink/framework": "^6.1.0","topthink/think-orm": "…

为什么中小企业数字化转型这么难?_光点科技

随着科技的飞速发展和数字化时代的到来&#xff0c;数字化转型已成为现代企业发展的必然趋势。大型企业普遍拥有雄厚的资源和资金&#xff0c;能够较为顺利地进行数字化转型。然而&#xff0c;对于中小企业来说&#xff0c;数字化转型却面临着诸多挑战和困难。 资金限制&#x…

5个步骤完成Linux 搭建Jdk1.8环境

1&#xff1a;首先&#xff0c;在Linux系统中创建一个目录&#xff0c;用于存放JDK文件。可以选择在/opt目录下创建一个新的文件夹&#xff0c;例如/opt/jdk。 sudo mkdir /opt/jdk 2&#xff1a;将下载的jdk-8u381-linux-x64.tar.gz文件复制到新创建的目录中。 sudo cp jdk…

如何理解token?

token在项目中的大概流程&#xff1a; 1.客户端使用用户名和密码请求登录 2.服务端收到请求&#xff0c;验证用户名和密码 3.验证成功后&#xff0c;服务端会生成一个token&#xff0c;然后把这个token发送给客户端 4.客户端收到token后把它存储起来&#xff0c;可以放在cookie…

汇编调用C语言定义的全局变量

在threadx移植中&#xff0c;系统的systick通过了宏定义的方式定义&#xff0c;很难对接库函数的时钟频率&#xff0c;不太利于进行维护 所以在C文件中自己定义了一个systick_Div的变量&#xff0c;通过宏定义方式设定systick的时钟频率 在汇编下要加载这个systick分频系数 …

扬州市 自动挡C2 道路驾驶技能考试 电子路要点

先上车把身份证给安全员&#xff0c;验证身份&#xff0c;然后下车逆时针绕车一周&#xff0c;在车头前站立三秒拍照&#xff0c;然后上车 科三基本注意事项 起步不管要不要变道&#xff0c;都必须先打左转向灯&#xff0c;但是也要记得关灯 操作顺序&#xff1a;打左转向灯、…

flutter:BottomNavigationBar和TabBar

区别 BottomNavigationBarr和TabBar都是用于创建导航栏的组件&#xff0c;但它们有一些区别。 位置不同&#xff1a;BottomNavigationBar通常位于屏幕底部&#xff0c;用于主要导航&#xff1b;而TabBar通常位于屏幕顶部或底部&#xff0c;用于切换不同的视图或页面。 样式不…

【2023】java数据结构-时间、空间复杂度分析

1、算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一个算法所需要的额外空间 2、…

基于Flask+Mongodb的网络文章系统

在这个软件&#xff0c;你可以编辑文章&#xff0c;管理数据。 注册登录

使用dockerfile来配置lnmp并运行wordpress以及镜像缩小体积

docker dockerfile创建镜像1.创建工作目录2.将各项安装包放入到对应的目录中3.在centos目录中用dockerfile创建centos&#xff1a;jiang镜像用来准备依赖包4.创建依赖包镜像5.创建docker1网段6.在centos&#xff1a;jiang依赖包镜像的前提下创建lnmp各个镜像进入各个目录编辑Do…

python+monkey+ 监控 crash,性能统计

目录 前言&#xff1a; monkey 压力测试 android monkey.ini 配置文件 代码分析 前言&#xff1a; 在软件开发中&#xff0c;测试和监控是非常重要的一个环节&#xff0c;它可以帮助我们更加全面地检测软件中的安全漏洞和风险。Python 是一种常用的脚本语言&#xff0c;可以…

软考高项(五)信息系统工程 ★重点集萃★

&#x1f451; 个人主页 &#x1f451; &#xff1a;&#x1f61c;&#x1f61c;&#x1f61c;Fish_Vast&#x1f61c;&#x1f61c;&#x1f61c; &#x1f41d; 个人格言 &#x1f41d; &#xff1a;&#x1f9d0;&#x1f9d0;&#x1f9d0;说到做到&#xff0c;言出必行&am…

【Python学习笔记】:whl安装地址教程链接存档

装Sklearn包的时候遇到了莫名其妙的问题&#xff0c;最后发现是少了whl文件&#xff0c;经过多方搜索找到一些比较靠谱的教程帖子&#xff1a; whl文件下载网站&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/ 无需翻墙 知乎上很全面的安装教程&#xff1a;https://z…

接口用例如何写?接口测试用例设计方法(详解)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口常遇见的b…

【TiDB理论知识 07】SQL执行流程

一 DML语句读写流程 1 DML语句读流程概要 用户发出SQL 被协议层接收 Protocal Layer 通过PD获取时间戳 parse模块 解析SQL&#xff0c;通过词法解析 与 语法解析 生成AST语法树 编译SQL Compile模块 ,区分点查 与 非点查&#xff0c;生成执行计划 发送给Executor,从TIKV获…

【尚硅谷】索引优化分析

目录 1. 常用指令查使用引擎的指令 sql 优化合并去重分页显示模糊查询 索引优化单表优化两表优化 1. 常用指令 常用指令&#xff1a; 查询日志&#xff1a;默认关闭&#xff0c;记录查询的sql语句&#xff08;比如慢查询&#xff0c;大于多少秒的都记录&#xff09;&#xff0…